Skip to main content
Glama
Triggered0

lcu-mcp

by Triggered0

lcu-mcp

License: MIT Node Tests

Ein MCP-Server, der einen laufenden League-of-Legends-Client für jeden MCP-Host verfügbar macht – die LCU-REST-API, seinen Live-OnJsonApiEvent-Stream und das eigene DOM und den JavaScript-Kontext der Client-Oberfläche, als neun Tools über stdio.

Fragen Sie Ihren Assistenten, in welcher Warteschlange Sie sich befinden, beobachten Sie die Champion-Auswahl Ereignis für Ereignis, untersuchen Sie das DOM des Clients oder steuern Sie den Client selbst – ohne eine Zeile Klebecode zu schreiben.

Inhalt

Related MCP server: League of Legends MCP Server

So funktioniert's

Zwei unabhängige Subsysteme laufen in einem Node-Prozess:

  • LcuClient liest die Lockfile des Clients, um Port und Passwort zu ermitteln, spricht dann REST über HTTPS mit Riot's Root-CA (gepinnt) und hält einen WebSocket-Tap auf OnJsonApiEvent, der einen prozessinternen Ringpuffer speist.

  • CdpClient verbindet sich mit dem Chrome-DevTools-Protocol-Endpunkt des Clients (bereitgestellt von Pengu Loader) für DOM-Abfragen und JavaScript-Auswertung.

Beide verbinden sich lazy und überstehen Client-Neustarts – der Lockfile-Port ändert sich bei jedem Start, daher wird das Verzeichnis überwacht und nicht die Datei. Ereignisse werden gepollt statt gepusht, weil MCP kein Server-zu-Client-Push hat.

Design-Entscheidungen und die live verifizierten Protokolldetails finden sich in docs/design.md.

Voraussetzungen

Node.js

>= 24 (ESM, kein Build-Schritt)

League of Legends

Läuft. Die Lockfile unter C:\Riot Games\League of Legends\lockfile liefert Port und Passwort.

Pengu Loader

Optional – nur für lol_dom_query und lol_eval erforderlich. Alles andere funktioniert ohne sie.

In der Praxis nur Windows: Der Standard-Lockfile-Pfad und die Pengu-Integration sind Windows-spezifisch.

Installation

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

Die Laufzeitabhängigkeiten sind genau drei: @modelcontextprotocol/sdk, zod und ws.

Registrierung bei einem MCP-Host

Claude Code

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

Jeder Host, der .mcp.json liest

{
  "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 ist optional; ohne sie sucht der Server nach config/allowlist.json relativ zu seinem Arbeitsverzeichnis und fällt auf integrierte Standardwerte zurück, wenn diese Datei nicht existiert.

Tools

Tool

Zweck

lol_status

Gesundheit pro Subsystem, aufgelöster LCU-Port, konfigurierter CDP-Port, ob allowEval aktiv ist

lol_get(path)

GET beliebiger LCU-Pfad

lol_request(method, path, body?)

Beliebiges Verb, abhängig von der Schreib-Allowlist

lol_endpoints(filter?)

Liste der kuratierten Endpunkt-Tabelle

lol_events_start(filters?)

WebSocket-Tap öffnen und Pufferung starten

lol_events_poll(since?, limit?, filter?)

Ringpuffer leeren

lol_events_stop()

Tap schließen

lol_dom_query(selector, all?, props?)

Client-DOM abfragen

lol_eval(expression, awaitPromise?)

JavaScript in der Seite auswerten

lol_status zuerst. Wenn etwas anderes fehlschlägt, sagt es Ihnen, welche Hälfte down ist – ein geschlossener Client sieht ganz anders aus als eine fehlende Pengu-Installation.

Ereignisse werden gepollt. lol_events_poll gibt einen cursor zurück; geben Sie ihn beim nächsten Mal als since zurück. Ein von Null verschiedenes dropped bedeutet, dass der Ringpuffer überlief und so viele Ereignisse nach Ihrem Cursor verloren gingen. Einträge mit truncated: true hatten ihre data auf 4 KB gekürzt – holen Sie den vollständigen Body mit lol_get über die uri des Eintrags erneut.

Der Client sendet nur bei Zustandsänderungen. Wenn er auf dem Startbildschirm untätig ist, kann er unbegrenzt still bleiben; das Navigieren in der UI oder das Betreten einer Lobby erzeugt Bursts. Eine leere Abfrage bedeutet normalerweise, dass nichts passiert ist, nicht dass der Tap defekt ist – prüfen Sie running und lol_status, um die beiden zu unterscheiden.

Filter sind URI-Präfixe, die beim Erfassen angewendet werden. Der ungefilterte Datenstrom füllt den Puffer schnell, also übergeben Sie etwas wie ["/lol-champ-select/", "/lol-gameflow/"], es sei denn, Sie wollen wirklich alles.

Konfiguration

config/allowlist.json:

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

Schlüssel

Standard

Bedeutung

allowEval

true

Ob lol_eval JavaScript in der Seite ausführen darf

cdpPort

8888

Remote-Debugging-Port von Pengu Loader

eventBufferSize

1000

Ringpufferkapazität; älteste Einträge werden zuerst verworfen

writeAllowlist

[]

Welche mutierenden Anfragen lol_request senden darf

Regeln für den Allowlist-Abgleich:

  • Ein Eintrag ist METHOD path. Die Methode wird case-insensitiv verglichen, der Pfad case-sensitiv.

  • GET und HEAD sind immer erlaubt und benötigen keinen Eintrag.

  • * ist nur als abschließendes Pfadsegment sinnvoll: /a/b/* passt auf /a/b/c, aber nicht auf /a/b/c/d und nicht auf /a/b. Überall sonst ist es ein literales Zeichen.

  • Ein abgelehnter Aufruf gibt die genaue Konfigurationszeile zurück, die ihn erlauben würde, und die Anfrage wird nie gesendet.

DOM-Zugriff aktivieren

lol_dom_query und lol_eval benötigen den CEF-Remote-Debugging-Port des Clients, den Riot's Build nur über Pengu Loader öffnet – ein extern hinzugefügtes --remote-debugging-port-Flag wird ignoriert.

Pengus Konfiguration ist einfacher key=value-Text, ein Paar pro Zeile – kein JSON, kein INI. In C:\Program Files\Pengu Loader\config setzen Sie:

RemoteDebuggingPort=8888

Starten Sie dann die Client-UX neu, damit CEF den Port übernimmt:

POST /riotclient/kill-and-restart-ux

Das lässt ein laufendes Spiel unberührt. Bis dahin schlagen beide Tools mit diesen genauen Anweisungen fehl, statt mit einem nackten ECONNREFUSED.

Sicherheit

  • TLS-Verifizierung bleibt aktiv. Das selbstsignierte Zertifikat der LCU wird gegen Riot's Root-CA validiert, die unter certs/riotgames.pem mitgeliefert wird. Der Server setzt nie rejectUnauthorized: false.

  • Das Passwort verlässt nie den Prozess. Es wird nur gehalten, um den Authorization-Header zu erstellen – kein Tool gibt es zurück, nichts protokolliert es, und Fehlertexte werden davon bereinigt, bevor sie den Host erreichen. CDP-Ziel-URLs enthalten es ebenfalls, daher werden sie geschwärzt, bevor ein Tool sie zurückgibt.

  • lol_eval umgeht die Schreib-Allowlist konstruktionsbedingt. Die Client-Seite kann jeden LCU-Endpunkt von ihrer eigenen Origin aus fetchen, daher kann ausgewertetes JavaScript alles tun, was der Client kann. Das wird akzeptiert, nicht behoben: Es wird durch das allowEval-Flag gesteuert, dessen Zustand lol_status meldet.

Behandeln Sie die Schreib-Allowlist als Schutz vor Fehlern, nicht als Sicherheitsgrenze – solange allowEval true ist, kann sie umgangen werden. Setzen Sie allowEval auf false für eine echte Grenze. lol_dom_query funktioniert weiterhin, weil es den Selektor als Daten und nicht als Code injiziert.

Entwicklung

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 gibt pro Stufe eine Zeile aus und beendet sich mit 1, wenn eine Stufe fehlschlägt. Es wird nie in CI ausgeführt. Die Ereignisstufe wartet auf echte Zustellung und meldet drei Ergebnisse: PASS, wenn Ereignisse eingetroffen sind, SKIP, wenn der Tap verbunden war, aber ein untätiger Client nichts sendete, und FAIL, wenn der Tap nicht verbunden werden konnte.

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

Fehlerbehebung

Symptom

Ursache

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

Der Client ist geschlossen oder an einem anderen Ort als dem Standardpfad installiert.

Jedes CDP-Tool schlägt mit einem Pengu-Hinweis fehl

Pengu Loader ist nicht aktiv oder RemoteDebuggingPort ist nicht gesetzt. Folgen Sie DOM-Zugriff aktivieren.

no "page" target

CDP ist erreichbar, aber die UX startet noch. Versuchen Sie es erneut, sobald der Client sichtbar ist.

lol_events_poll gibt nichts zurück

Normalerweise ein untätiger Client, kein Fehler. Navigieren Sie in der UI und fragen Sie erneut ab; prüfen Sie running in der Antwort.

Ein Schreibvorgang wird abgelehnt

Das Verb und der Pfad stehen nicht auf der Allowlist. Die Fehlermeldung enthält die genaue Zeile, die hinzugefügt werden muss.

TLS-Fehler bei jedem REST-Aufruf

Die mitgelieferte CA ist falsch oder veraltet. Korrigieren Sie die PEM – deaktivieren Sie niemals die Verifizierung.

Haftungsausschluss

lcu-mcp wird nicht von Riot Games unterstützt und gibt nicht die Ansichten oder Meinungen von Riot Games oder von Personen wieder, die offiziell an der Produktion oder Verwaltung von Riot-Games-Eigentum beteiligt sind. Riot Games und alle zugehörigen Eigentumsrechte sind Marken oder eingetragene Marken von Riot Games, Inc.

Dieses Projekt verwendet die eigene lokale API des Clients. Sie sind für die Verwendung verantwortlich; die Automatisierung von Gameplay kann gegen die Nutzungsbedingungen von Riot verstoßen.

Lizenz

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