lcu-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LCU_MCP_CONFIG | No | Optional path to the JSON configuration file that sets allowEval, cdpPort, eventBufferSize, and writeAllowlist. If not set, the server looks for config/allowlist.json relative to its working directory, and falls back to built-in defaults if that file does not exist. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| lol_statusA | Health of both subsystems: LCU (lockfile-derived port, connected state) and CDP (Pengu remote debugging port, attached target), plus event tap state and effective config. Call this first when another tool fails. |
| lol_getA | GET any LCU path and return { status, body }. Always allowed. Use lol_endpoints to discover the paths this client is known to expose. |
| lol_requestA | Send any HTTP verb to an LCU path. GET and HEAD are always allowed; every other verb must match an entry in the write allowlist, otherwise the call is refused with the exact config line that would permit it. |
| lol_endpointsA | The curated endpoint table: the LCU paths this project actually uses, with the verb, a group, and a one-line description. {placeholder} marks a path parameter. Optional filter is a case-insensitive substring matched against verb, path, group, and description. |
| lol_schemaC | Inspect internal LCU API endpoint signatures, parameters, request bodies, and models using the client's live OpenAPI/Swagger v2 specification. |
| lol_events_startA | Open the OnJsonApiEvent tap and buffer events in memory. Filters are URI prefixes applied at ingest, e.g. "/lol-champ-select/" — the unfiltered firehose fills the buffer in seconds, so pass filters unless you truly want everything. Calling this while already running replaces the filters and keeps buffered entries. |
| lol_events_pollA | Return buffered events with seq greater than "since", plus the new cursor. A non-zero "dropped" means the buffer wrapped and that many events were lost after your cursor. Entries with truncated: true had their data clipped at 4 KB — re-fetch the full body with lol_get on the entry uri. |
| lol_events_stopA | Close the event tap. Buffered entries stay readable with lol_events_poll. |
| lol_dom_queryA | Run document.querySelector(All) inside the client UI and return a description of the matches (tag, id, className, trimmed text, plus any requested properties). Needs Pengu Loader's remote debugging port; check lol_status if it fails. |
| lol_evalA | Evaluate an expression in the client UI's own context and return its value. Because the page can fetch any LCU endpoint from its own origin, this bypasses the write allowlist by construction — it is gated by the allowEval config flag, whose state lol_status reports. |
| lol_wamp_record_startA | Open a second WAMP socket to the LCU, independent of lol_events_*, and record every frame plus the socket lifecycle (open, close with its code, error, reconnect gap) into one timeline. Defaults to the firehose, which is what lets you tell "the socket died" (every URI goes quiet at once) from "nothing happened" (one URI quiet, others flowing). Passing uris subscribes per URI instead, which reproduces what a page-side plugin sees but cannot distinguish those two cases. Starting while a recording is already running is an error: pass restart to discard the old one. |
| lol_wamp_record_dumpA | Return the recorded timeline plus per-URI stats. "stats" is cumulative since the recording started and survives buffer eviction, so a URI that fired and was evicted is still distinguishable from one that never fired. A non-zero "dropped" means entries after your cursor were evicted. Lifecycle entries survive a uri filter; only "kinds" can exclude them. Times are epoch milliseconds, comparable with the page clock. |
| lol_wamp_record_stopA | Close the recorder socket. The recorded timeline stays readable with lol_wamp_record_dump. |
| lol_cdp_console_startA | Attach to the client renderer and begin buffering console output and uncaught exceptions in the background. A page reload does not interrupt this: the debug target survives it, so logging continues with no gap and no reattach entry. Only when the target itself is destroyed and recreated — the client UI restarting — does the tailer re-attach, and it records a "reattach" entry for that. Call this BEFORE the thing you want to capture: the buffer only holds what arrived after it started. |
| lol_cdp_console_tailA | Return buffered console entries after your cursor. Times are epoch milliseconds: "ts" is this process's anchored clock, "pageTs" is the renderer's own stamp, and their difference is a delivery-latency signal. "reattach" entries mark renderer reloads and survive every filter, because a reload is context for whatever you are reading. Errors if the tailer is not running rather than returning an empty result. |
| lol_cdp_console_stopA | Detach and close the tailer socket. Buffered entries are discarded with it. |
| lol_restart_uxA | Terminates and restarts the League Client UX (frontend CEF renderers) via Riot Client. Essential when developing Pengu Loader plugins or recovering from a frozen interface. |
| lol_cdp_targetsB | List all active CDP debugging targets (pages, popups, background workers) exposed by the League Client. |
| lol_cdp_screenshotB | Capture a screenshot of the League Client window using CDP. Returns both an MCP image content block and JSON metadata, and optionally saves to disk. |
| lol_forensics_correlateB | Combines WAMP recorder events and CDP console entries into a chronological timeline, answering whether the client emitted an event and where the frontend broke. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Tools are generally distinct by function (events, WAMP recording, CDP console, LCU REST, DOM/eval), but a few pairs overlap: lol_events_poll vs lol_wamp_record_dump both return buffered timeline entries with cursors and dropped counts, and lol_cdp_console_tail is similarly shaped. Descriptions help differentiate event bus vs WAMP socket vs console, but the three polling tools share enough surface to risk misselection.
Consistent snake_case with a domain_action pattern (lol_events_start/poll/stop, lol_cdp_console_start/tail/stop, lol_wamp_record_start/dump/stop). Minor deviations: lol_get, lol_request, lol_status, lol_schema drop the domain prefix or use a bare verb, and lol_restart_ux uses an action-object order unlike the dominant object_action order.
20 tools is slightly heavy but justified by the breadth of subsystems covered (LCU REST, event tap, WAMP recorder, CDP console/targets/screenshot, DOM/eval, UX restart, forensics, status). Each has a distinct operational role, though the three start/poll/stop triplets push the count toward the upper bound.
Strong lifecycle coverage per subsystem: start/poll/stop for events, start/dump/stop for WAMP recording, start/tail/stop for CDP console, plus generic lol_get/lol_request/lol_endpoints for LCU access, status, forensics correlation, DOM query, eval, screenshot, and UX restart. Gaps are minor: no explicit write-allowlist management tool, and CDP target attachment is read-only via lol_cdp_targets.