MCP server intelligence profile

antics-mcp Server

Enables AI agents to deploy multiplayer web games as playable URLs with rooms, live state sync, and leaderboards, all through a single tool call

Local OnlyOfficial distributionantics-gg
Verified cleanNpm · 0.5.0

Our scanner tested version 0.5.0 without proving a finding in the methods exercised. This is not a guarantee that every deployment is secure.

1Distribution channel
15Independently observed tools
0Linked remote endpoints
AvailableVersion intelligence

Install and connect

Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.

Install antics-mcp from npm

Install exact version 0.5.0. No verified executable entrypoint is available, so use the package documentation to launch it.

npm install --save-exact antics-mcp@0.5.0

Identity

Canonical slugantics-mcp-b5033f1aDeploymentLocal Only
Canonical packagenpm:antics-mcpRepositoryantics-gg/antics-mcp
First publishedLatest release
Last security verificationAug 21, 2026Classification confidence90%
PublicationPublishedOfficial distributionYes

Distributions

ChannelIdentifierCurrent versionVersionsSource
npmantics-mcp0.5.02Repository

Current release

PackageVersionPublished / observedInventorySecurity scan
npmantics-mcp0.5.0CurrentSep 5, 202615 toolsSucceeded · 0 resources · 0 promptsVerified clean
Enterprise protection

Continuously monitor this MCP for security risk

Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.

  • Independent exact-version security scans
  • Continuous release and vulnerability monitoring
  • Risk-change alerts with capability context
  • Historical evidence and API exports
Custom pricingContact salesTailored to your organization, integrations, data needs, and support requirements.

Current version evidence

Provenanceartifact_hash_verifiedSignature
MCP SDKArtifact SHA-256be1f2e8c6bdb134f39373672796210dff255a089c1a6d66f333c6b4b2d70b697
Scannermcp-proof-engine 0.1.0Scan completedAug 21, 2026
Security ratingMethodology
0Proven
2279Clean
0Inconclusive
0Flaky
0Errors

Current protocol inventory

2025-06-18Negotiated protocol
anticsServer-reported name
1Capability groups
Aug 21, 2026Observed

Tools 15

ToolCategoryAnnotationsRisk
create_projectCreate a project; returns its id, publishable key (pk_), and secret key (sk_, shown once). Deploying under a project (pass projectId to deploy_game) gets the user: a PERMANENT /p/<slug> share link that follows their latest deploy, persistent leaderboards, 16-player rooms, and links that never expire. Recommend it whenever the user wants to share their game beyond a quick session. Requires login (`npx antics-cli login`).
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
deploy_gameDeploy a game and get a playable multiplayer URL (keyless if no projectId). Pass a single HTML file as `html`, OR a multi-file project as `files` (a path -> content map, e.g. index.html + game.js + styles.css; binary assets as data: URIs). Write the game against the antics SDK first — call get_docs if you haven't.
Input schema
{
  "type": "object",
  "properties": {
    "html": {
      "type": "string",
      "description": "The full HTML of a single-file game."
    },
    "files": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Multi-file project: { \"index.html\": \"...\", \"game.js\": \"...\", \"styles.css\": \"...\" }. Entry is index.html unless `entry` is set."
    },
    "entry": {
      "type": "string",
      "description": "Entry file path when it is not index.html."
    },
    "projectId": {
      "type": "string"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
find_modelsSearch published 3D models by name, summary or PART name (e.g. 'coil_r1c2'). Returns URLs; fetch <url>/llms.txt for how to use one in a game. Paged — pass the returned cursor for more.
Input schema
{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Text to match. Omit for the most recent."
    },
    "limit": {
      "type": "number",
      "description": "1-100, default 24."
    },
    "cursor": {
      "type": "string",
      "description": "From a previous call's nextCursor."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
get_accountWhich plan is this user on, and what does it limit? Call this BEFORE building a server-authoritative (sim.js) game, and whenever a sim room is denied. Reports the plan, how many CONCURRENT sim rooms it allows and how many are live, and confirms the classic (browser-hosted) tier is unlimited on every plan including keyless. Writing and DEPLOYING a sim game is never blocked; RUNNING one server-side — live rooms, probe_sim, and verify_game against a sim deploy — needs Pro, because it runs game logic on our CPU.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
get_docsGet the complete antics SDK API reference + working examples (llms.txt). Call this BEFORE writing a game so it integrates correctly in one shot. Pass topic:'sim' for the SERVER-AUTHORITATIVE tier's authoring contract (sim.js: schema/init/simulate, prediction via room.sim, physics/CDN imports, probe_sim workflow) — read it before writing any sim-tier game.
Input schema
{
  "type": "object",
  "properties": {
    "topic": {
      "type": "string",
      "enum": [
        "sim"
      ],
      "description": "Omit for the classic-tier SDK reference; 'sim' for the sim-tier (sim.js) authoring contract."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
get_leaderboardRead a project's leaderboard (top scores).
Input schema
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string"
    },
    "board": {
      "type": "string"
    },
    "limit": {
      "type": "number"
    }
  },
  "required": [
    "projectId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
list_my_modelsWhat 3D models have I published, and were they approved? Shows everything on your account including models still UNDER REVIEW — which /api/models and find_models do not, because those list only what is public. Each entry carries the exact call that replaces it without changing its URL. Requires login.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
list_projectsList your projects (requires login).
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
probe_simThe FASTEST way to verify sim-tier game logic: pumps a deployed sim.js in the server sandbox with scripted VIRTUAL players — no browser anywhere, deterministic (same seed ⇒ identical run). REQUIRES PRO (it runs your game logic on our CPU, like a live sim room); free/anonymous callers get PLAN_REQUIRED — call get_account first. Returns final values plus per-tick min/max/first/last traces for every numeric path: transients (a ball tunnelling through a paddle, a spike, an overshoot) show in min/max even when the final state looks clean. Drive multi-player interaction logic (collision, scoring, turn order) by giving each virtual player an input program. Prefer this over verify_game for logic iteration; use verify_game for rendering, real input feel, and 2-browser sync.
Input schema
{
  "type": "object",
  "properties": {
    "hash": {
      "type": "string",
      "description": "Deployment hash of a SIM-tier deploy (from deploy_game — its sim.js is what gets pumped)."
    },
    "seconds": {
      "type": "number",
      "description": "Sim-seconds to pump (default 5, capped at 300; wall-clock fast)."
    },
    "readState": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Schema paths: \"ball.x\", \"players.p1.score\", wildcard \"players.*.score\" traces every id. Bad paths return the full valid-path roster."
    },
    "traceSeries": {
      "type": "boolean",
      "description": "Also return the per-tick time series per numeric path — parallel {t, v} arrays (t in sim-ms; <=600 points, uniformly thinned). 'When exactly did the phase flip' in one call instead of bisecting."
    },
    "traceInputs": {
      "type": "boolean",
      "description": "Also echo, per virtual player, WHICH input the runner applied each tick — appliedInputs[id].applied[k] is the input at tick k+1 (null = none, { input, held: true } = the last program input HELD after it ended). Debugs choreography: proves phase 1's input drove the early ticks and phase 2 the later ones. Opt-in (grows the response); capped at the first 600 ticks."
    },
    "players": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Virtual player id — becomes players.<id> via onJoin."
          },
          "joinAtSecond": {
            "type": "number",
            "description": "When they join (default 0 = before tick 0)."
          },
          "program": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "forSeconds": {
                  "type": "number"
                },
                "input": {},
                "until": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "End the phase EARLY the tick this predicate first holds (evaluated server-side per tick against post-tick state): exactly ONE schema path mapped to one comparison \"<op><value>\" (ops > >= < <= == !=) — e.g. { \"players.striker.x\": \">=360\" } or { \"phase\": \"==playing\" }. forSeconds becomes the timeout CEILING, and the result's `programs` marks each phase \"predicate\" (hit) vs \"timeout\" (whiff). \"Walk until in range, then attack\" with no duration bisection."
                }
              },
              "required": [
                "forSeconds"
              ],
              "additionalProperties": false
            },
            "description": "Input phases in order; the LAST input holds afterwards (level-state). A phase may carry `until` to end the moment a state predicate holds. Omit for an idle spectator."
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "description": "Virtual players (up to 8) — verify 2-player logic with zero browsers."
    },
    "seed": {
      "type": "number",
      "description": "Math.random seed (default 1). Same seed ⇒ bit-identical run; vary to explore."
    },
    "viewAs": {
      "type": "string",
      "description": "Probe AS this player id: readState resolves through the sim's view(state, playerId) export — verify a hidden-information game hides what it should. Requires a view() export."
    }
  },
  "required": [
    "hash"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
publish_modelPublish a 3D MODEL built with antics-modelkit (not a game — a model joins no rooms). Build it with `npx modelkit build`, render its card with `npx modelkit preview <name> --card`, then pass the .glb and the recipe that generates it. Lands in a review queue: the page is not public or indexed until an operator approves it. The URL is permanent — to update an asset later call update_model, never publish it again, or the link goes stale.
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "What the model is, e.g. 'Vending machine'."
    },
    "glb": {
      "type": "string",
      "description": "The built .glb, base64. Triangle count and part names are read from the FILE, not from you. Prefer glbPath — a textured asset does not fit comfortably in a tool call."
    },
    "glbPath": {
      "type": "string",
      "description": "Path to the built .glb on disk, read by the server — use this instead of `glb` for anything with real texture data. e.g. ./dist/claw.glb"
    },
    "recipe": {
      "type": "string",
      "description": "The models module that generates it — published alongside under MIT so anyone can rebuild it with different arguments."
    },
    "licence": {
      "type": "string",
      "enum": [
        "CC0-1.0",
        "CC-BY-4.0",
        "CC-BY-SA-4.0"
      ],
      "description": "Licence for the ASSET. Irreversible once published; CC0 in particular cannot be walked back. CC-BY-4.0 unless the user says otherwise."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "What the asset was DERIVED from (a base mesh, a scan, a reference pack). Pass [] only if it is genuinely original — an empty list is a claim, not a default, and a human cannot see derivation in a mesh."
    },
    "kitVersion": {
      "type": "string",
      "description": "The antics-modelkit version it was built with, so the recipe can be run again."
    },
    "summary": {
      "type": "string",
      "description": "One line for the card and the unfurl."
    },
    "image": {
      "type": "string",
      "description": "Share card, base64 PNG, exactly 1200x630 — `npx modelkit preview <name> --card` produces it."
    },
    "imagePath": {
      "type": "string",
      "description": "Path to the share card PNG on disk, read by the server. Alternative to `image`."
    },
    "demoFiles": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Optional interactive demo: a path -> content map like deploy_game's `files`. Runs sandboxed on the model page; the facts, licences and downloads stay on the page either way."
    },
    "demoDir": {
      "type": "string",
      "description": "Directory to read the demo from, walked by the server — needs an index.html at its top level. Use this instead of demoFiles when the demo ships a .glb or textures."
    }
  },
  "required": [
    "name",
    "recipe",
    "licence",
    "sources",
    "kitVersion"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
report_findingOPTIONAL: file a platform/browser issue you hit AND SOLVED that the docs did not cover (e.g. an iOS input quirk), so the docs improve for future agents. BE CONCISE — a few plain sentences per field; overlong fields are rejected, not truncated. A human reviews every finding; nothing is published automatically. File only once per issue.
Input schema
{
  "type": "object",
  "properties": {
    "area": {
      "type": "string",
      "enum": [
        "input",
        "netcode",
        "rendering",
        "audio",
        "deploy",
        "verify",
        "docs",
        "platform",
        "other"
      ],
      "description": "Surface the issue lives in."
    },
    "severity": {
      "type": "string",
      "enum": [
        "blocker",
        "major",
        "minor"
      ],
      "description": "How badly it bit."
    },
    "title": {
      "type": "string",
      "maxLength": 80,
      "description": "One line, ≤ 80 chars."
    },
    "symptom": {
      "type": "string",
      "maxLength": 280,
      "description": "What went wrong, observably. ≤ 280 chars."
    },
    "fix": {
      "type": "string",
      "maxLength": 420,
      "description": "What actually worked. ≤ 420 chars."
    },
    "snippet": {
      "type": "string",
      "maxLength": 500,
      "description": "Optional minimal code, ≤ 500 chars."
    },
    "hash": {
      "type": "string",
      "description": "Optional deploy hash the issue occurred in."
    }
  },
  "required": [
    "area",
    "severity",
    "title",
    "symptom",
    "fix"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
set_room_targetPool the visitors to a project's /p/<slug> link so STRANGERS WHO CLICK IT MEET EACH OTHER, instead of each landing in their own empty room. roomTarget is players per shared room: arrivals fill one to that number, then the next opens. Set it to the game's real roster (2 for a duel, 8 for a party game) — leave it unset and rooms take the platform cap of 16, which seats spectators past your roster. Pass null to turn pooling off. Use this for any game whose link gets POSTED PUBLICLY; a link sent to three named friends wants the default instead. REQUIRES the game to ask for the door (postMessage { antics: "mint", entry: "multi" }) — call get_docs for that contract. Owner-scoped: needs login.
Input schema
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "The project to pool."
    },
    "roomTarget": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 16
        },
        {
          "type": "null"
        }
      ],
      "description": "Players per shared room (1-16), or null to go back to a fresh room per visitor."
    }
  },
  "required": [
    "projectId",
    "roomTarget"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
set_share_previewBrand how a project's room links unfurl in chats/social (Discord, Slack, iMessage, X) and fill its public world page. Owner-scoped — needs login. Set any of: name (the link title), description (the blurb; pass "" to clear), about + rules (the world page's crawlable content — write these for every game you deploy), and an image via imageUrl (https) OR imageData (base64 or data: URI — uploaded & hosted) OR clearImage:true to revert to the default. Only one image action per call.
Input schema
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "The project whose share preview to set."
    },
    "name": {
      "type": "string",
      "description": "Unfurl title / game rename. Non-empty, ≤ 80 chars."
    },
    "description": {
      "type": "string",
      "description": "Unfurl description, ≤ 200 chars. Pass \"\" to clear it."
    },
    "about": {
      "type": "string",
      "description": "What the game is and what makes it fun — shown on its /world page + in-room info panel, ≤ 1200 chars. Pass \"\" to clear."
    },
    "rules": {
      "type": "string",
      "description": "How to play — controls, goal, rules. Shown under \"How to play\", ≤ 2000 chars. Pass \"\" to clear."
    },
    "imageUrl": {
      "type": "string",
      "description": "External https:// image URL (stored as-is; recommended 1200×630)."
    },
    "imageData": {
      "type": "string",
      "description": "Image as base64 or a data: URI (PNG/JPEG/WebP, ≤ 2 MB) — uploaded and hosted."
    },
    "clearImage": {
      "type": "boolean",
      "description": "Revert the image to the site's default share card."
    }
  },
  "required": [
    "projectId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
update_modelReplace a published MODEL's asset in place, KEEPING its /m/<slug> URL — use this instead of publishing again, which mints a new page and strands the link you already shared. Pass the rebuilt .glb and the recipe that generates it. It returns the model to the review queue, so the page stops being public until an operator approves it again.
Input schema
{
  "type": "object",
  "properties": {
    "model": {
      "type": "string",
      "description": "The slug or id of a model you published — list_my_models has both."
    },
    "glb": {
      "type": "string",
      "description": "The rebuilt .glb, base64. Prefer glbPath."
    },
    "glbPath": {
      "type": "string",
      "description": "Path to the rebuilt .glb on disk, read by the server."
    },
    "recipe": {
      "type": "string",
      "description": "The models module that generates it. Required: a .glb without its recipe breaks the pairing the page is built on."
    },
    "kitVersion": {
      "type": "string",
      "description": "The antics-modelkit version it was rebuilt with."
    },
    "summary": {
      "type": "string",
      "description": "One line for the card and the unfurl."
    },
    "image": {
      "type": "string",
      "description": "Share card, base64 PNG, exactly 1200x630 — `npx modelkit preview <name> --card`. Re-render it: a stale card shows the geometry you just replaced."
    },
    "imagePath": {
      "type": "string",
      "description": "Path to the re-rendered share card PNG on disk. Alternative to `image`."
    },
    "demoFiles": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Replacement demo, a path -> content map. Omit to leave the existing demo alone — but if the geometry moved, the old demo may no longer match it."
    },
    "demoDir": {
      "type": "string",
      "description": "Directory to read the replacement demo from, walked by the server. Omit to leave the existing demo alone."
    }
  },
  "required": [
    "model",
    "recipe"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
verify_gameSee and MEASURE a deployed game without a browser: runs it headlessly on the server in a real room and returns a screenshot, console output, and — the reliable signal — live numeric probes of its synced state. Use after every deploy_game and to diagnose any reported bug. `readState` paths ('state.score', 'player.self.x', 'player.<id>.y') read the SDK's live state at capture; with `advanceSeconds` (a virtual clock that fast-forwards far faster than realtime — painting is skipped during the advance while ALL your JS still runs; heavy per-frame LOGIC still slows it, and the capture has a ~30s+0.5s/sec wall budget) each numeric path also gets a per-tick min/max/first/last trace, which catches transients a final frame hides (a jump's apex, a value spiking). Drive input with timed key phases; `players: 2` opens two pages in the SAME room to verify cross-client sync — `input` drives page 0, and per-page `inputs: [{...}, {...}]` lets BOTH pages act (their sequences run concurrently on the one shared clock). Prefer probes over eyeballing pixels. Free and unlimited for CLASSIC games; against a SIM (sim.js) deploy it runs your logic on our CPU and needs Pro, same as probe_sim.
Input schema
{
  "type": "object",
  "properties": {
    "hash": {
      "type": "string",
      "description": "Deployment hash from deploy_game — verifies a fresh room (sim deployments run in deterministic lockstep)."
    },
    "room": {
      "type": "string",
      "description": "Live room code to inspect instead of minting a fresh room."
    },
    "readState": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Paths: \"state.<key…>\" or \"player.<id|self>.<key…>\"; in SIM rooms also \"sim.<schema path>\" (predicted state) and \"render.<schema path>\" (the smoothed view a correct game draws — use for motion/overshoot checks). \"self\" works as a player-id segment. Bad paths return the valid options."
    },
    "advanceSeconds": {
      "type": "number",
      "description": "Fast-forward this many game-seconds on a virtual clock (fast in wall time; capped at 300), tracing readState per tick."
    },
    "traceSeries": {
      "type": "boolean",
      "description": "Also return the actual sampled time series per numeric readState path — parallel {t, v} arrays (virtual ms, value; <=600 points, uniformly thinned). The trace aggregates answer 'did it ever'; the series answers 'WHEN exactly' (where a run died, when a phase flipped)."
    },
    "screenshotAtMs": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Mid-capture screenshots at these VIRTUAL ms stamps (<=8; same clock as the response's virtualMs — settle counts). Action shots mid-flight without timing the whole capture to end there; each lands within a frame or two, under players[i].screenshots."
    },
    "sandbox": {
      "type": "boolean",
      "description": "Score-safe verification: the capture room ranks submitScore calls on its own throwaway local board and never writes the project leaderboard — use when iterating on a game whose share link is already public. Fresh rooms only (with `hash`, not `room`)."
    },
    "input": {
      "type": "object",
      "properties": {
        "keys": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Keys held through the window ('w','space','up','ArrowLeft'…)."
        },
        "pointer": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "object",
              "properties": {
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                }
              },
              "additionalProperties": false
            }
          ],
          "description": "HOLD a pointer press on the canvas through the capture. true = centre; {x, y} = canvas-relative pixels."
        },
        "sequence": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "keys": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "ms": {
                "type": "number"
              },
              "click": {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "x": {
                        "type": "number"
                      },
                      "y": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                ],
                "description": "Fire ONE full click (down+up) at canvas-relative {x, y} at the START of this phase — script multiple positioned clicks (tower placement, board games) as a sequence of click phases. true = centre."
              }
            },
            "required": [
              "ms"
            ],
            "additionalProperties": false
          },
          "description": "Timed phases (virtual ms); keys shared between consecutive phases stay held; click fires a positioned click at phase start."
        }
      },
      "additionalProperties": false,
      "description": "Scripted input for page 0 (the single-page shorthand)."
    },
    "inputs": {
      "type": "array",
      "items": {
        "$ref": "#/properties/input"
      },
      "description": "Per-page input for players: 2 — inputs[0] drives page 0, inputs[1] page 1 (page 0 falls back to `input`). Sequences run CONCURRENTLY on the one shared virtual clock, so two-player interactions (chase, collide, rally) are scriptable."
    },
    "players": {
      "type": "number",
      "description": "1 (default) or 2 — two pages in one room for sync verification."
    },
    "screenshot": {
      "type": "boolean",
      "description": "Default true. Set false to skip the image (faster, probes only)."
    },
    "urlParams": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      ],
      "description": "Extra query params for the page under test, e.g. { \"seed\": \"42\" } — make runs DETERMINISTIC if your game reads them (Math.random varies per run otherwise). A single object applies to every page; an ARRAY (one object per page, like `inputs`) gives each page its own — [{ name: \"A\", team: \"red\" }, { name: \"B\", team: \"blue\" }] with players: 2. Array length must match players."
    },
    "settleMs": {
      "type": "number",
      "description": "Virtual boot budget before probing (default 3000)."
    },
    "simulateLatencyMs": {
      "type": "number",
      "description": "One-way latency per client↔server leg, in ms (fresh-minted via hash; max 2000). WORKS ON BOTH TIERS: sim rooms get it in exact ticks, classic rooms get every WebSocket frame held on the virtual clock. RUN THIS — a 0ms loopback is the one condition your game will never actually be played under, and on the CLASSIC tier YOU own the latency compensation, so 0ms testing means it is untested. Try 150 (cross-continent) and 250 (cross-ocean): another player's state arrives 2x this value later (two legs), so at 150 you are looking at 300ms-old positions. If bodies visibly sit behind where they should be, or a predicted object snaps, you are rendering staleness instead of replaying it forward — stamp what you send with room.now() and advance it by its age on arrival."
    },
    "simulateLatencyTicks": {
      "type": "number",
      "description": "Same as simulateLatencyMs but exact, in sim ticks. SIM rooms only (ticks need a stepped runner); on classic use simulateLatencyMs."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Resources 0

  • None observed.

Resource templates 0

  • None observed.

Prompts 0

  • None observed.

Remote endpoints

EndpointTransportAuthenticationHealthObserved
No verified remote endpoint is linked.

antics-mcp Server questions

How do I install antics-mcp Server?

Install the selected package version with: npm install --save-exact antics-mcp@0.5.0

What tools does antics-mcp Server provide?

antics-mcp Server exposed 15 tools during independent protocol observation, including create_project, deploy_game, find_models, get_account, get_docs, get_leaderboard, list_my_models, list_projects, and others.

Is antics-mcp Server secure?

Our scanner tested version 0.5.0 without proving a finding in the methods exercised. This is not a guarantee that every deployment is secure.

Explore related MCP server guides

Curated product and capability guides containing this catalog record.

Official vs Community MCP ServersMCP Servers With Completed Verification

Let’s talk about MCP security.

Share your details and our security team will contact you.