85 AI-callable tools across 6 playable families (133 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": "mancala", "variant": "oware"}}'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.json115 piece sets (SVG) across chess, shogi, xiangqi, Go, draughts, backgammonengine.moddable.games/api/boards/index.json333 board layouts (SVG) spanning 33 game familiesengine.moddable.games/api/tiles/index.json7 hex tile sets (PNG) for strategy mapsengine.moddable.games/api/puzzles/index.json1,876 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: '...' })