Koskamo

Moddable Games Tools MCP

An official MCP server providing 89 AI-callable tools for board game analysis, including chess variant analysis, hex map generation, piece gallery browsing, rules lookup, and various game utilities like dice rolling and drafting assistance.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Moddable Games Tools MCP logo, by Moddable.GamesVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Moddable.Games
MCP endpoint (Streamable HTTP)
https://tools.moddable.games/mcp
Vendor documentation

What its tools do

89 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

89 of 89 have a description · 0 of 89 declare behavior hints · 69 of 78 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to tools.moddable.games ·
  • Passed Endpoint is on the registry namespace domain ·
  • Warning Advertises resources/templates/list but does not implement it
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Analyze chess variants and legal moves
  • Generate hex maps and pathfinding
  • Look up game rules and variants
  • Roll dice and manage game states

Source and maintenance

Vendor evidenceRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
moddable-tools 0.1.0
MCP protocol negotiated in check
2025-03-26
Tools
89 advertised
Resources
4 advertised
Resource templates
Not advertised
Prompts
3 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false
  }
}

Tools

89 advertised

chess_generate_puzzle
Advertised by the server during the last successful anonymous check.

Get a random chess puzzle. Filter by variant, difficulty or theme. Not every variant puzzle carries themes; use chess_list_puzzle_types to see what the pool holds.

chess_generate_puzzle input schema
{
  "type": "object",
  "properties": {
    "theme": {
      "type": "string",
      "description": "Puzzle theme (fork, pin, skewer, mateIn2, etc). Not every variant puzzle carries themes."
    },
    "variant": {
      "type": "string",
      "description": "Chess variant play slug (e.g. almost-chess, benedict, fischer-random, king-of-the-hill, standard); a manifest key such as chess960 is also accepted. Returns only puzzles for this variant."
    },
    "difficulty": {
      "enum": [
        "easy",
        "medium",
        "hard"
      ],
      "type": "string",
      "description": "Puzzle difficulty by rating: easy under 1200, medium 1200-1799, hard 1800 and above"
    }
  }
}
chess_list_puzzle_types
Advertised by the server during the last successful anonymous check.

List available puzzle variants, themes, and per-variant counts from the puzzle pool

chess_list_puzzle_types input schema
{
  "type": "object",
  "properties": {}
}
chess_list_variants
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_list_variants] List chess variants. Removal: v1.0.0.

chess_list_variants input schema
{
  "type": "object",
  "properties": {
    "group": {
      "type": "string"
    }
  }
}
chess_get_legal_moves
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_create_game + play_get_moves] Get legal moves for a chess position. Removal: v1.0.0.

chess_get_legal_moves input schema
{
  "type": "object",
  "properties": {
    "variant": {
      "type": "string"
    }
  }
}
chess_analyze_position
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_suggest_move] Analyse a chess position. Removal: v1.0.0.

chess_analyze_position input schema
{
  "type": "object",
  "properties": {
    "depth": {
      "type": "number"
    },
    "variant": {
      "type": "string"
    }
  }
}
chess_make_move
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_apply_move] Apply a move to a chess game. Removal: v1.0.0.

chess_make_move input schema
{
  "type": "object",
  "required": [
    "move"
  ],
  "properties": {
    "move": {
      "type": "object"
    },
    "variant": {
      "type": "string"
    }
  }
}
chess_validate_move
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_validate_move] Check if a chess move is legal. Removal: v1.0.0.

chess_validate_move input schema
{
  "type": "object",
  "required": [
    "move"
  ],
  "properties": {
    "move": {
      "type": "object"
    },
    "variant": {
      "type": "string"
    }
  }
}
chess_get_status
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_check_status] Get chess game status. Removal: v1.0.0.

chess_get_status input schema
{
  "type": "object",
  "properties": {
    "variant": {
      "type": "string"
    }
  }
}
chess_render_svg
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_render_board] Render a chess position as SVG. Removal: v1.0.0.

chess_render_svg input schema
{
  "type": "object",
  "properties": {
    "fen": {
      "type": "string",
      "description": "FEN position string"
    },
    "variant": {
      "type": "string"
    },
    "highlights": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Squares to highlight (e.g. [\"e2\",\"e4\"])"
    }
  }
}
chess_make_moves
Advertised by the server during the last successful anonymous check.

[DEPRECATED — use play_make_moves] Apply a sequence of chess moves. Removal: v1.0.0.

chess_make_moves input schema
{
  "type": "object",
  "required": [
    "moves"
  ],
  "properties": {
    "moves": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "variant": {
      "type": "string"
    }
  }
}
chess_get_opening_book
Advertised by the server during the last successful anonymous check.

[REMOVED — engine#98] Opening book resolution is broken in Worker context. No replacement.

chess_get_opening_book input schema
{
  "type": "object",
  "properties": {
    "variant": {
      "type": "string"
    }
  }
}
hex_list_games
Advertised by the server during the last successful anonymous check.

List all available hex map game types with configuration options

hex_list_games input schema
{
  "type": "object",
  "properties": {}
}
hex_generate_map
Advertised by the server during the last successful anonymous check.

Generate a hex map for a specific game and player count

hex_generate_map input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game type (nukes, colony, catan, age-of-steam, eclipse, twilight-imperium)"
    },
    "seed": {
      "type": "string",
      "description": "Random seed for reproducibility"
    },
    "size": {
      "type": "number",
      "description": "Map size (default: game default)"
    },
    "players": {
      "type": "number",
      "description": "Number of players (default: 2)"
    }
  }
}
hex_export_svg
Advertised by the server during the last successful anonymous check.

Generate a hex map and export as SVG

hex_export_svg input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game type"
    },
    "seed": {
      "type": "string",
      "description": "Random seed"
    },
    "size": {
      "type": "number",
      "description": "Map size"
    },
    "style": {
      "type": "string",
      "description": "Visual style"
    },
    "hexSize": {
      "type": "number",
      "description": "Hex size in pixels (default: 30)"
    },
    "players": {
      "type": "number",
      "description": "Number of players"
    }
  }
}
hex_get_info
Advertised by the server during the last successful anonymous check.

Get info about a specific hex coordinate (terrain, neighbours, distance)

hex_get_info input schema
{
  "type": "object",
  "required": [
    "q",
    "r"
  ],
  "properties": {
    "q": {
      "type": "number",
      "description": "Hex Q coordinate (column)"
    },
    "r": {
      "type": "number",
      "description": "Hex R coordinate (row)"
    },
    "game": {
      "type": "string",
      "description": "Game context for terrain lookup"
    },
    "seed": {
      "type": "string",
      "description": "Map seed (to look up terrain from a generated map)"
    }
  }
}
hex_compute_fov
Advertised by the server during the last successful anonymous check.

Compute field of view from a hex position

hex_compute_fov input schema
{
  "type": "object",
  "required": [
    "q",
    "r",
    "range"
  ],
  "properties": {
    "q": {
      "type": "number",
      "description": "Origin Q coordinate"
    },
    "r": {
      "type": "number",
      "description": "Origin R coordinate"
    },
    "game": {
      "type": "string",
      "description": "Game context for obstacle lookup"
    },
    "seed": {
      "type": "string",
      "description": "Map seed"
    },
    "range": {
      "type": "number",
      "description": "Vision range in hexes"
    }
  }
}
hex_pathfind
Advertised by the server during the last successful anonymous check.

Find shortest path between two hex coordinates

hex_pathfind input schema
{
  "type": "object",
  "required": [
    "startQ",
    "startR",
    "endQ",
    "endR"
  ],
  "properties": {
    "endQ": {
      "type": "number",
      "description": "End Q"
    },
    "endR": {
      "type": "number",
      "description": "End R"
    },
    "game": {
      "type": "string",
      "description": "Game context for movement costs"
    },
    "seed": {
      "type": "string",
      "description": "Map seed"
    },
    "startQ": {
      "type": "number",
      "description": "Start Q"
    },
    "startR": {
      "type": "number",
      "description": "Start R"
    }
  }
}
play_list_families
Advertised by the server during the last successful anonymous check.

List all playable game families supported by the engine (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl)

play_list_families input schema
{
  "type": "object",
  "properties": {}
}
play_list_variants
Advertised by the server during the last successful anonymous check.

List available variants for a game family. Each variant can be passed to play_create_game. Variants with flags (e.g. +random) can be requested as "slug+flag".

play_list_variants input schema
{
  "type": "object",
  "required": [
    "family"
  ],
  "properties": {
    "family": {
      "type": "string",
      "description": "Game family (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl)"
    }
  }
}
play_get_definition
Advertised by the server during the last successful anonymous check.

Get the full engine definition (topology, render config, pieces, setup FEN) for a game variant. Returns the resolved frontmatter used to render and play the game.

play_get_definition input schema
{
  "type": "object",
  "required": [
    "family"
  ],
  "properties": {
    "family": {
      "type": "string",
      "description": "Game family (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl)"
    },
    "variant": {
      "type": "string",
      "description": "Variant slug (default: the family's default game)"
    }
  }
}
play_create_game
Advertised by the server during the last successful anonymous check.

Create a new game instance for a given family. Returns initial state to pass to subsequent calls. Variant can include flags like "grand+random" or "standard+drops".

play_create_game input schema
{
  "type": "object",
  "required": [
    "family"
  ],
  "properties": {
    "family": {
      "type": "string",
      "description": "Game family name (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl)"
    },
    "rngSeed": {
      "type": "number",
      "description": "Optional RNG seed for deterministic games"
    },
    "variant": {
      "type": "string",
      "description": "Variant slug, optionally with flags (e.g. \"grand\", \"grand+random\", \"standard+drops\")"
    }
  }
}
play_get_moves
Advertised by the server during the last successful anonymous check.

Get all legal moves for the current position. Requires state from play_create_game or play_apply_move.

play_get_moves input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "object",
      "description": "Game state object returned by play_create_game or play_apply_move"
    }
  }
}
play_apply_move
Advertised by the server during the last successful anonymous check.

Apply a move to the game and return the new state. Pass the move object exactly as returned by play_get_moves (format varies by family: chess uses {from,to}, go uses {coord} or {action:"pass"}).

play_apply_move input schema
{
  "type": "object",
  "required": [
    "state",
    "move"
  ],
  "properties": {
    "move": {
      "type": "object",
      "description": "Move object from play_get_moves (e.g. {from:\"e2\",to:\"e4\"} for chess, {coord:40} for go, {action:\"pass\"})"
    },
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or a previous play_apply_move"
    }
  }
}
play_check_status
Advertised by the server during the last successful anonymous check.

Check the current game status: whose turn it is, whether the game is over, and who won.

play_check_status input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    }
  }
}
play_suggest_move
Advertised by the server during the last successful anonymous check.

Use AI to analyse the position and suggest the best move. Supports 5 difficulty levels across all 30 playable families.

play_suggest_move input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    },
    "difficulty": {
      "enum": [
        "beginner",
        "easy",
        "medium",
        "hard",
        "expert"
      ],
      "type": "string",
      "description": "AI difficulty level (default: medium)"
    }
  }
}
play_render_board
Advertised by the server during the last successful anonymous check.

Render the current board position as SVG for any playable family (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl).

play_render_board input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "size": {
      "type": "integer",
      "description": "Board width in pixels for PNG output (default: 480, max: 2048)"
    },
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    },
    "highlights": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "key": {
            "type": "integer"
          },
          "color": {
            "type": "string"
          }
        }
      },
      "description": "Optional cells to highlight (e.g. [{key: 52, color: \"#ff0\"}])"
    }
  }
}
play_export_fen
Advertised by the server during the last successful anonymous check.

Export the current board position as a FEN-style setup string, in the form the variant's own frontmatter declares its starting position. Card, tile and dice games have no board position to export.

play_export_fen input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    }
  }
}
play_load_fen
Advertised by the server during the last successful anonymous check.

Create a game from a FEN-style setup string, as returned by play_export_fen. Pass the same variant the position was exported from.

play_load_fen input schema
{
  "type": "object",
  "required": [
    "family",
    "fen"
  ],
  "properties": {
    "fen": {
      "type": "string",
      "description": "Position string in FEN-style notation for the family"
    },
    "family": {
      "type": "string",
      "description": "Game family (chess, draughts, go, reversi, shogi, xiangqi, mancala, morris, hex, landlords-game, backgammon, standard-52, bavarian-32, flower-48, double-six-dominoes, mahjong, standard-dice, agon, asalto, chaupar, dou-shou-qi, fanorona, halma, nyout, pachisi, royal-ur, senet, stern-halma, surakarta, tafl)"
    },
    "variant": {
      "type": "string",
      "description": "Optional variant slug (default: the family's default game)"
    }
  }
}
play_validate_move
Advertised by the server during the last successful anonymous check.

Check whether a move is legal in the current position without applying it. Pass the move object in the same format as play_get_moves returns.

play_validate_move input schema
{
  "type": "object",
  "required": [
    "state",
    "move"
  ],
  "properties": {
    "move": {
      "type": "object",
      "description": "Move object to validate (same format as play_get_moves output)"
    },
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    }
  }
}
play_make_moves
Advertised by the server during the last successful anonymous check.

Apply a sequence of moves to a game and return the final state. Stops at the first illegal move. Move objects must match play_get_moves format.

play_make_moves input schema
{
  "type": "object",
  "required": [
    "state",
    "moves"
  ],
  "properties": {
    "moves": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Array of move objects in the format returned by play_get_moves"
    },
    "state": {
      "type": "object",
      "description": "Game state object from play_create_game or play_apply_move"
    }
  }
}
rules_list_games
Advertised by the server during the last successful anonymous check.

List all available game rulebooks with metadata (players, duration, complexity, mechanics). Filterable by type, complexity, and mechanics.

rules_list_games input schema
{
  "type": "object",
  "properties": {
    "status": {
      "enum": [
        "live",
        "alpha",
        "playtest"
      ],
      "type": "string",
      "description": "Filter by status (default: all)"
    },
    "category": {
      "type": "string",
      "description": "Filter by type (standalone, hub, classic, rpg, component, platform, mod, game)"
    },
    "mechanic": {
      "type": "string",
      "description": "Filter by mechanic (e.g. dice, capture, hex, oracle, narrative)"
    },
    "complexity": {
      "enum": [
        "simple",
        "moderate",
        "complex"
      ],
      "type": "string",
      "description": "Filter by complexity level"
    }
  }
}
rules_get_game
Advertised by the server during the last successful anonymous check.

Get full rulebook content for a specific game (markdown). For metadata only, use rules_get_game_meta instead.

rules_get_game input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game slug (e.g. chess, dnd-5e, catan)"
    }
  }
}
rules_get_game_meta
Advertised by the server during the last successful anonymous check.

Get structured metadata for a game: players, duration, complexity, mechanics, how_to_play, variant list, page list, related games. Lightweight alternative to fetching the full rulebook.

rules_get_game_meta input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game slug (e.g. chess, backgammon, cairn)"
    }
  }
}
rules_get_page
Advertised by the server during the last successful anonymous check.

Get a specific page/section from a game rulebook (e.g. character creation, combat rules, marketplace). Use rules_get_game_meta to see available pages.

rules_get_page input schema
{
  "type": "object",
  "required": [
    "game",
    "page"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game slug (e.g. cairn, dnd-5e)"
    },
    "page": {
      "type": "string",
      "description": "Page slug (e.g. character-creation, combat-and-difficulty)"
    },
    "section": {
      "type": "string",
      "description": "Section name (e.g. rules, classes, spells). Default: rules"
    }
  }
}
rules_get_variant_list
Advertised by the server during the last successful anonymous check.

List all variants for a game with structured metadata (players, board, playable status, topology, engine config). Much richer than parsing the rulebook.

rules_get_variant_list input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game slug (e.g. chess, backgammon, draughts)"
    },
    "playable": {
      "type": "boolean",
      "description": "Filter to only engine-playable variants"
    },
    "topology": {
      "type": "string",
      "description": "Filter by board topology (grid, hex, track, graph, tableau)"
    }
  }
}
rules_get_diagram
Advertised by the server during the last successful anonymous check.

Get board diagram SVG URL for a game variant. Returns the diagram path, topology, and rendering metadata.

rules_get_diagram input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game family slug (e.g. chess, go, agon)"
    },
    "variant": {
      "type": "string",
      "description": "Variant slug (default: standard)"
    }
  }
}
rules_get_variant
Advertised by the server during the last successful anonymous check.

Get rules for a specific game variant

rules_get_variant input schema
{
  "type": "object",
  "required": [
    "game",
    "variant"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game slug"
    },
    "variant": {
      "type": "string",
      "description": "Variant slug"
    }
  }
}
rules_search
Advertised by the server during the last successful anonymous check.

Full-text search across all published rulebooks. Returns section-typed results with deep-link anchors.

rules_search input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Limit to specific game slug"
    },
    "limit": {
      "type": "number",
      "description": "Max results (default 10)"
    },
    "query": {
      "type": "string",
      "description": "Search query"
    },
    "sectionType": {
      "type": "string",
      "description": "Filter by section type (general, board, pieces, setup, movement, capture, winning, special, variants)"
    }
  }
}
rules_random
Advertised by the server during the last successful anonymous check.

Get a random game suggestion from the library

rules_random input schema
{
  "type": "object",
  "properties": {
    "players": {
      "type": "number",
      "description": "Number of players available"
    },
    "maxDuration": {
      "type": "number",
      "description": "Maximum game duration in minutes"
    }
  }
}
board_gallery_search
Advertised by the server during the last successful anonymous check.

Search the board gallery (335 rendered board layouts across 34 game families)

board_gallery_search input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max results (default 10)"
    },
    "query": {
      "type": "string",
      "description": "Search term (e.g. \"8x8\", \"hex\", \"shogi\")"
    }
  }
}
board_gallery_get
Advertised by the server during the last successful anonymous check.

Get details of a specific board layout by ID

board_gallery_get input schema
{
  "type": "object",
  "required": [
    "board"
  ],
  "properties": {
    "board": {
      "type": "string",
      "description": "Board ID or name"
    }
  }
}
tile_gallery_search
Advertised by the server during the last successful anonymous check.

Search hex tile sets by name, game, or terrain type

tile_gallery_search input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Search term (omit to list all)"
    }
  }
}
tile_gallery_get
Advertised by the server during the last successful anonymous check.

Get details of a specific tile set with all tile types

tile_gallery_get input schema
{
  "type": "object",
  "required": [
    "set"
  ],
  "properties": {
    "set": {
      "type": "string",
      "description": "Tile set ID or name"
    }
  }
}
tile_gallery_stats
Advertised by the server during the last successful anonymous check.

Get statistics about available tile sets

tile_gallery_stats input schema
{
  "type": "object",
  "properties": {}
}
board_gallery_stats
Advertised by the server during the last successful anonymous check.

Get statistics about the board gallery (total boards, families, topologies)

board_gallery_stats input schema
{
  "type": "object",
  "properties": {}
}
piece_gallery_search
Advertised by the server during the last successful anonymous check.

Search the piece set gallery by name, style, or game type

piece_gallery_search input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max results (default 10)"
    },
    "query": {
      "type": "string",
      "description": "Search term (e.g. \"staunton\", \"pixel\", \"shogi\")"
    },
    "family": {
      "type": "string",
      "description": "Filter by game family (chess, shogi, xiangqi, draughts, go, etc)"
    }
  }
}
piece_gallery_get_set
Advertised by the server during the last successful anonymous check.

Get full details and piece list for a specific set

piece_gallery_get_set input schema
{
  "type": "object",
  "required": [
    "set"
  ],
  "properties": {
    "set": {
      "type": "string",
      "description": "Set name or ID"
    }
  }
}
piece_gallery_stats
Advertised by the server during the last successful anonymous check.

Get statistics about the piece gallery (total sets, styles, authors, game families)

piece_gallery_stats input schema
{
  "type": "object",
  "properties": {}
}
oracle_list_games
Advertised by the server during the last successful anonymous check.

List all supported RPG systems with oracle tables and entity data availability

oracle_list_games input schema
{
  "type": "object",
  "properties": {}
}
rpg_chargen
Advertised by the server during the last successful anonymous check.

Generate a random character for an RPG system (D&D 5e, Pathfinder, Ironsworn, Cairn, Knave, etc)

rpg_chargen input schema
{
  "type": "object",
  "required": [
    "system"
  ],
  "properties": {
    "class": {
      "type": "string",
      "description": "Class preference (omit for random)"
    },
    "level": {
      "type": "number",
      "description": "Character level (default: 1)"
    },
    "system": {
      "type": "string",
      "description": "RPG system (dnd-5e, pathfinder-1e, ironsworn, starforged, cairn, knave, maze-rats, dungeon-world)"
    }
  }
}
oracle_roll
Advertised by the server during the last successful anonymous check.

Roll on a random oracle table (Ironsworn, Starforged, Maze Rats, etc)

oracle_roll input schema
{
  "type": "object",
  "required": [
    "system"
  ],
  "properties": {
    "table": {
      "type": "string",
      "description": "Specific table name (omit for random)"
    },
    "system": {
      "type": "string",
      "description": "RPG system slug (ironsworn, starforged, maze-rats, cairn, knave, fate-core)"
    }
  }
}
oracle_list_tables
Advertised by the server during the last successful anonymous check.

List available oracle tables for a system

oracle_list_tables input schema
{
  "type": "object",
  "required": [
    "system"
  ],
  "properties": {
    "system": {
      "type": "string",
      "description": "RPG system slug"
    }
  }
}
oracle_ask
Advertised by the server during the last successful anonymous check.

Ask the oracle a yes/no question with likelihood modifier

oracle_ask input schema
{
  "type": "object",
  "required": [
    "question"
  ],
  "properties": {
    "question": {
      "type": "string",
      "description": "Yes/no question"
    },
    "likelihood": {
      "enum": [
        "certain",
        "likely",
        "even",
        "unlikely",
        "impossible"
      ],
      "type": "string",
      "description": "How likely is yes? (default: even)"
    }
  }
}
oracle_scene
Advertised by the server during the last successful anonymous check.

Generate a scene using oracle tables. With a recipe, rolls each table in the recipe, resolves cross-references, and composes a narrative sentence. Without, picks random tables.

oracle_scene input schema
{
  "type": "object",
  "properties": {
    "type": {
      "enum": [
        "location",
        "npc",
        "event",
        "combat"
      ],
      "type": "string",
      "description": "Scene type for random mode (default: event)"
    },
    "recipe": {
      "type": "string",
      "description": "Recipe ID (from oracle_list_recipes) — rolls each table in the recipe"
    },
    "region": {
      "enum": [
        "terminus",
        "outlands",
        "expanse"
      ],
      "type": "string",
      "description": "Region for Starforged region-aware recipes"
    },
    "system": {
      "type": "string",
      "description": "RPG system slug (default: ironsworn)"
    }
  }
}
rpg_search_entities
Advertised by the server during the last successful anonymous check.

Search RPG entities (spells, monsters, classes, items) across all systems

rpg_search_entities input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Alias for system"
    },
    "limit": {
      "type": "number",
      "description": "Max results (default 10)"
    },
    "query": {
      "type": "string",
      "description": "Search term"
    },
    "system": {
      "type": "string",
      "description": "Limit to system (dnd-5e, pathfinder-1e, etc)"
    },
    "category": {
      "type": "string",
      "description": "Entity category (spell, monster, class, item)"
    }
  }
}
rpg_get_entity
Advertised by the server during the last successful anonymous check.

Get full details of a specific RPG entity by name

rpg_get_entity input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Alias for system"
    },
    "name": {
      "type": "string",
      "description": "Entity name"
    },
    "system": {
      "type": "string",
      "description": "System slug"
    },
    "category": {
      "type": "string",
      "description": "Category filter (spells, monsters, classes, etc)"
    }
  }
}
rpg_random_encounter
Advertised by the server during the last successful anonymous check.

Generate a random encounter for a system and difficulty level

rpg_random_encounter input schema
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "Monster type filter (beast, undead, fiend, dragon, etc)"
    },
    "system": {
      "type": "string",
      "description": "System slug (default: dnd-5e)"
    },
    "difficulty": {
      "enum": [
        "easy",
        "medium",
        "hard",
        "deadly"
      ],
      "type": "string",
      "description": "Encounter difficulty"
    }
  }
}
rpg_browse_category
Advertised by the server during the last successful anonymous check.

Browse entities by category with pagination

rpg_browse_category input schema
{
  "type": "object",
  "required": [
    "system",
    "category"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Alias for system"
    },
    "page": {
      "type": "number",
      "description": "Page number (default 1)"
    },
    "system": {
      "type": "string",
      "description": "System slug"
    },
    "category": {
      "type": "string",
      "description": "Category (spell, monster, class, item, feat, etc)"
    },
    "pageSize": {
      "type": "number",
      "description": "Items per page (default 20)"
    }
  }
}
rpg_loot
Advertised by the server during the last successful anonymous check.

Generate random loot/treasure for a system and tier

rpg_loot input schema
{
  "type": "object",
  "properties": {
    "tier": {
      "enum": [
        "minor",
        "major",
        "legendary"
      ],
      "type": "string",
      "description": "Loot tier (default: minor)"
    },
    "count": {
      "type": "number",
      "description": "Number of items (default 3)"
    },
    "system": {
      "type": "string",
      "description": "System slug (default: dnd-5e)"
    }
  }
}
oracle_list_recipes
Advertised by the server during the last successful anonymous check.

List all predefined scene recipes — curated multi-table compositions that produce coherent narrative prompts

oracle_list_recipes input schema
{
  "type": "object",
  "properties": {
    "game": {
      "type": "string",
      "description": "Filter by game system (omit for all)"
    }
  }
}
oracle_interpret
Advertised by the server during the last successful anonymous check.

Resolve oracle cross-references. Given a result like "Action + Theme", follows references and returns expanded results

oracle_interpret input schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game system (default: starforged)"
    },
    "result": {
      "type": "string",
      "description": "Oracle result text to interpret"
    },
    "source_table": {
      "type": "string",
      "description": "Table ID the result came from"
    }
  }
}
oracle_table_view
Advertised by the server during the last successful anonymous check.

View the complete contents of an oracle table — all entries with roll ranges

oracle_table_view input schema
{
  "type": "object",
  "required": [
    "table"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game system (default: starforged)"
    },
    "table": {
      "type": "string",
      "description": "Table ID to view"
    }
  }
}
oracle_encounter
Advertised by the server during the last successful anonymous check.

Generate a tabletop RPG encounter with CR-appropriate monsters, terrain, and loot (D&D 5e or Pathfinder 1e)

oracle_encounter input schema
{
  "type": "object",
  "properties": {
    "system": {
      "enum": [
        "dnd-5e",
        "pathfinder-1e"
      ],
      "type": "string",
      "description": "Game system (default: dnd-5e)"
    },
    "terrain": {
      "type": "string",
      "description": "Terrain type (omit for random)"
    },
    "difficulty": {
      "enum": [
        "easy",
        "medium",
        "hard",
        "deadly"
      ],
      "type": "string",
      "description": "Encounter difficulty (default: medium)"
    },
    "party_size": {
      "type": "number",
      "description": "Number of players 1-10 (default: 4)"
    },
    "party_level": {
      "type": "number",
      "description": "Average party level 1-20 (default: 5)"
    },
    "monster_type": {
      "type": "string",
      "description": "Filter by type (undead, dragon, beast, etc)"
    }
  }
}
rpg_list_categories
Advertised by the server during the last successful anonymous check.

List entity categories for an RPG system (spells, monsters, classes, equipment, etc)

rpg_list_categories input schema
{
  "type": "object",
  "properties": {
    "game": {
      "type": "string",
      "description": "Game system slug (omit for all systems)"
    },
    "system": {
      "type": "string",
      "description": "Alias for game"
    }
  }
}
rpg_random
Advertised by the server during the last successful anonymous check.

Get random entities from an RPG system for inspiration or encounter prep

rpg_random input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game system slug"
    },
    "count": {
      "type": "number",
      "description": "Number of random picks 1-10 (default: 1)"
    },
    "system": {
      "type": "string",
      "description": "Alias for game"
    },
    "category": {
      "type": "string",
      "description": "Category to draw from (omit for any)"
    }
  }
}
ti4_random_factions
Advertised by the server during the last successful anonymous check.

Generate random faction assignments for Twilight Imperium 4th Edition

ti4_random_factions input schema
{
  "type": "object",
  "required": [
    "players"
  ],
  "properties": {
    "players": {
      "type": "number",
      "description": "Number of players (3-8)"
    },
    "expansions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Expansion filter (e.g. [\"base\",\"pok\"]). Default: all"
    }
  }
}
ti4_draft_factions
Advertised by the server during the last successful anonymous check.

Milty-style TI4 draft with pick pools per player

ti4_draft_factions input schema
{
  "type": "object",
  "properties": {
    "choices": {
      "type": "number",
      "description": "Factions per player to choose from (default: 3)"
    },
    "players": {
      "type": "number",
      "description": "Number of players (3-8, default: 6)"
    },
    "expansions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Expansion filter (e.g. [\"base\",\"pok\"]). Default: all"
    }
  }
}
ti4_list_factions
Advertised by the server during the last successful anonymous check.

List all TI4 factions with colors, flags, and expansion info

ti4_list_factions input schema
{
  "type": "object",
  "properties": {
    "expansions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Filter by expansion (e.g. [\"base\",\"pok\"]). Default: all"
    }
  }
}
ti4_draw_objectives
Advertised by the server during the last successful anonymous check.

Draw random public objectives for TI4

ti4_draw_objectives input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number to draw (default: 5)"
    },
    "stage": {
      "enum": [
        1,
        2
      ],
      "type": "number",
      "description": "Stage 1 or 2 (default: both)"
    },
    "expansions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Expansion filter"
    }
  }
}
ti4_draw_agendas
Advertised by the server during the last successful anonymous check.

Draw random agenda cards for TI4 political phase

ti4_draw_agendas input schema
{
  "type": "object",
  "properties": {
    "type": {
      "enum": [
        "law",
        "directive"
      ],
      "type": "string",
      "description": "Filter by type"
    },
    "count": {
      "type": "number",
      "description": "Number to draw (default: 2)"
    },
    "expansions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Expansion filter"
    }
  }
}
nukes_setup_generator
Advertised by the server during the last successful anonymous check.

Generate random territory/resource setup for a Nukes game

nukes_setup_generator input schema
{
  "type": "object",
  "properties": {
    "players": {
      "type": "number",
      "description": "Number of players (2-6, default: 2)"
    }
  }
}
game_nukes_combat
Advertised by the server during the last successful anonymous check.

Resolve a Nukes combat encounter between units

game_nukes_combat input schema
{
  "type": "object",
  "required": [
    "attacker",
    "defender"
  ],
  "properties": {
    "terrain": {
      "type": "string",
      "description": "Terrain type (plains, forest, mountain, urban)"
    },
    "attacker": {
      "type": "string",
      "description": "Attacking unit type"
    },
    "defender": {
      "type": "string",
      "description": "Defending unit type"
    }
  }
}
colony_dice_odds
Advertised by the server during the last successful anonymous check.

Calculate settlement dice probability for Colony/Catan-style resource numbers

colony_dice_odds input schema
{
  "type": "object",
  "required": [
    "numbers"
  ],
  "properties": {
    "numbers": {
      "type": "string",
      "description": "Settlement numbers, comma-separated (e.g. \"5,6,8,9\")"
    }
  }
}
game_deck_create
Advertised by the server during the last successful anonymous check.

Create, shuffle, and optionally draw/deal from a card deck

game_deck_create input schema
{
  "type": "object",
  "properties": {
    "draw": {
      "type": "number",
      "description": "Number of cards to draw"
    },
    "type": {
      "enum": [
        "standard-52",
        "bavarian-32",
        "hanafuda-48",
        "mahjong-136",
        "dominoes-28",
        "standard-dice"
      ],
      "type": "string",
      "description": "Deck type (default: standard-52)"
    },
    "hands": {
      "type": "number",
      "description": "Deal into N hands"
    },
    "per_hand": {
      "type": "number",
      "description": "Cards per hand (default: 5)"
    }
  }
}
game_deck_list_types
Advertised by the server during the last successful anonymous check.

List all available deck types with metadata

game_deck_list_types input schema
{
  "type": "object",
  "properties": {}
}
game_deck_deal
Advertised by the server during the last successful anonymous check.

Shuffle and deal a custom deck of arbitrary named cards

game_deck_deal input schema
{
  "type": "object",
  "required": [
    "cards"
  ],
  "properties": {
    "draw": {
      "type": "number",
      "description": "Draw N cards from the top instead of dealing hands"
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "quantity": {
            "type": "number",
            "default": 1
          }
        }
      },
      "description": "Cards in the deck (name + optional quantity)"
    },
    "hands": {
      "type": "number",
      "description": "Deal into N hands (default: 1 = draw pile only)"
    },
    "per_hand": {
      "type": "number",
      "description": "Cards per hand (default: 5)"
    }
  }
}
game_score_tracker
Advertised by the server during the last successful anonymous check.

Track scores for players in any game

game_score_tracker input schema
{
  "type": "object",
  "required": [
    "players"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game name"
    },
    "scores": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Scores (default: all 0)"
    },
    "players": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Player names"
    }
  }
}
talisman_draw_characters
Advertised by the server during the last successful anonymous check.

Draw random characters from the Talisman 4e (revised) base set for a character lottery

talisman_draw_characters input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of characters to draw (2-6, default: 4)"
    }
  }
}
talisman_draw_encounter
Advertised by the server during the last successful anonymous check.

Draw a random encounter for a Talisman ring (outer, middle, inner, crown)

talisman_draw_encounter input schema
{
  "type": "object",
  "properties": {
    "ring": {
      "enum": [
        "outer",
        "middle",
        "inner",
        "crown"
      ],
      "type": "string",
      "description": "Ring to draw from (default: outer)"
    }
  }
}
jam_status
Advertised by the server during the last successful anonymous check.

Get the current Mod Jam status (active jam, deadline, submissions)

jam_status input schema
{
  "type": "object",
  "properties": {}
}
jam_timer
Advertised by the server during the last successful anonymous check.

Get time remaining in the current Mod Jam

jam_timer input schema
{
  "type": "object",
  "properties": {}
}
jam_vote
Advertised by the server during the last successful anonymous check.

Get voting status for the current Mod Jam

jam_vote input schema
{
  "type": "object",
  "properties": {}
}
dice_roll
Advertised by the server during the last successful anonymous check.

Roll dice using standard notation (e.g. 2d6+3, 4d8, d20). Supports comma-separated pools and keep-high/low (4d6kh3).

dice_roll input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of times to roll (default 1)"
    },
    "notation": {
      "type": "string",
      "description": "Dice notation (e.g. 2d6+3, 4d6kh3, 3d8,1d12+2)"
    },
    "expression": {
      "type": "string",
      "description": "Alias for notation"
    }
  }
}
coin_flip
Advertised by the server during the last successful anonymous check.

Flip one or more coins, or pick from a list of choices

coin_flip input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of coins (default 1)"
    },
    "choices": {
      "type": "string",
      "description": "Comma-separated options to pick from (overrides coin flip)"
    }
  }
}
team_split
Advertised by the server during the last successful anonymous check.

Randomly divide players into teams

team_split input schema
{
  "type": "object",
  "required": [
    "players"
  ],
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of teams (default 2)"
    },
    "teams": {
      "type": "number",
      "description": "Alias for count"
    },
    "members": {
      "type": "string",
      "description": "Comma-separated names (alternative to array)"
    },
    "players": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Player names"
    }
  }
}
random_player_order
Advertised by the server during the last successful anonymous check.

Randomise turn order for a list of players

random_player_order input schema
{
  "type": "object",
  "required": [
    "players"
  ],
  "properties": {
    "players": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Player names"
    }
  }
}
timer_suggest
Advertised by the server during the last successful anonymous check.

Suggest time controls for a game based on player count and complexity

timer_suggest input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "Game name"
    },
    "players": {
      "type": "number",
      "description": "Number of players"
    }
  }
}
game_jam_theme
Advertised by the server during the last successful anonymous check.

Generate a random game jam theme combining mechanics and themes

game_jam_theme input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of themes to generate (default 3)"
    }
  }
}
dice_odds
Advertised by the server during the last successful anonymous check.

Calculate probability of meeting a target with a dice expression. Supports keep-high/low (4d6kh3).

dice_odds input schema
{
  "type": "object",
  "required": [
    "expression",
    "target"
  ],
  "properties": {
    "target": {
      "type": "number",
      "description": "Target number to meet or exceed"
    },
    "comparison": {
      "enum": [
        ">=",
        ">",
        "<=",
        "<",
        "="
      ],
      "type": "string",
      "description": "Comparison (default >=)"
    },
    "expression": {
      "type": "string",
      "description": "Dice expression (e.g. 2d6, 4d6kh3)"
    }
  }
}

Prompts

3 advertised

analyse_position

Advertised by the server during the last successful anonymous check.

Analyse a chess position from FEN notation

fen
FEN string (required)
build_variant

Advertised by the server during the last successful anonymous check.

Help design a custom chess variant

theme
Theme or concept for the variant (required)
plan_hex_map

Advertised by the server during the last successful anonymous check.

Plan a hex-based game map

game
Game type (nukes, colony, catan, etc) (required)
players
Number of players

Resources

4 advertised

Tool Catalog

Advertised by the server during the last successful anonymous check.

Tool Catalog URI
moddable://tools/catalog

MIME type: application/json

Game Families

Advertised by the server during the last successful anonymous check.

Game Families URI
moddable://games/families

MIME type: application/json

Chess Variants Catalog

Advertised by the server during the last successful anonymous check.

Chess Variants Catalog URI
moddable://chess/variants

MIME type: application/json

RPG Systems

Advertised by the server during the last successful anonymous check.

RPG Systems URI
moddable://rpg/systems

MIME type: application/json

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
491 ms
95th percentile latency
491 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 491 ms · metadata changed · 89 tool(s), 4 resource(s), 3 prompt(s); warnings: Advertises resources/templates/list but does not implement it

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http moddable-games-tools-mcp https://tools.moddable.games/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add moddable-games-tools-mcp --url https://tools.moddable.games/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable moddable-games-tools-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "moddable-games-tools-mcp": {
      "url": "https://tools.moddable.games/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "moddable-games-tools-mcp": {
      "type": "streamableHttp",
      "url": "https://tools.moddable.games/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start moddable-games-tools-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "moddable-games-tools-mcp": {
      "type": "http",
      "url": "https://tools.moddable.games/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http moddable-games-tools-mcp https://tools.moddable.games/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://tools.moddable.games/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "moddable-games-tools-mcp": {
      "serverUrl": "https://tools.moddable.games/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Moddable Games Tools MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Moddable Games Tools MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing