emptysock-mcp
Provides read-only integration with GameMaker Studio 2, allowing inspection of .yyp project files and returning a JSON summary with project name, asset counts, and lists of object and script names.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@emptysock-mcpFind a path from (10,10) to (50,50) on map level1."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
emptysock-mcp
Model Context Protocol server for the EmptySock game engine. Exposes engine systems — NavMesh, Physics, Scene, Save, Actor, Particles, and Story Graph — as MCP tools consumable by Claude Desktop, AI agents, and the Claude API.
Requirements
Node.js 20+
npm 9+
Related MCP server: Hayba
Installation
git clone https://github.com/eleferrets/emptysock-mcp.git
cd emptysock-mcp
npm install
npm run buildConfiguration
Copy the example env file and fill in any values you need:
cp .env.example .envVariable | Required | Description |
| No | Bearer token for authenticated engine API calls |
| No | Required bearer token on SSE transport requests. Leave blank to disable auth. |
| No | Absolute path the save tools may read/write. Defaults to the process working directory. Set explicitly in production. |
Never commit
.env— it is gitignored. Store secrets in your CI/CD secret manager, not in the repository.
Running the server
stdio (recommended for local use and Claude Desktop)
npm run dev # development — tsx, no build step
# or after building:
node dist/server.jsThe server communicates over stdin/stdout. There is no network port and no authentication surface.
Claude Desktop
Add the server to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"emptysock": {
"command": "node",
"args": ["/absolute/path/to/emptysock-mcp/dist/server.js"],
"env": {
"SAVE_BASE_DIR": "/absolute/path/to/your/saves"
}
}
}
}Restart Claude Desktop. The EmptySock tools will appear in the tool picker.
Available tools
NavMesh
Tool | Description |
| A* path between two 2D world points on a loaded navmesh. Returns ordered waypoints or |
| Nearest walkable navmesh node to a given world point. |
Example — find path:
{
"from": { "x": 0, "y": 0 },
"to": { "x": 100, "y": 50 },
"mapId": "level1"
}Physics
Tool | Description |
| Cast a ray in 2D physics space; returns first hit entity, hit point, and normal. |
| Cast a ray in 3D physics space (Rapier3D); returns first hit. |
| All entity IDs whose 2D colliders overlap a circle. |
| Current position, velocity, and angular velocity of a physics body by entity ID. |
Example — overlap circle:
{
"center": { "x": 50, "y": 50 },
"radius": 20,
"layerMask": 3
}Scene
Tool | Description |
| All entity IDs active in a scene. |
| Tag, active state, and component list for a specific entity. |
| Serialised state of a specific component on an entity. |
| Add a new entity to a scene. Returns the new entity's ID. |
Example — get component:
{
"sceneId": "gameplay",
"entityId": "player-001",
"componentType": "Transform"
}Save
All save tools are sandboxed to SAVE_BASE_DIR. Path traversal (.., absolute paths) is rejected at the schema layer and again at resolution time.
Tool | Description |
| Read a save slot from disk and return its JSON data. |
| Write a JSON object to a named save slot. |
| Delete a save slot. |
| List all available save slots. |
Example — write:
{
"slot": "autosave",
"data": { "level": 3, "score": 4200, "checkpoint": "bridge" }
}Slot names are alphanumeric + dashes/underscores only (e.g. slot1, autosave, new-game-plus).
Actor
Tool | Description |
| Enqueue a message in a specific actor's inbox. Processed on the next ActorSystem flush. |
| Broadcast a message to all registered actors. |
| Number of pending messages in an actor's inbox. |
Example — send message:
{
"actorId": "enemy-spawner",
"message": { "type": "SPAWN_WAVE", "payload": { "wave": 3 } }
}Ordering note: ActorSystem drains every actor's inbox before calling
update(). Messages sent during frame N are fully processed before frame N's update logic runs.
GMS2
Tool | Description |
| Read a GameMaker Studio 2 |
| Reference information about the EmptySock LayerSystem API — available methods and usage examples. |
Particles
Tool | Description |
| Get or set a ParticleSystem emitter configuration by emitter ID. Omit |
Example — read config:
{ "emitterId": "dust" }Example — write config:
{
"emitterId": "dust",
"config": { "maxParticles": 200, "emitRate": 60, "colorStart": "#ffcc00" }
}Story Graph
Tool | Description |
| Export the Story Graph (VNSystem) for a named scene as a JSON object containing nodes and edges. |
Example:
{ "sceneId": "chapter1", "graphId": "intro" }Development
npm run lint # TypeScript type-check (no emit)
npm test # run Vitest suite
npm run test:watch # watch modeTests live in src/tests/. They cover input validation, tool dispatch, and security invariants (path traversal, shell metacharacter injection, unknown tool names).
Adding a tool
Create
src/tools/<domain>.ts— export atoolDefarray entry and ahandlerfunction.Register both in
src/tools/index.tsvia theregister()call inbuildRegistry().Add an entry to
api-reference.jsoninemptysock-engine.Add a skill file to
eleferrets/emptysock-ai-skills.
Use the shared helpers in src/lib/:
parse(schema, raw)— Zod parse that throwsMcpError(InvalidParams)on failureSafeRelPath,SafeId,Vec2,Vec3,GameNum— reusable Zod schemastextResponse(data)— builds the standard MCP text content responsewrapError(err)— logs to stderr and re-throws asMcpError(InternalError)
Security model
Concern | Mitigation |
Malformed arguments | Zod |
Path traversal |
|
Shell injection | No |
Credential leakage | Secrets from |
Oversized inputs | String lengths bounded on every schema field |
Unknown tools |
|
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLM-driven text game state management by exposing MCP tools for managing players, locations, items, entities, and abstract concepts.MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server enabling AI agents to author Unreal Engine 5 scenes directly, with tools for spawning actors, building PCG graphs, validating physics, generating terrain, and more through a single MCP connection.12MIT
- FlicenseNot gradedqualityDmaintenanceConnects Claude Code to the Unity Editor via MCP, enabling AI-driven control of scenes, assets, components, UI, animations, and more through 91 tools.2-
- AlicenseCqualityAmaintenanceEnables AI-driven game development by providing MCP tools to interact with the Godot editor, including scene editing, node manipulation, script attachment, and scene execution.2827MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/eleferrets/emptysock-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server