{"name":"Moddable Games Tools API","version":"0.1.0","totalTools":89,"usage":{"rest":"POST /api/call with {\"tool\": \"tool_name\", \"args\": {...}}","mcp":"Connect via SSE at /mcp or POST JSON-RPC to /mcp","help":"GET /help/:tool_name for full documentation on any tool"},"endpoints":{"GET /":"Landing page (HTML) — full tool inventory and endpoint reference","GET /help":"This endpoint — full API reference with all tool params (JSON)","GET /help/:tool":"Detailed docs for a specific tool with curl example","POST /api/call":"Invoke a tool: {\"tool\": \"name\", \"args\": {...}}","GET /api/tools":"Machine-readable tool listing with JSON schemas","GET /api/stats":"Universal ecosystem stats (all 4 projects combined, ?project= for single)","GET /api/bot-commands":"Discord bot command list with groups and stats (for moddable-web build)","GET /test":"Run full test suite (content validation)","GET /test/:namespace":"Test a single namespace (chess, hex, play, etc)","GET /api/board.png":"Render board as PNG (?fen=...&variant=... or ?board={id}&size=...)","GET /api/piece.png":"Render single piece as PNG (?set=chessnut&piece=wK&size=...)","GET /api/pieces.png":"Render all pieces in set as PNG grid (?set=chessnut&size=...)","GET /api/tile.png":"Render single tile as PNG (?set=nukes&tile=grass&size=...)","GET /api/tiles.png":"Render all tiles in set as PNG grid (?set=nukes&size=...)","GET /mcp":"MCP server-sent events (SSE)","POST /mcp":"MCP JSON-RPC (protocol 2025-03-26)","POST /api/subscribe":"Email subscription form","POST /api/submit":"Generic form submission","GET /llms.txt":"AI-readable tool documentation","GET /openapi.json":"OpenAPI 3.1 specification","GET /.well-known/mcp.json":"MCP server manifest","GET /.well-known/mcp/server-card.json":"MCP server card","GET /.well-known/mcp-registry-auth":"MCP registry authentication","GET /.well-known/api-catalog":"RFC 9727 API catalog","GET /.well-known/agent-skills/index.json":"Agent skills discovery","GET /.well-known/agent-skills/:name/SKILL.md":"Individual agent skill markdown","GET /auth.md":"Open access descriptor (no authentication required)","GET /embed":"Widget index — list all embeddable widgets with iframe snippets","GET /embed/:widget":"Embeddable widget page (iframe-ready, customizable via CSS vars + postMessage)"},"namespaces":{"chess":[{"name":"chess_generate_puzzle","description":"Get a random chess puzzle. Filter by variant or difficulty. Variant puzzles have no themes and max rating 1400 — theme and hard difficulty filters only apply to standard puzzles.","params":[{"variant":"string — Chess variant slug, camelCase or kebab-case (e.g. antichess, almost-chess, atomic, chess960, standard). Returns only puzzles for this variant."},{"difficulty":"string, options: easy|medium|hard — Puzzle difficulty (variant puzzles max at 1400, so hard returns nothing for variants)"},{"theme":"string — Puzzle theme (fork, pin, skewer, mateIn2, etc). Only standard puzzles carry themes."}]},{"name":"chess_list_puzzle_types","description":"List available puzzle variants, themes, and per-variant counts from the puzzle pool","params":[]},{"name":"chess_list_variants","description":"[DEPRECATED — use play_list_variants] List chess variants. Removal: v1.0.0.","params":[{"group":"string"}]},{"name":"chess_get_legal_moves","description":"[DEPRECATED — use play_create_game + play_get_moves] Get legal moves for a chess position. Removal: v1.0.0.","params":[{"variant":"string"}]},{"name":"chess_analyze_position","description":"[DEPRECATED — use play_suggest_move] Analyse a chess position. Removal: v1.0.0.","params":[{"variant":"string"},{"depth":"number"}]},{"name":"chess_make_move","description":"[DEPRECATED — use play_apply_move] Apply a move to a chess game. Removal: v1.0.0.","params":[{"move":"object, required"},{"variant":"string"}]},{"name":"chess_validate_move","description":"[DEPRECATED — use play_validate_move] Check if a chess move is legal. Removal: v1.0.0.","params":[{"move":"object, required"},{"variant":"string"}]},{"name":"chess_get_status","description":"[DEPRECATED — use play_check_status] Get chess game status. Removal: v1.0.0.","params":[{"variant":"string"}]},{"name":"chess_render_svg","description":"[DEPRECATED — use play_render_board] Render a chess position as SVG. Removal: v1.0.0.","params":[{"variant":"string"},{"fen":"string — FEN position string"},{"highlights":"array — Squares to highlight (e.g. [\"e2\",\"e4\"])"}]},{"name":"chess_make_moves","description":"[DEPRECATED — use play_make_moves] Apply a sequence of chess moves. Removal: v1.0.0.","params":[{"moves":"array, required"},{"variant":"string"}]},{"name":"chess_get_opening_book","description":"[REMOVED — engine#98] Opening book resolution is broken in Worker context. No replacement.","params":[{"variant":"string"}]}],"hex":[{"name":"hex_list_games","description":"List all available hex map game types with configuration options","params":[]},{"name":"hex_generate_map","description":"Generate a hex map for a specific game and player count","params":[{"game":"string, required — Game type (nukes, colony, catan, age-of-steam, eclipse, twilight-imperium)"},{"players":"number — Number of players (default: 2)"},{"size":"number — Map size (default: game default)"},{"seed":"string — Random seed for reproducibility"}]},{"name":"hex_export_svg","description":"Generate a hex map and export as SVG","params":[{"game":"string, required — Game type"},{"players":"number — Number of players"},{"size":"number — Map size"},{"seed":"string — Random seed"},{"style":"string — Visual style"},{"hexSize":"number — Hex size in pixels (default: 30)"}]},{"name":"hex_get_info","description":"Get info about a specific hex coordinate (terrain, neighbours, distance)","params":[{"q":"number, required — Hex Q coordinate (column)"},{"r":"number, required — Hex R coordinate (row)"},{"game":"string — Game context for terrain lookup"},{"seed":"string — Map seed (to look up terrain from a generated map)"}]},{"name":"hex_compute_fov","description":"Compute field of view from a hex position","params":[{"q":"number, required — Origin Q coordinate"},{"r":"number, required — Origin R coordinate"},{"range":"number, required — Vision range in hexes"},{"game":"string — Game context for obstacle lookup"},{"seed":"string — Map seed"}]},{"name":"hex_pathfind","description":"Find shortest path between two hex coordinates","params":[{"startQ":"number, required — Start Q"},{"startR":"number, required — Start R"},{"endQ":"number, required — End Q"},{"endR":"number, required — End R"},{"game":"string — Game context for movement costs"},{"seed":"string — Map seed"}]}],"play":[{"name":"play_list_families","description":"List all playable game families supported by the engine (chess, draughts, go, reversi, shogi, xiangqi)","params":[]},{"name":"play_list_variants","description":"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\".","params":[{"family":"string, required — Game family (chess, draughts, go, reversi, shogi, xiangqi)"}]},{"name":"play_get_definition","description":"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.","params":[{"family":"string, required — Game family (chess, draughts, go, reversi, shogi, xiangqi)"},{"variant":"string — Variant slug (default: standard)"}]},{"name":"play_create_game","description":"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\".","params":[{"family":"string, required — Game family name (chess, draughts, go, reversi, shogi, xiangqi)"},{"variant":"string — Variant slug, optionally with flags (e.g. \"grand\", \"grand+random\", \"standard+drops\")"},{"rngSeed":"number — Optional RNG seed for deterministic games"}]},{"name":"play_get_moves","description":"Get all legal moves for the current position. Requires state from play_create_game or play_apply_move.","params":[{"state":"object, required — Game state object returned by play_create_game or play_apply_move"}]},{"name":"play_apply_move","description":"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\"}).","params":[{"state":"object, required — Game state object from play_create_game or a previous play_apply_move"},{"move":"object, required — Move object from play_get_moves (e.g. {from:\"e2\",to:\"e4\"} for chess, {coord:40} for go, {action:\"pass\"})"}]},{"name":"play_check_status","description":"Check the current game status: whose turn it is, whether the game is over, and who won.","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"}]},{"name":"play_suggest_move","description":"Use AI to analyse the position and suggest the best move. Supports 5 difficulty levels across all 6 playable families.","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"},{"difficulty":"string, options: beginner|easy|medium|hard|expert — AI difficulty level (default: medium)"}]},{"name":"play_render_board","description":"Render the current board position as SVG for any playable family (chess, draughts, go, reversi, shogi, xiangqi).","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"},{"highlights":"array — Optional cells to highlight (e.g. [{key: 52, color: \"#ff0\"}])"},{"size":"integer — Board width in pixels for PNG output (default: 480, max: 2048)"}]},{"name":"play_export_fen","description":"Export the current board position as a FEN-style notation string. Works for all 6 families (chess, draughts, go, reversi, shogi, xiangqi).","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"}]},{"name":"play_load_fen","description":"Create a game state from a FEN-style position string. Works for all 6 families.","params":[{"family":"string, required — Game family (chess, draughts, go, reversi, shogi, xiangqi)"},{"fen":"string, required — Position string in FEN-style notation for the family"},{"variant":"string — Optional variant slug"}]},{"name":"play_validate_move","description":"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.","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"},{"move":"object, required — Move object to validate (same format as play_get_moves output)"}]},{"name":"play_make_moves","description":"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.","params":[{"state":"object, required — Game state object from play_create_game or play_apply_move"},{"moves":"array, required — Array of move objects in the format returned by play_get_moves"}]}],"rules":[{"name":"rules_list_games","description":"List all available game rulebooks with metadata (players, duration, complexity, mechanics). Filterable by type, complexity, and mechanics.","params":[{"category":"string — Filter by type (standalone, hub, classic, rpg, component, platform, mod, game)"},{"complexity":"string, options: simple|moderate|complex — Filter by complexity level"},{"mechanic":"string — Filter by mechanic (e.g. dice, capture, hex, oracle, narrative)"},{"status":"string, options: live|alpha|playtest — Filter by status (default: all)"}]},{"name":"rules_get_game","description":"Get full rulebook content for a specific game (markdown). For metadata only, use rules_get_game_meta instead.","params":[{"game":"string, required — Game slug (e.g. chess, dnd-5e, catan)"}]},{"name":"rules_get_game_meta","description":"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.","params":[{"game":"string, required — Game slug (e.g. chess, backgammon, cairn)"}]},{"name":"rules_get_page","description":"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.","params":[{"game":"string, required — Game slug (e.g. cairn, dnd-5e)"},{"section":"string — Section name (e.g. rules, classes, spells). Default: rules"},{"page":"string, required — Page slug (e.g. character-creation, combat-and-difficulty)"}]},{"name":"rules_get_variant_list","description":"List all variants for a game with structured metadata (players, board, playable status, topology, engine config). Much richer than parsing the rulebook.","params":[{"game":"string, required — Game slug (e.g. chess, backgammon, draughts)"},{"playable":"boolean — Filter to only engine-playable variants"},{"topology":"string — Filter by board topology (grid, hex, track, graph, tableau)"}]},{"name":"rules_get_diagram","description":"Get board diagram SVG URL for a game variant. Returns the diagram path, topology, and rendering metadata.","params":[{"game":"string, required — Game family slug (e.g. chess, go, agon)"},{"variant":"string — Variant slug (default: standard)"}]},{"name":"rules_get_variant","description":"Get rules for a specific game variant","params":[{"game":"string, required — Game slug"},{"variant":"string, required — Variant slug"}]},{"name":"rules_search","description":"Full-text search across all published rulebooks. Returns section-typed results with deep-link anchors.","params":[{"query":"string, required — Search query"},{"game":"string — Limit to specific game slug"},{"sectionType":"string — Filter by section type (general, board, pieces, setup, movement, capture, winning, special, variants)"},{"limit":"number — Max results (default 10)"}]},{"name":"rules_random","description":"Get a random game suggestion from the library","params":[{"players":"number — Number of players available"},{"maxDuration":"number — Maximum game duration in minutes"}]}],"gallery":[{"name":"board_gallery_search","description":"Search the board gallery (333 rendered board layouts across 33 game families)","params":[{"query":"string — Search term (e.g. \"8x8\", \"hex\", \"shogi\")"},{"limit":"number — Max results (default 10)"}]},{"name":"board_gallery_get","description":"Get details of a specific board layout by ID","params":[{"board":"string, required — Board ID or name"}]},{"name":"tile_gallery_search","description":"Search hex tile sets by name, game, or terrain type","params":[{"query":"string — Search term (omit to list all)"}]},{"name":"tile_gallery_get","description":"Get details of a specific tile set with all tile types","params":[{"set":"string, required — Tile set ID or name"}]},{"name":"tile_gallery_stats","description":"Get statistics about available tile sets","params":[]},{"name":"board_gallery_stats","description":"Get statistics about the board gallery (total boards, families, topologies)","params":[]},{"name":"piece_gallery_search","description":"Search the piece set gallery by name, style, or game type","params":[{"query":"string, required — Search term (e.g. \"staunton\", \"pixel\", \"shogi\")"},{"family":"string — Filter by game family (chess, shogi, xiangqi, draughts, go, etc)"},{"limit":"number — Max results (default 10)"}]},{"name":"piece_gallery_get_set","description":"Get full details and piece list for a specific set","params":[{"set":"string, required — Set name or ID"}]},{"name":"piece_gallery_stats","description":"Get statistics about the piece gallery (total sets, styles, authors, game families)","params":[]}],"oracles":[{"name":"oracle_list_games","description":"List all supported RPG systems with oracle tables and entity data availability","params":[]},{"name":"rpg_chargen","description":"Generate a random character for an RPG system (D&D 5e, Pathfinder, Ironsworn, Cairn, Knave, etc)","params":[{"system":"string, required — RPG system (dnd-5e, pathfinder-1e, ironsworn, starforged, cairn, knave, maze-rats, dungeon-world)"},{"level":"number — Character level (default: 1)"},{"class":"string — Class preference (omit for random)"}]},{"name":"oracle_roll","description":"Roll on a random oracle table (Ironsworn, Starforged, Maze Rats, etc)","params":[{"system":"string, required — RPG system slug (ironsworn, starforged, maze-rats, cairn, knave, fate-core)"},{"table":"string — Specific table name (omit for random)"}]},{"name":"oracle_list_tables","description":"List available oracle tables for a system","params":[{"system":"string, required — RPG system slug"}]},{"name":"oracle_ask","description":"Ask the oracle a yes/no question with likelihood modifier","params":[{"question":"string, required — Yes/no question"},{"likelihood":"string, options: certain|likely|even|unlikely|impossible — How likely is yes? (default: even)"}]},{"name":"oracle_scene","description":"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.","params":[{"system":"string — RPG system slug (default: ironsworn)"},{"recipe":"string — Recipe ID (from oracle_list_recipes) — rolls each table in the recipe"},{"region":"string, options: terminus|outlands|expanse — Region for Starforged region-aware recipes"},{"type":"string, options: location|npc|event|combat — Scene type for random mode (default: event)"}]},{"name":"rpg_search_entities","description":"Search RPG entities (spells, monsters, classes, items) across all systems","params":[{"query":"string, required — Search term"},{"system":"string — Limit to system (dnd-5e, pathfinder-1e, etc)"},{"game":"string — Alias for system"},{"category":"string — Entity category (spell, monster, class, item)"},{"limit":"number — Max results (default 10)"}]},{"name":"rpg_get_entity","description":"Get full details of a specific RPG entity by name","params":[{"name":"string, required — Entity name"},{"system":"string — System slug"},{"game":"string — Alias for system"},{"category":"string — Category filter (spells, monsters, classes, etc)"}]},{"name":"rpg_random_encounter","description":"Generate a random encounter for a system and difficulty level","params":[{"system":"string — System slug (default: dnd-5e)"},{"difficulty":"string, options: easy|medium|hard|deadly — Encounter difficulty"},{"type":"string — Monster type filter (beast, undead, fiend, dragon, etc)"}]},{"name":"rpg_browse_category","description":"Browse entities by category with pagination","params":[{"system":"string, required — System slug"},{"game":"string — Alias for system"},{"category":"string, required — Category (spell, monster, class, item, feat, etc)"},{"page":"number — Page number (default 1)"},{"pageSize":"number — Items per page (default 20)"}]},{"name":"rpg_loot","description":"Generate random loot/treasure for a system and tier","params":[{"system":"string — System slug (default: dnd-5e)"},{"tier":"string, options: minor|major|legendary — Loot tier (default: minor)"},{"count":"number — Number of items (default 3)"}]},{"name":"oracle_list_recipes","description":"List all predefined scene recipes — curated multi-table compositions that produce coherent narrative prompts","params":[{"game":"string — Filter by game system (omit for all)"}]},{"name":"oracle_interpret","description":"Resolve oracle cross-references. Given a result like \"Action + Theme\", follows references and returns expanded results","params":[{"result":"string, required — Oracle result text to interpret"},{"source_table":"string — Table ID the result came from"},{"game":"string — Game system (default: starforged)"}]},{"name":"oracle_table_view","description":"View the complete contents of an oracle table — all entries with roll ranges","params":[{"table":"string, required — Table ID to view"},{"game":"string — Game system (default: starforged)"}]},{"name":"oracle_encounter","description":"Generate a tabletop RPG encounter with CR-appropriate monsters, terrain, and loot (D&D 5e or Pathfinder 1e)","params":[{"system":"string, options: dnd-5e|pathfinder-1e — Game system (default: dnd-5e)"},{"party_level":"number — Average party level 1-20 (default: 5)"},{"party_size":"number — Number of players 1-10 (default: 4)"},{"difficulty":"string, options: easy|medium|hard|deadly — Encounter difficulty (default: medium)"},{"monster_type":"string — Filter by type (undead, dragon, beast, etc)"},{"terrain":"string — Terrain type (omit for random)"}]},{"name":"rpg_list_categories","description":"List entity categories for an RPG system (spells, monsters, classes, equipment, etc)","params":[{"game":"string — Game system slug (omit for all systems)"},{"system":"string — Alias for game"}]},{"name":"rpg_random","description":"Get random entities from an RPG system for inspiration or encounter prep","params":[{"game":"string, required — Game system slug"},{"system":"string — Alias for game"},{"category":"string — Category to draw from (omit for any)"},{"count":"number — Number of random picks 1-10 (default: 1)"}]}],"games":[{"name":"ti4_random_factions","description":"Generate random faction assignments for Twilight Imperium 4th Edition","params":[{"players":"number, required — Number of players (3-8)"},{"expansions":"array — Expansion filter (e.g. [\"base\",\"pok\"]). Default: all"}]},{"name":"ti4_draft_factions","description":"Milty-style TI4 draft with pick pools per player","params":[{"players":"number — Number of players (3-8, default: 6)"},{"choices":"number — Factions per player to choose from (default: 3)"},{"expansions":"array — Expansion filter (e.g. [\"base\",\"pok\"]). Default: all"}]},{"name":"ti4_list_factions","description":"List all TI4 factions with colors, flags, and expansion info","params":[{"expansions":"array — Filter by expansion (e.g. [\"base\",\"pok\"]). Default: all"}]},{"name":"ti4_draw_objectives","description":"Draw random public objectives for TI4","params":[{"stage":"number, options: 1|2 — Stage 1 or 2 (default: both)"},{"count":"number — Number to draw (default: 5)"},{"expansions":"array — Expansion filter"}]},{"name":"ti4_draw_agendas","description":"Draw random agenda cards for TI4 political phase","params":[{"count":"number — Number to draw (default: 2)"},{"type":"string, options: law|directive — Filter by type"},{"expansions":"array — Expansion filter"}]},{"name":"nukes_setup_generator","description":"Generate random territory/resource setup for a Nukes game","params":[{"players":"number — Number of players (2-6, default: 2)"}]},{"name":"game_nukes_combat","description":"Resolve a Nukes combat encounter between units","params":[{"attacker":"string, required — Attacking unit type"},{"defender":"string, required — Defending unit type"},{"terrain":"string — Terrain type (plains, forest, mountain, urban)"}]},{"name":"colony_dice_odds","description":"Calculate settlement dice probability for Colony/Catan-style resource numbers","params":[{"numbers":"string, required — Settlement numbers, comma-separated (e.g. \"5,6,8,9\")"}]},{"name":"game_deck_create","description":"Create, shuffle, and optionally draw/deal from a card deck","params":[{"type":"string, options: standard-52|bavarian-32|hanafuda-48|mahjong-136|dominoes-28|standard-dice — Deck type (default: standard-52)"},{"draw":"number — Number of cards to draw"},{"hands":"number — Deal into N hands"},{"per_hand":"number — Cards per hand (default: 5)"}]},{"name":"game_deck_list_types","description":"List all available deck types with metadata","params":[]},{"name":"game_deck_deal","description":"Shuffle and deal a custom deck of arbitrary named cards","params":[{"cards":"array, required — Cards in the deck (name + optional quantity)"},{"hands":"number — Deal into N hands (default: 1 = draw pile only)"},{"per_hand":"number — Cards per hand (default: 5)"},{"draw":"number — Draw N cards from the top instead of dealing hands"}]},{"name":"game_score_tracker","description":"Track scores for players in any game","params":[{"players":"array, required — Player names"},{"scores":"array — Scores (default: all 0)"},{"game":"string — Game name"}]},{"name":"talisman_draw_characters","description":"Draw random characters from the Talisman 4e (revised) base set for a character lottery","params":[{"count":"number — Number of characters to draw (2-6, default: 4)"}]},{"name":"talisman_draw_encounter","description":"Draw a random encounter for a Talisman ring (outer, middle, inner, crown)","params":[{"ring":"string, options: outer|middle|inner|crown — Ring to draw from (default: outer)"}]},{"name":"jam_status","description":"Get the current Mod Jam status (active jam, deadline, submissions)","params":[]},{"name":"jam_timer","description":"Get time remaining in the current Mod Jam","params":[]},{"name":"jam_vote","description":"Get voting status for the current Mod Jam","params":[]}],"utilities":[{"name":"dice_roll","description":"Roll dice using standard notation (e.g. 2d6+3, 4d8, d20). Supports comma-separated pools and keep-high/low (4d6kh3).","params":[{"notation":"string — Dice notation (e.g. 2d6+3, 4d6kh3, 3d8,1d12+2)"},{"expression":"string — Alias for notation"},{"count":"number — Number of times to roll (default 1)"}]},{"name":"coin_flip","description":"Flip one or more coins, or pick from a list of choices","params":[{"count":"number — Number of coins (default 1)"},{"choices":"string — Comma-separated options to pick from (overrides coin flip)"}]},{"name":"team_split","description":"Randomly divide players into teams","params":[{"players":"array, required — Player names"},{"members":"string — Comma-separated names (alternative to array)"},{"count":"number — Number of teams (default 2)"},{"teams":"number — Alias for count"}]},{"name":"random_player_order","description":"Randomise turn order for a list of players","params":[{"players":"array, required — Player names"}]},{"name":"timer_suggest","description":"Suggest time controls for a game based on player count and complexity","params":[{"game":"string, required — Game name"},{"players":"number — Number of players"}]},{"name":"game_jam_theme","description":"Generate a random game jam theme combining mechanics and themes","params":[{"count":"number — Number of themes to generate (default 3)"}]},{"name":"dice_odds","description":"Calculate probability of meeting a target with a dice expression. Supports keep-high/low (4d6kh3).","params":[{"expression":"string, required — Dice expression (e.g. 2d6, 4d6kh3)"},{"target":"number, required — Target number to meet or exceed"},{"comparison":"string, options: >=|>|<=|<|= — Comparison (default >=)"}]}]}}