89 AI-callable tools across 30 playable families (313 variants). Board game play, hex map generation, puzzles, RPG oracles, and more. Connect from any MCP client or call via REST.
claude mcp add --transport http moddable-tools https://tools.moddable.games/mcp
POST /mcp/messageMCP protocol (JSON-RPC 2025-03-26)GET /mcpMCP server-sent events (SSE)POST /api/callREST API — {"tool": "name", "args": {...}}GET /api/toolsList all tools with input schemasGET /helpFull API reference (JSON) with all paramsGET /help/:toolDetailed docs + curl example for a specific toolGET /llms.txtAI-readable discovery fileGET /openapi.jsonOpenAPI 3.1 specificationGET /api/board.pngRender board — ?fen=...&variant=... or ?board={id}&size=480GET /api/piece.pngSingle piece — ?set=chessnut&piece=wK&size=128GET /api/pieces.pngAll pieces in set — ?set=chessnut&size=64 (grid)GET /api/tile.pngSingle tile — ?set=nukes&tile=grass&size=256GET /api/tiles.pngAll tiles in set — ?set=nukes&size=128 (grid)curl -X POST https://tools.moddable.games/api/call \
-H "Content-Type: application/json" \
-d '{"tool": "play_create_game", "args": {"family": "chess", "variant": "atomic"}}'Eight chess-only tools have been replaced by family-generic equivalents. Deprecated names still work but will be removed in v1.0.0.
| Deprecated | Replacement |
|---|---|
chess_list_variants | play_list_variants |
chess_get_legal_moves | play_create_game + play_get_moves |
chess_analyze_position | play_suggest_move |
chess_make_move | play_apply_move |
chess_validate_move | play_validate_move |
chess_get_status | play_check_status |
chess_render_svg | play_render_board |
chess_make_moves | play_make_moves |
| Removed (engine#98) |
engine.moddable.games/api/pieces/index.json125 piece sets (SVG) across chess, shogi, xiangqi, Go, draughts, backgammonengine.moddable.games/api/boards/index.json335 board layouts (SVG) spanning 34 game familiesengine.moddable.games/api/tiles/index.json11 hex tile sets (PNG) for strategy mapsengine.moddable.games/api/puzzles/index.json1,849 chess puzzles with FEN, solutions, and difficulty ratingsrules.moddable.games/api/catalogue.json46 games, 296 variants, 177 pages of rules in markdownrules.moddable.games/api/oracles.json458 oracle tables across 6 RPG systemsrules.moddable.games/api/entities.json3,385+ RPG entities (monsters, spells, items) across 10 systemsrules.moddable.games/api/search-index.jsonFull-text search index across all published rulebooksGET /embed/diceDice Lab — 9 wargame simulators (40K, Risk, TI4, A&A, X-Wing, Blood Bowl, Memoir, Custom)GET /embed/ti4TI4 Tools — faction draft picker + agenda voter with vote trackingGET /embed/decksCard Decks — shuffle and deal from 6 deck types (standard, hanafuda, mahjong, dominoes...)GET /embed/talismanTalisman Tools — character lottery + encounter quick-draw for any ringGET /embed/nukesNukes Tools — combat strength calculator + hostage tracker + unit referenceGET /embed/oraclesOracle Tools — scene forge, table roller, yes/no oracle, thread weaver, encounter builder, RPG library<iframe src="https://tools.moddable.games/embed/dice?tab=risk"
width="100%" height="600" style="border:none"></iframe>
// Or with theming via URL params:
/embed/dice?tab=roller&vars={"--embed-bg":"#1a1a2e","--embed-text":"#eee"}
// Or control programmatically via postMessage:
iframe.postMessage({ type: 'moddable:setTab', tab: 'ti4' }, '*')
iframe.postMessage({ type: 'moddable:config', vars: {'--embed-accent':'#ff0'} }, '*')import { ModdableTools } from '@moddable/tools-sdk'
const tools = new ModdableTools({ base: 'https://tools.moddable.games' })
// API calls
const result = await tools.utilities.diceRoll({ notation: '4d6kh3' })
const factions = await tools.games.ti4DraftFactions({ players: 6, hand_size: 3 })
// Managed embeds (auto-resize, theming, event hooks)
const widget = tools.embed.dice('#mount-point', {
tab: 'risk',
vars: { '--embed-bg': '#0a0d2a', '--embed-text': '#eee' },
onResult: (tool, data) => console.log(data),
onResize: (height) => console.log('height:', height),
})
widget.setTab('ti4') // switch tab
widget.setVars({...}) // retheme
widget.destroy() // teardown
// Render URLs (for <img> tags)
const boardUrl = tools.render.boardUrl({ variant: 'chess960', fen: '...' })