Skip to main content
Glama

emptysock-mcp

Servidor de Model Context Protocol para el motor de juegos EmptySock. Expone los sistemas del motor — NavMesh, Physics, Scene, Save y Actor — como herramientas MCP consumibles por Claude Desktop, agentes de IA y la API de Claude.


Requisitos

  • Node.js 20+

  • npm 9+


Related MCP server: Hayba

Instalación

git clone https://github.com/eleferrets/emptysock-mcp.git
cd emptysock-mcp
npm install
npm run build

Configuración

Copia el archivo de entorno de ejemplo y completa los valores que necesites:

cp .env.example .env

Variable

Requerido

Descripción

EMPTYSOCK_API_TOKEN

No

Token Bearer para llamadas autenticadas a la API del motor

MCP_AUTH_TOKEN

No

Token Bearer requerido en las peticiones de transporte SSE. Déjalo vacío para desactivar la autenticación.

SAVE_BASE_DIR

No

Ruta absoluta que las herramientas de guardado pueden leer/escribir. Por defecto, el directorio de trabajo del proceso. Establécelo explícitamente en producción.

Nunca hagas commit de .env — está en gitignore. Guarda los secretos en el gestor de secretos de tu CI/CD, no en el repositorio.


Ejecutar el servidor

stdio (recomendado para uso local y Claude Desktop)

npm run dev          # development — tsx, no build step
# or after building:
node dist/server.js

El servidor se comunica a través de stdin/stdout. No hay ningún puerto de red ni superficie de autenticación.

Claude Desktop

Añade el servidor a la configuración de Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json en macOS):

{
  "mcpServers": {
    "emptysock": {
      "command": "node",
      "args": ["/absolute/path/to/emptysock-mcp/dist/server.js"],
      "env": {
        "SAVE_BASE_DIR": "/absolute/path/to/your/saves"
      }
    }
  }
}

Reinicia Claude Desktop. Las herramientas de EmptySock aparecerán en el selector de herramientas.


Herramientas disponibles

NavMesh

Herramienta

Descripción

navmesh_find_path

Ruta A* entre dos puntos del mundo 2D en una navmesh cargada. Devuelve waypoints ordenados o [] si no existe ninguna ruta.

navmesh_nearest_node

Nodo de navmesh transitable más cercano a un punto del mundo dado.

Ejemplo — encontrar ruta:

{
  "from": { "x": 0, "y": 0 },
  "to":   { "x": 100, "y": 50 },
  "mapId": "level1"
}

Physics

Herramienta

Descripción

physics_raycast_2d

Lanza un rayo en el espacio de física 2D; devuelve la primera entidad impactada, el punto de impacto y la normal.

physics_raycast_3d

Lanza un rayo en el espacio de física 3D (Rapier3D); devuelve el primer impacto.

physics_overlap_circle

Todos los IDs de entidad cuyos colisionadores 2D se superponen con un círculo.

physics_body_state

Posición, velocidad y velocidad angular actuales de un cuerpo de física según el ID de entidad.

Ejemplo — solapamiento de círculo:

{
  "center": { "x": 50, "y": 50 },
  "radius": 20,
  "layerMask": 3
}

Scene

Herramienta

Descripción

scene_list_entities

Todos los IDs de entidad activos en una escena.

scene_entity_info

Etiqueta, estado activo y lista de componentes de una entidad específica.

scene_get_component

Estado serializado de un componente específico en una entidad.

Ejemplo — obtener componente:

{
  "sceneId": "gameplay",
  "entityId": "player-001",
  "componentType": "Transform"
}

Save

Todas las herramientas de guardado están restringidas a SAVE_BASE_DIR. El path traversal (.., rutas absolutas) se rechaza en la capa de esquema y de nuevo en el momento de la resolución.

Herramienta

Descripción

save_read

Lee una ranura de guardado del disco y devuelve sus datos JSON.

save_write

Escribe un objeto JSON en una ranura de guardado con nombre.

save_delete

Elimina una ranura de guardado.

save_list

Lista todas las ranuras de guardado disponibles.

Ejemplo — escribir:

{
  "slot": "autosave",
  "data": { "level": 3, "score": 4200, "checkpoint": "bridge" }
}

Los nombres de las ranuras solo pueden contener caracteres alfanuméricos, guiones y guiones bajos (p. ej. slot1, autosave, new-game-plus).


Actor

Herramienta

Descripción

actor_send_message

Pone un mensaje en la cola de la bandeja de entrada de un actor específico. Se procesa en el siguiente vaciado de ActorSystem.

actor_broadcast

Transmite un mensaje a todos los actores registrados.

actor_inbox_size

Número de mensajes pendientes en la bandeja de entrada de un actor.

Ejemplo — enviar mensaje:

{
  "actorId": "enemy-spawner",
  "message": { "type": "SPAWN_WAVE", "payload": { "wave": 3 } }
}

Nota sobre el orden: ActorSystem vacía la bandeja de entrada de todos los actores antes de llamar a update(). Los mensajes enviados durante el frame N se procesan antes de que se ejecute la lógica de actualización del frame N.


Desarrollo

npm run lint        # TypeScript type-check (no emit)
npm test            # run Vitest suite
npm run test:watch  # watch mode

Los tests se encuentran en src/tests/. Cubren la validación de entrada, el despacho de herramientas y los invariantes de seguridad (path traversal, inyección de metacaracteres de shell, nombres de herramientas desconocidos).


Cómo añadir una herramienta

  1. Crea src/tools/<domain>.ts — exporta una entrada de array toolDef y una función handler.

  2. Registra ambas en src/tools/index.ts mediante la llamada a register() en buildRegistry().

  3. Añade una entrada a api-reference.json en emptysock-engine.

  4. Añade un archivo de skill a eleferrets/emptysock-ai-skills.

Usa los helpers compartidos en src/lib/:

  • parse(schema, raw) — parse de Zod que lanza McpError(InvalidParams) al fallar

  • SafeRelPath, SafeId, Vec2, Vec3, GameNum — esquemas Zod reutilizables

  • textResponse(data) — construye la respuesta estándar de contenido de texto de MCP

  • wrapError(err) — escribe en stderr y vuelve a lanzar como McpError(InternalError)


Modelo de seguridad

Riesgo

Mitigación

Argumentos malformados

Zod safeParse en cada entrada; se devuelve McpError(InvalidParams) al fallar

Path traversal

Esquema SafeRelPath + comprobación de contención con path.resolve en el manejador de guardado

Inyección de shell

Sin exec() con plantillas de cadena; execFile con arrays de argv cuando se necesiten subprocesos

Fuga de credenciales

Secretos solo desde process.env; las trazas de pila se registran en stderr, nunca al cliente

Entradas demasiado grandes

Longitudes de cadena limitadas en cada campo del esquema

Herramientas desconocidas

McpError(MethodNotFound) — sin reenvío a manejadores no previstos

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLM-driven text game state management by exposing MCP tools for managing players, locations, items, entities, and abstract concepts.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An 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.
    13
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Connects Claude Code to the Unity Editor via MCP, enabling AI-driven control of scenes, assets, components, UI, animations, and more through 91 tools.
    2
    -
  • A
    license
    C
    quality
    A
    maintenance
    Enables AI-driven game development by providing MCP tools to interact with the Godot editor, including scene editing, node manipulation, script attachment, and scene execution.
    28
    27
    MIT

Latest Blog Posts

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