Skip to main content
Glama
Triggered0

lcu-mcp

by Triggered0

lcu-mcp

License: MIT Node Tests

Un servidor MCP que expone un cliente de League of Legends en ejecución a cualquier host MCP — la API REST de LCU, su flujo en vivo OnJsonApiEvent, y el propio DOM y contexto JavaScript de la interfaz del cliente, como nueve herramientas sobre stdio.

Pregúntale a tu asistente en qué cola estás, observa cómo se desarrolla la selección de campeones evento por evento, inspecciona el DOM del cliente o controla el propio cliente — sin escribir una línea de código de integración.

Contenido

Related MCP server: League of Legends MCP Server

Cómo funciona

Dos subsistemas independientes se ejecutan dentro de un mismo proceso de Node:

  • LcuClient lee el archivo lockfile del cliente para descubrir el puerto y la contraseña, luego habla REST sobre HTTPS con la CA raíz de Riot fijada, y mantiene un grifo WebSocket en OnJsonApiEvent que alimenta un búfer circular en el proceso.

  • CdpClient se conecta al endpoint de Chrome DevTools Protocol del cliente (expuesto por Pengu Loader) para consultas del DOM y evaluación de JavaScript.

Ambos se conectan de forma perezosa y sobreviven a los reinicios del cliente — el puerto del lockfile cambia en cada lanzamiento, por lo que se observa el directorio en lugar del archivo. Los eventos se sondean en lugar de enviarse, porque MCP no tiene push de servidor a cliente.

La justificación del diseño y los detalles del protocolo verificados en vivo están en docs/design.md.

Requisitos

Node.js

>= 24 (ESM, sin paso de compilación)

League of Legends

En ejecución. El lockfile en C:\Riot Games\League of Legends\lockfile proporciona el puerto y la contraseña.

Pengu Loader

Opcional — requerido solo para lol_dom_query y lol_eval. Todo lo demás funciona sin él.

Solo Windows en la práctica: la ruta predeterminada del lockfile y la integración con Pengu son específicas de Windows.

Instalación

git clone https://github.com/Triggered0/lcu-mcp.git
cd lcu-mcp
npm install

Las dependencias de ejecución son exactamente tres: @modelcontextprotocol/sdk, zod y ws.

Registro con un host MCP

Claude Code

claude mcp add lcu --scope user -- node C:\path\to\lcu-mcp\src\index.js

Cualquier host que lea .mcp.json

{
  "mcpServers": {
    "lcu": {
      "command": "node",
      "args": ["C:\\path\\to\\lcu-mcp\\src\\index.js"],
      "env": { "LCU_MCP_CONFIG": "C:\\path\\to\\lcu-mcp\\config\\allowlist.json" }
    }
  }
}

LCU_MCP_CONFIG es opcional; sin él, el servidor busca config/allowlist.json relativo a su directorio de trabajo, y recurre a los valores predeterminados integrados si ese archivo no existe.

Herramientas

Herramienta

Propósito

lol_status

Salud por subsistema, puerto LCU resuelto, puerto CDP configurado, si allowEval está activado

lol_get(path)

GET a cualquier ruta LCU

lol_request(method, path, body?)

Cualquier verbo, sujeto a la lista blanca de escritura

lol_endpoints(filter?)

Lista la tabla de endpoints curada

lol_events_start(filters?)

Abre el grifo WebSocket y comienza a almacenar en búfer

lol_events_poll(since?, limit?, filter?)

Vacía el búfer circular

lol_events_stop()

Cierra el grifo

lol_dom_query(selector, all?, props?)

Consulta el DOM del cliente

lol_eval(expression, awaitPromise?)

Evalúa JavaScript en la página

lol_status primero. Cuando cualquier otra cosa falla, te dice qué mitad está caída — un cliente cerrado no se parece en nada a una instalación de Pengu faltante.

Los eventos se sondean. lol_events_poll devuelve un cursor; pásalo de vuelta como since la próxima vez. Un dropped distinto de cero significa que el búfer circular se envolvió y que se perdieron tantos eventos después de tu cursor. Las entradas con truncated: true tuvieron su data recortada a 4 KB — vuelve a obtener el cuerpo completo con lol_get en el uri de la entrada.

El cliente solo emite cuando el estado cambia. Sentado inactivo en la pantalla de inicio puede permanecer en silencio indefinidamente; navegar por la interfaz o entrar en una sala produce ráfagas. Una encuesta vacía generalmente significa que no pasó nada, no que el grifo esté roto — comprueba running y lol_status para distinguir los dos casos.

Los filtros son prefijos de URI aplicados en la ingesta. El flujo sin filtrar llena el búfer rápidamente, así que pasa algo como ["/lol-champ-select/", "/lol-gameflow/"] a menos que realmente quieras todo.

Configuración

config/allowlist.json:

{
  "allowEval": true,
  "cdpPort": 8888,
  "eventBufferSize": 1000,
  "writeAllowlist": [
    "POST /lol-matchmaking/v1/ready-check/accept",
    "PATCH /lol-champ-select/v1/session/actions/*"
  ]
}

Clave

Predeterminado

Significado

allowEval

true

Si lol_eval puede ejecutar JavaScript en la página

cdpPort

8888

Puerto de depuración remota de Pengu Loader

eventBufferSize

1000

Capacidad del búfer circular; las entradas más antiguas se eliminan primero

writeAllowlist

[]

Qué solicitudes mutantes lol_request puede enviar

Reglas de coincidencia de la lista blanca:

  • Una entrada es METHOD path. El método se compara sin distinguir mayúsculas de minúsculas, la ruta distinguiendo mayúsculas de minúsculas.

  • GET y HEAD siempre están permitidos y no necesitan entrada.

  • * solo tiene significado como segmento de ruta final: /a/b/* coincide con /a/b/c pero no con /a/b/c/d ni con /a/b. En cualquier otro lugar es un carácter literal.

  • Una llamada rechazada devuelve la línea de configuración exacta que la permitiría, y la solicitud nunca se envía.

Habilitar el acceso al DOM

lol_dom_query y lol_eval necesitan el puerto de depuración remota CEF del cliente, que la compilación de Riot solo abre a través de Pengu Loader — una bandera --remote-debugging-port añadida externamente se ignora.

La configuración de Pengu es texto plano clave=valor, un par por línea — no JSON, no INI. En C:\Program Files\Pengu Loader\config, establece:

RemoteDebuggingPort=8888

Luego reinicia la interfaz del cliente para que CEF tome el puerto:

POST /riotclient/kill-and-restart-ux

Esto deja un juego en vivo intacto. Hasta que suceda, ambas herramientas fallan con estas instrucciones exactas en lugar de un simple ECONNREFUSED.

Seguridad

  • La verificación TLS permanece activada. El certificado autofirmado de LCU se valida contra la CA raíz de Riot, incluida en certs/riotgames.pem. El servidor nunca establece rejectUnauthorized: false.

  • La contraseña nunca sale del proceso. Se mantiene solo para construir el encabezado Authorization — ninguna herramienta la devuelve, nada la registra, y el texto de error se limpia de ella antes de que llegue al host. Las URL de destino de CDP también la incrustan, por lo que se redactan antes de que cualquier herramienta las devuelva.

  • lol_eval elude la lista blanca de escritura por construcción. La página del cliente puede hacer fetch a cualquier endpoint de LCU desde su propio origen, por lo que el JavaScript evaluado puede hacer cualquier cosa que el cliente pueda. Esto se acepta, no se corrige: está controlado por la bandera allowEval, cuyo estado informa lol_status.

Trata la lista blanca de escritura como una protección contra errores, no como un límite de seguridad — mientras allowEval sea true, se puede eludir. Establece allowEval en false para un límite real. lol_dom_query sigue funcionando, porque inyecta el selector como dato en lugar de como código.

Desarrollo

npm test        # unit tests via node:test — no League client needed
npm run smoke   # live end-to-end check against a running client
npm start       # run the server on stdio

npm run smoke imprime una línea por etapa y sale con 1 si alguna etapa falla. Nunca se ejecuta en CI. La etapa de eventos espera la entrega real e informa tres resultados: PASS cuando llegaron eventos, SKIP cuando el grifo se conectó pero un cliente inactivo no envió nada, y FAIL cuando el grifo no pudo conectarse.

src/
  index.js          # stdio transport and tool registration
  config.js         # config loading and validation
  allowlist.js      # pure write-allowlist matching
  redact.js         # strip passwords from URLs and strings
  lcu/
    lockfile.js     # parse, read, and watch the lockfile
    client.js       # REST with the pinned CA
    buffer.js       # ring buffer with cursor and drop accounting
    ingest.js       # pure ingest policy: prefix filters, truncation
    events.js       # WebSocket tap with backoff reconnect
  cdp/
    discover.js     # probe the debugging port, pick and redact the target
    client.js       # attach, evaluate, DOM query
  tools/            # one module per tool group
tests/              # one test file per source module

Solución de problemas

Síntoma

Causa

League client is not running: no lockfile at ...

El cliente está cerrado, o instalado en un lugar distinto a la ruta predeterminada.

Cada herramienta CDP falla con una pista de Pengu

Pengu Loader no está activo, o RemoteDebuggingPort no está configurado. Sigue Habilitar el acceso al DOM.

no "page" target

CDP es accesible pero la interfaz aún se está iniciando. Reintenta una vez que el cliente sea visible.

lol_events_poll no devuelve nada

Generalmente un cliente inactivo, no un fallo. Navega por la interfaz y vuelve a sondear; comprueba running en la respuesta.

Una escritura es rechazada

El verbo y la ruta no están en la lista blanca. El mensaje de error contiene la línea exacta a añadir.

Errores TLS en cada llamada REST

La CA incluida es incorrecta o está desactualizada. Corrige el PEM — nunca desactives la verificación.

lcu-mcp no está respaldado por Riot Games y no refleja las opiniones de Riot Games ni de nadie involucrado oficialmente en la producción o gestión de las propiedades de Riot Games. Riot Games y todas las propiedades asociadas son marcas comerciales o marcas registradas de Riot Games, Inc.

Este proyecto utiliza la API local del propio cliente. Eres responsable de cómo la usas; automatizar el juego puede violar los Términos de Servicio de Riot.

Licencia

MIT © Triggered

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    An MCP (Model-Controller-Processor) server for accessing League of Legends client data. This server provides a collection of tools that communicate with the League of Legends Live Client Data API to retrieve in-game data.
    12
    12
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Provides MCP tools to query Liquipedia esports data (matches, teams, players, tournaments, placements, standings) via the Liquipedia v3 API and MediaWiki action API.
    8
    MIT

View all related MCP servers

Related MCP Connectors

  • Riot Games API MCP.

  • Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).

  • Speedrun.com MCP — wraps the Speedrun.com API v1 (speedrun.com/api/v1)

View all MCP Connectors

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/Triggered0/lcu-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server