lcu-mcp
One-line summary: lcu-mcp is an MCP server that hands an AI host live access to a running League of Legends client — reading its local REST API, streaming its events, inspecting and evaluating code in its UI, and (within a guardrail allowlist) driving it.
Check health first —
lol_statusreports LCU connection/port, CDP attach state, event tap state, and effective config, so you can tell which half is down.Read anything from the LCU REST API —
lol_get(path)fetches any client endpoint (always allowed).Send any HTTP verb —
lol_request(method, path, body?)for writes, but non-GET/HEAD verbs only go through if they match the write allowlist; a refusal returns the exact config line needed.Discover endpoints —
lol_endpoints(filter?)lists the curated table of known paths with verb, group, and description.Stream live client events —
lol_events_start(filters?)opens theOnJsonApiEventWebSocket tap;lol_events_poll(since?, limit?, filter?)drains it by cursor (watchdroppedfor buffer wrap andtruncatedfor 4 KB clips);lol_events_stop()closes it.Inspect the client DOM —
lol_dom_query(selector, all?, props?)runsquerySelector(All)in the client UI and returns tag, id, class, text, and requested properties.Run JavaScript in the page —
lol_eval(expression, awaitPromise?)evaluates expressions in the client's own context; gated byallowEval, and it bypasses the write allowlist by construction.
(Per the README, the server additionally offers WAMP traffic recording, CDP console tailing, screenshots and target listing, UX restart, OpenAPI schema introspection, and cross-timeline forensics.)
Caveats: two subsystems must be live — the LCU lockfile (client running) and, for DOM/eval, Pengu Loader's remote debugging port. Events are polled, not pushed, and an idle client stays silent. Treat the write allowlist as a mistake-guard, not a security boundary while allowEval is true.
Provides tools for interacting with the League of Legends client, including querying the LCU REST API, streaming live game events, inspecting the client UI via CDP, and optionally executing JavaScript in the client.
Click on "Deploy 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., "@lcu-mcpWhat's my current queue and champ select status?"
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.
lcu-mcp
An MCP server that exposes a running League of Legends client to any MCP host — the LCU REST API, live WAMP events & recording, client DOM and CDP console, and OpenAPI schema introspection over stdio.
Ask your assistant what queue you are in, watch champ select unfold event by event, inspect the client's DOM, or drive the client itself — without writing a line of glue code.
Contents
Related MCP server: League of Legends MCP Server
How it works
Two independent subsystems run inside one Node process:
LcuClientreads the client's lockfile to discover the port and password, then talks REST over HTTPS with Riot's root CA pinned, and holds a WebSocket tap onOnJsonApiEventthat feeds an in-process ring buffer.CdpClientattaches to the client's Chrome DevTools Protocol endpoint (exposed by Pengu Loader) for DOM queries and JavaScript evaluation.
Both connect lazily and survive client restarts — the lockfile port changes on every launch, so the directory is watched rather than the file. Events are polled rather than pushed, because MCP has no server-to-client push.
Requirements
Node.js | >= 24 (ESM, no build step) |
League of Legends | Running. The lockfile at |
Pengu Loader | Optional — required only for |
Windows only in practice: the default lockfile path and the Pengu integration are Windows-specific.
Installation
Via npx (Recommended, zero install)
Run directly with npx:
npx -y lcu-mcpFrom source
git clone https://github.com/Triggered0/lcu-mcp.git
cd lcu-mcp
npm installRuntime dependencies are exactly three: @modelcontextprotocol/sdk, zod, and ws.
Registering with an MCP host
Claude Code
# Recommended: via npx
claude mcp add lcu --scope user -- npx -y lcu-mcp
# Or from a local clone:
claude mcp add lcu --scope user -- node C:\path\to\lcu-mcp\src\index.jsAny host that reads .mcp.json
{
"mcpServers": {
"lcu": {
"command": "npx",
"args": ["-y", "lcu-mcp"]
}
}
}Or from a local repository clone:
{
"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 is optional; without it 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.
Tools
Tool | Purpose |
| Per-subsystem health, resolved LCU port, configured CDP port, whether |
| GET any LCU path |
| Any verb, subject to the write allowlist |
| List the curated endpoint table |
| Open the WebSocket tap and begin buffering |
| Drain the ring buffer |
| Close the tap |
| Query the client DOM |
| Evaluate JavaScript in the page |
| Record LCU WAMP traffic on an independent socket |
| Dump the recorded timeline and per-URI stats |
| Close the recorder socket |
| Begin buffering client console output |
| Read buffered console entries |
| Stop and discard the console buffer |
| Safely restart client CEF renderers with readiness polling |
| List all active CDP debugging targets (pages, popups, workers) |
| Capture client screenshot via CDP (returns MCP image + disk save) |
| Query internal LCU OpenAPI/Swagger v2 schemas and models |
| Correlate WAMP recorder and CDP console timelines on a shared time axis |
lol_status first. When anything else fails it tells you which half is down — a closed client looks nothing like a missing Pengu install.
Events are polled. lol_events_poll returns a cursor; pass it back as since next time. A non-zero dropped means the ring 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's uri.
The client only emits when state changes. Sitting idle on the home screen it can stay silent indefinitely; navigating the UI or entering a lobby produces bursts. An empty poll usually means nothing happened, not that the tap is broken — check running and lol_status to tell the two apart.
Diagnosing a missing event. lol_wamp_record_* runs on its own WAMP socket
outside the client renderer, so it proves what the LCU actually emitted and
when. Read it together with lol_cdp_console_tail and a lol_eval probe to
separate three cases: the LCU never emitted, it emitted but the page never
received, or the page received and mishandled. Start both recorders before
the thing you want to observe — they only hold what arrived after they started.
Filters are URI prefixes applied at ingest. The unfiltered firehose fills the buffer quickly, so pass something like ["/lol-champ-select/", "/lol-gameflow/"] unless you genuinely want everything.
Configuration
config/allowlist.json:
{
"allowEval": true,
"cdpPort": 8888,
"eventBufferSize": 1000,
"writeAllowlist": [
"POST /lol-matchmaking/v1/ready-check/accept",
"PATCH /lol-champ-select/v1/session/actions/*"
]
}Key | Default | Meaning |
|
| Whether |
|
| Pengu Loader's remote debugging port |
|
| Ring buffer capacity; oldest entries are evicted first |
|
| Which mutating requests |
|
| Recorder timeline entry count |
|
| Recorder byte budget; evicts on whichever fills first |
|
| Per-payload truncation for the recorder |
|
| URI prefixes exempt from the payload cap |
|
| Optional NDJSON path the timeline is appended to |
|
| Console tailer entry count |
Allowlist matching rules:
An entry is
METHOD path. The method is compared case-insensitively, the path case-sensitively.GETandHEADare always allowed and need no entry.*is only meaningful as a trailing path segment:/a/b/*matches/a/b/cbut not/a/b/c/dand not/a/b. Anywhere else it is a literal character.A refused call returns the exact config line that would permit it, and the request is never sent.
Enabling DOM access
lol_dom_query and lol_eval need the client's CEF remote debugging port, which Riot's build only opens through Pengu Loader — an externally added --remote-debugging-port flag is ignored.
Pengu's config is plain key=value text, one pair per line — not JSON, not INI. In C:\Program Files\Pengu Loader\config, set:
RemoteDebuggingPort=8888Then restart the client UX so CEF picks the port up:
POST /riotclient/kill-and-restart-uxThis leaves a live game untouched. Until it happens, both tools fail with these exact instructions rather than a bare ECONNREFUSED.
Security
TLS verification stays on. The LCU's self-signed certificate is validated against Riot's root CA, vendored at
certs/riotgames.pem. The server never setsrejectUnauthorized: false.The password never leaves the process. It is held only to build the
Authorizationheader — no tool returns it, nothing logs it, and error text is scrubbed of it before it reaches the host. CDP target URLs embed it too, so they are redacted before any tool returns them.lol_evalbypasses the write allowlist by construction. The client page canfetchany LCU endpoint from its own origin, so evaluated JavaScript can do anything the client can. This is accepted, not fixed: it is gated by theallowEvalflag, whose statelol_statusreports.
Treat the write allowlist as a guardrail against mistakes, not as a security boundary — while
allowEvalistrueit can be bypassed. SetallowEvaltofalsefor a real boundary.lol_dom_querykeeps working, because it injects the selector as data rather than as code.
Development
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 stdionpm run smoke prints one line per stage and exits 1 if any stage fails. It is never run in CI. The event stage waits for real delivery and reports three outcomes: PASS when events arrived, SKIP when the tap connected but an idle client sent nothing, and FAIL when the tap could not connect.
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 moduleTroubleshooting
Symptom | Cause |
| The client is closed, or installed somewhere other than the default path. |
Every CDP tool fails with a Pengu hint | Pengu Loader is not active, or |
| CDP is reachable but the UX is still starting. Retry once the client is visible. |
| Usually an idle client, not a fault. Navigate the UI and poll again; check |
A write is refused | The verb and path are not on the allowlist. The error message contains the exact line to add. |
TLS errors on every REST call | The vendored CA is wrong or stale. Fix the PEM — never disable verification. |
Disclaimer
lcu-mcp is not endorsed by Riot Games and does not reflect the views or opinions of Riot Games or anyone officially involved in producing or managing Riot Games properties. Riot Games and all associated properties are trademarks or registered trademarks of Riot Games, Inc.
This project uses the client's own local API. You are responsible for how you use it; automating gameplay may violate Riot's Terms of Service.
License
MIT © Triggered
Available Tools
20 toolslol_cdp_console_startStart tailing the client consoleA
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the target survives a page reload so logging continues without a gap, and that only a target destruction/recreation triggers a re-attach plus a recorded 'reattach' entry. It omits auth/permission requirements and buffer size or retention limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each carrying distinct information (what it does, reload survival, ordering constraint). The action and the key 'call before' constraint are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, no-output-schema lifecycle tool, the description covers initiation behavior, persistence semantics, and timing thoroughly. It could be marginally more complete by pointing to lol_cdp_console_tail for reading the buffer it fills.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly describes the operation as a no-argument background attach and adds no misleading parameter implications.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: attaching to the client renderer and buffering console output plus uncaught exceptions. It is clearly distinguishable from the sibling lol_cdp_console_tail (which reads the buffer) and lol_cdp_console_stop (which ends it).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule: 'Call this BEFORE the thing you want to capture,' because the buffer only holds what arrived after start. It does not explicitly name the read/stop siblings as the natural next steps, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_cdp_console_stopStop tailing the client consoleA
Detach and close the tailer socket. Buffered entries are discarded with it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses a real side effect — buffered entries are discarded — which is exactly the kind of irreversibility hint an agent needs. It stops short of saying what happens when no tailer is running, whether the call is idempotent, or whether it errors, so coverage is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with zero filler. The primary action comes first and the consequence follows immediately, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter teardown tool with no output schema and no annotations, the description covers the action and the main side effect. A note on the precondition (an active tailer) or error behavior would close the remaining gap, but an agent can call this correctly as written.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema is an empty object with zero parameters and full coverage, so there is nothing for the description to document. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Detach and close the tailer socket'), which maps cleanly to the tool name and title. It does not, however, explicitly distinguish itself from siblings like lol_cdp_console_start, lol_cdp_console_tail, or lol_events_stop, so an agent must infer that this is the teardown counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the name and the paired start/tail siblings make it clear this ends a console tailing session, but the description never states when to call it, what precondition it expects (an active tailer), or when an alternative teardown tool is preferable. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_cdp_console_tailRead buffered client console outputA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | case-insensitive substring of the message | |
| level | No | console severity, e.g. "error" or "warning" | |
| limit | No | max entries, default 100 | |
| since | No | lower bound on ts, epoch milliseconds | |
| until | No | upper bound on ts, epoch milliseconds | |
| cursor | No | seq cursor from a previous tail | |
| targetId | No | restrict to one renderer incarnation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it explains the ts vs pageTs clocks and their difference as a latency signal, discloses that 'reattach' entries bypass every filter because reloads are context, and states that a stopped tailer produces an error rather than an empty result. It stops short of stating read-only/repeat-safety or the cost of large limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler: purpose first, then the timestamp model, then filter-exemption and failure semantics. The latency-signal framing is dense but front-loaded and each sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, zero-required, annotation-free read tool with no output schema, the description covers timestamp fields, filter-exempt entries, and error behavior, but never describes the shape of a returned entry (message, level, seq) or how cursor and limit interact for pagination. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters and the baseline is 3. The description reinforces cursor semantics and explains that ts bounds (the 'since'/'until' params) are epoch milliseconds on the process's anchored clock, but adds no syntax or format detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return buffered console entries') and adds the incremental-read mechanism ('after your cursor'), which inherently separates it from the sibling start/stop console tools. An agent knows this is a cursor-based polling read, not a one-shot dump or a lifecycle control.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'after your cursor' implies the intended incremental-polling pattern, and the error behavior hints at a prerequisite (tailer must be running). However, no alternatives are named (e.g. lol_cdp_console_start, lol_events_poll) and there is no explicit when-not guidance, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_cdp_screenshotCapture screenshot of the League ClientB
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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Image format | png |
| quality | No | Compression quality for jpeg/webp | |
| savePath | No | Optional file path to save screenshot on disk | |
| targetId | No | CDP target ID to screenshot (defaults to active main page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add useful behavioral context: returns both an MCP image content block AND JSON metadata, and optionally saves to disk. However, it doesn't disclose failure modes (e.g., what happens if CDP isn't connected, whether targetId defaults to active page is described in the schema not description), or whether this is read-only. Moderate disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single well-structured sentence with the key mechanism and outputs front-loaded. No waste, though it could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should carry more weight. It notes the return shape (image block + JSON metadata) which is helpful, but lacks prerequisites (CDP must be active), failure behavior, and any note that this is a read/safe operation. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are documented in the schema with defaults and constraints. The description adds only the high-level notion that savePath is optional, which repeats the schema's 'Optional file path' description. Baseline 3 applies when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Capture a screenshot of the League Client window') with the mechanism named (CDP). Clearly distinguishes itself from siblings like lol_dom_query or lol_eval, which inspect state rather than produce an image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no alternatives named, no conditions under which a screenshot is preferred over other inspection tools like lol_eval or lol_dom_query. The agent must infer that this is for visual capture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_cdp_targetsList CDP debugging targetsB
List all active CDP debugging targets (pages, popups, background workers) exposed by the League Client.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It implies a read-only enumeration via 'List' and names what is enumerated, but says nothing about permissions, whether the client must be running, freshness, or invocation cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The verb and resource come first and the parenthetical adds precision without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should hint at the return shape (target identifiers usable by the other CDP tools). It names the target categories but not how results are keyed or consumed, leaving a gap for a discovery tool with several dependent siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document beyond the empty schema. Baseline 4 applies; no additional parameter meaning is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus a specific resource (CDP debugging targets) with a parenthetical enumerating the target kinds. An agent understands exactly what it returns. It does not distinguish itself from the CDP siblings (console_start, screenshot), so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use framing, but listing active targets implies a discovery step before attaching to a target via lol_cdp_console_start, lol_cdp_screenshot, or lol_eval. That implication is left for the agent to infer rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_dom_queryQuery the League client DOMA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | true returns every match, false (default) the first | |
| props | No | extra element properties or attributes to include, e.g. ["disabled", "href"] | |
| selector | Yes | CSS selector, e.g. ".lol-uikit-flat-button" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full disclosure burden. It reveals a key prerequisite (Pengu Loader's remote debugging port), describes the output format (tag, id, className, trimmed text, plus requested properties), and names a failure path. It doesn't explicitly say the operation is read-only, but querySelector semantics imply that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with the core action front-loaded and the dependency/failure note appended. No filler or repeated schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completeness is good for a 3-param query tool: it specifies the return description format (useful since there is no output schema), the runtime dependency, and the failure fallback. Minor gaps include pagination/limits on matches and the exact shape of returned objects, but nothing blocking a call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all, props, and selector. The description's 'plus any requested properties' aligns with the props param but adds no syntax or format details beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource pair: runs document.querySelector(All) inside the client UI and returns match descriptions. This is unambiguous and clearly distinct from siblings like lol_get (generic get) and lol_eval (arbitrary JS execution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The DOM-inspection purpose is self-evident, and it explicitly routes to lol_status as an alternative diagnostic if the remote debugging port fails. It doesn't enumerate when-not-to-use versus siblings like lol_eval, but the querySelector framing makes the intended use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_endpointsList curated LCU 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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | e.g. "champ-select", "ready-check", "summoner" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavior. It discloses the case-insensitive substring filter behavior and the fields returned (verb, group, description). It does not specify the exact output format (e.g., array of objects) or pagination, leaving minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose, and every sentence adds meaningful detail. The filter behavior is explained succinctly without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one optional parameter, the description is largely complete. It specifies what is returned (verb, group, description) and filter behavior. The absence of an output schema is partially mitigated by the described table structure, though exact JSON format is not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides the filter parameter and examples, but the description adds value by explaining case-insensitivity and the fields it matches (verb, path, group, description). This goes beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the tool lists curated LCU endpoints with verb, group, and one-line description. It is distinct from siblings like lol_get/lol_request that execute calls, and the phrase 'this project actually uses' clarifies scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for discovering the endpoints the project supports, which separates it from the call-execution tools. However, it does not explicitly mention when to use it vs. alternatives or provide exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_evalEvaluate JavaScript in the client pageA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | a JavaScript expression, not a statement list | |
| awaitPromise | No | true to await a returned promise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that evaluation bypasses the write allowlist by construction and is gated by allowEval, which is significant behavioral context. It also implies code execution capabilities. It does not mention error handling or side effects, but the key traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It leads with the purpose, then adds a crucial behavioral note about bypass and gating. Every word earns its place, and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a potentially powerful evaluation tool with only 2 parameters and no output schema, the description adequately covers the return value and the prerequisite flag. It does not specify timeout or error behaviors, but those are minor gaps given the simplicity of the interface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptive text for both parameters ('expression' and 'awaitPromise') with 100% coverage, so the description adds no extra parameter-level detail beyond what the schema gives. The recommended baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'evaluate' and the resource 'expression in the client UI's own context', and notes that it returns the value. It also highlights the unique property of bypassing the write allowlist, which distinguishes it from other tools, though it does not explicitly name a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a gate condition (allowEval config flag) and points to lol_status for checking it, which is useful. However, it does not offer explicit when/when-not guidance relative to siblings like lol_get or lol_request, leaving the agent to infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_events_pollDrain buffered LCU eventsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | max entries to return, default 100 | |
| since | No | cursor from the previous poll; omit to start at 0 | |
| filter | No | extra URI prefix applied at poll time |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does an excellent job: it clarifies the cursor semantics, warns about the 'dropped' field indicating data loss from buffer wrap, and explains the 'truncated' field with a concrete remediation path via lol_get. This is strong transparency for a polling tool. It does not, however, state whether polling advances a cursor or clears the buffer (though 'plus the new cursor' implies advancement), and it omits any mention of side effects or read-only guarantees, which keeps it slightly below a perfect score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero fluff. It front-loads the primary function (return events since cursor), immediately explains the two special output fields (dropped, truncated) with actionable guidance, and stays tightly focused. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling tool with 3 parameters and no output schema, the description covers the essential elements: the cursor mechanism, the dropped-event warning, and the truncated-data recovery path. It does not specify the full response shape (e.g., whether an empty array is returned when no events exist, or the structure of each event beyond its URI), but given the tool's complexity and the specific edge cases it does address, it is nearly complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter already has a description in the schema. The description adds value by clarifying that 'since' acts as a cursor from the previous poll, aligning with the tool's sequencing logic. However, it does not add extra meaning for 'limit' or 'filter' beyond what the schema provides. Since the schema carries the heavy lifting, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb ('Return') and a specific resource ('buffered events') with a precise condition ('seq greater than since') and explicit output elements (new cursor, dropped, truncated). The name 'lol_events_poll' plus the clear behavior distinguishes it from siblings like lol_events_start/stop, and it even references lol_get for re-fetching truncated entries, reinforcing its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: it's a poll operation that drains buffered events, and it gives a concrete instruction to re-fetch truncated entries via lol_get. However, it does not explicitly state when to use this tool versus alternatives (e.g., only after starting event capture with lol_events_start), nor does it mention any prerequisites or exclusion conditions. The usage context is mostly inferable from the name and behavior, not explicitly described.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_events_startStart buffering LCU eventsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | URI prefixes, e.g. ["/lol-champ-select/", "/lol-gameflow/"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden, and it delivers substantial behavior: it discloses the memory-risk side effect ('fills the buffer in seconds'), the ingest-time filtering behavior, and the idempotent re-call semantics (replaces filters, preserves buffer). Minor gaps: it does not state whether the buffer persists after stop or what teardown entails, but the operational warnings and re-call contract are meaningfully beyond what structured fields would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly composed sentences with zero waste. The core action is front-loaded in sentence one, the filter guidance with its safety warning sits in sentence two, and the re-call behavior is the single remaining fact in sentence three. Every sentence earns its place and there is no redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema and no annotations, the description is nearly complete: it covers the primary action, the parameter semantics with a concrete example, the risk of unfiltered use, and the idempotent re-call behavior. The only shortfall is no mention of return value or failure modes (e.g., LCU not connected), which is minor for a side-effect starter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the filters param is documented with pattern and example), so the baseline is 3. The description adds operational meaning beyond the mechanical definition: 'Filters are URI prefixes applied at ingest' clarifies timing, and the buffer-danger note explains why filters matter. This converts the parameter from a mere format spec into a functional design decision, exceeding the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'Open the OnJsonApiEvent tap and buffer events in memory.' It clearly identifies this as the start/buffer action, distinguishing itself from siblings like lol_events_poll (retrieval) and lol_events_stop (teardown) without any ambiguity. The resource name and action are concrete and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on the key usage decision — 'pass filters unless you truly want everything' — and explains the consequence ('the unfiltered firehose fills the buffer in seconds'). It also documents the re-invocation contract: 'Calling this while already running replaces the filters and keeps buffered entries.' It does not explicitly name sibling alternatives for routing, but the filter-or-not guidance and re-call semantics cover the core usage choices for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_events_stopStop buffering LCU eventsA
Close the event tap. Buffered entries stay readable with lol_events_poll.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses the primary behavior (closing the tap) and a key side effect (buffered entries remain readable via lol_events_poll). It doesn't mention idempotency or behavior if called without a prior start, but those are minor for a stop operation. This adds value beyond what would be obvious from the name alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The primary action is front-loaded ('Close the event tap'), and the only additional detail (buffered entries remain readable) is essential context. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully covers what the agent needs: what it does and the key consequence. No missing information that would prevent correct usage. The simple nature of the operation means no additional context is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description correctly makes no mention of parameters. The schema is empty (100% coverage), and the baseline for 0-parameter tools is 4. The description provides no additional parameter guidance, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') and a resource ('event tap'), which clearly distinguishes it from siblings like start and poll. It also states the outcome: buffered entries stay readable, removing ambiguity about its effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly says 'stop buffering' and notes that buffered entries remain accessible, which tells the agent it's used after events have been started. However, it doesn't explicitly state when not to use it or mention any alternative, though the simplicity of the operation makes this acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_forensics_correlateCorrelate LCU WAMP and CDP console timelinesB
Combines WAMP recorder events and CDP console entries into a chronological timeline, answering whether the client emitted an event and where the frontend broke.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum total events to return | |
| since | No | Lower timestamp bound in epoch ms or clock ts | |
| until | No | Upper timestamp bound in epoch ms or clock ts | |
| format | No | Output format | narrative |
| levels | No | Filter CDP console entries by level | |
| uriPrefix | No | Filter WAMP events by URI prefix (e.g. /lol-gameflow/) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses that it merges two event sources chronologically and what question it answers, which is useful behavioral context, but it omits key traits such as the prerequisite recordings, whether the operation is read-only, and how the three output formats differ.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly written sentence that front-loads the core action and the diagnostic payoff with no wasted words. Slightly dense but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must do more of the work. It does not explain where the source data comes from (requiring prior recording sessions), nor does it describe the narrative/events/summary output shapes, leaving meaningful gaps for a six-parameter correlation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (limit, since, until, format, levels, uriPrefix) are already documented in the schema, including the enum for format and levels. The description adds no syntax or semantic detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource combination ("Combines WAMP recorder events and CDP console entries into a chronological timeline") and further states the diagnostic questions it answers. This is clear and distinguishable from recording/tailing siblings, though it never names the dump/tail tools it consumes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the diagnostic framing ("whether the client emitted an event and where the frontend broke"). There is no explicit statement of when to reach for this over lol_wamp_record_dump or lol_cdp_console_tail, and no mention of the prerequisite that recorders must already be running.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_getGET an LCU endpointA
GET any LCU path and return { status, body }. Always allowed. Use lol_endpoints to discover the paths this client is known to expose.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return shape and states 'Always allowed', giving a safety hint. However, it does not describe error behavior, rate limits, or consequences of invalid paths. For a simple GET, this is partial coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action and return format are front-loaded, and the pointer to lol_endpoints is useful. Very efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter GET tool with no output schema, the description covers the essential aspects: what it does, what it returns, and how to find valid inputs (via lol_endpoints). It could mention error handling, but the delegation to lol_endpoints mitigates the need. Overall reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'path' parameter in detail beyond 'any LCU path'. It points to lol_endpoints for discovery, which compensates somewhat, but the description itself adds little semantic detail about the parameter's format or valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (GET), resource (any LCU path), and return shape ({ status, body }). Names a sibling (lol_endpoints) for discovery, which also helps differentiate its scope. The 'Always allowed' adds a constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives some guidance: use lol_endpoints to discover paths, and 'Always allowed' implies no restrictions. However, it does not explicitly contrast with alternative tools like lol_request (likely for non-GET methods) or specify when not to use this tool. The guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_requestCall an LCU endpoint with any verbA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON request body; omit for verbs that take none | |
| path | Yes | ||
| method | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations given, the description carries the full burden of disclosing behavior. It specifies that GET/HEAD are permitted unconditionally, other verbs must match a write allowlist, and refusals return the exact config line needed to allow the request. This is a valuable behavioral disclosure that goes beyond the schema. It does not cover response format or error handling, but the core restrictions and refusal behavior are clearly stated, making it above average.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long and immediately front-loads the core action ('Send any HTTP verb to an LCU path') before explaining the allowlist nuance. There is zero wasted wording, and every clause contributes to the agent's understanding. This is a model of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has three parameters, no output schema, and no annotations, the description adequately explains the allowlist constraint and refusal behavior. However, it does not mention expected response format, error handling, or the fact that paths are relative to the LCU API. These gaps could lead to incorrect invocations or misinterpretation of results, so while it is serviceable, it is not fully complete for a generic HTTP request tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is only 33% (only 'body' has a description). The tool description adds very little parameter-specific meaning—it mentions 'any HTTP verb' but does not elaborate on acceptable path formats, the meaning of the parameters, or provide examples. Since the description does not compensate for the low schema coverage and fails to clarify the method/path semantics beyond the enum and pattern, it scores a 2.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: sending any HTTP verb to an LCU path. This distinguishes it from siblings like lol_get, which presumably only handles GET requests, and lol_status, which likely queries status. The verb 'send' plus the resource 'LCU path' makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: GET and HEAD are always allowed, while other verbs require explicit allowlist entries, and it explains the refusal behavior. However, it does not explicitly mention when to use this tool versus a more specific sibling like lol_get, nor does it provide exclusions or alternatives. The allowlist rule essentially defines the usage boundary, earning a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_restart_uxRestart the League Client 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.
| Name | Required | Description | Default |
|---|---|---|---|
| waitForReady | No | Wait until both LCU API and CDP target are fully responsive after restart | |
| timeoutSeconds | No | Maximum seconds to wait for UX readiness when waitForReady is true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that this is a terminate-and-restart mutation and that readiness can be awaited, but it omits side effects an agent should know: in-flight client state is lost, plugin/CEF context is destroyed, and there is no statement of permissions or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the action front-loaded and the rationale trailing. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter tool with no output schema and no annotations, the description supplies purpose, mechanism and use cases. It is only slightly thin on post-restart state and failure handling, which limits it below a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both waitForReady and timeoutSeconds are already fully documented, including defaults and the 2-60s range. The description adds nothing beyond that, which earns the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (terminates and restarts) and a precisely scoped resource (League Client UX / frontend CEF renderers) with the mechanism (via Riot Client). An agent can distinguish this from read-only siblings like lol_status or lol_cdp_targets immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use triggers: developing Pengu Loader plugins, or recovering from a frozen interface. It does not name an alternative or a when-not-to-use condition, but no sibling tool performs a comparable restart, so the routing risk is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_schemaQuery LCU OpenAPI/Swagger schemaC
Inspect internal LCU API endpoint signatures, parameters, request bodies, and models using the client's live OpenAPI/Swagger v2 specification.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | LCU path or keyword to search (e.g. /lol-lobby/v2/lobby or "gameflow") | |
| model | No | Look up a specific definition/model schema name (e.g. "LolLobbyLobbyDto") | |
| method | No | Filter operations by HTTP method | |
| refresh | No | Force re-fetch the swagger schema from the League Client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Live' implies the spec is fetched from the running client rather than a static file, but the description does not state whether a fetch hits the network, whether results are cached, refresh cost, or that it is a read-only operation. For a zero-annotation tool this leaves important behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence, front-loaded with the intent. No padding or repetition, though it could have used a second clause to route the agent to alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must carry more weight, yet it does not describe the shape of results (endpoint list vs. single signature vs. model definition) or how the optional filters combine. Adequate for basic invocation but incomplete for an introspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters already have clear descriptions with examples (e.g. path '/lol-lobby/v2/lobby', model 'LolLobbyLobbyDto', method enum). The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Inspect') and a concrete resource set ('LCU API endpoint signatures, parameters, request bodies, and models'). An agent understands what the tool returns, but nothing distinguishes it from siblings like lol_endpoints or lol_get, which plausibly overlap in the discovery space.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. 'the client's live OpenAPI/Swagger v2 specification' hints that it is a discovery/introspection step, but the description never says to call it before crafting lol_request calls, nor how it relates to lol_endpoints or lol_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_statusLeague client 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description must carry the full burden of behavioral disclosure. It explains what the tool reports (subsystem health, event tap state, config) but does not explicitly state whether it has side effects or is read-only. Given the 'status' nature, it's implied to be non-mutating, but this is not stated outright, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence front-loads the core function (what health is reported), and the second provides usage guidance. Every word earns its place, and the structure is efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a status/diagnostic tool with no output schema, the description adequately covers what is reported (LCU, CDP, event tap, config) and when to use it (first when other tools fail). It omits the exact return format, but that is not explicitly required since there is no output schema. It is sufficiently complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description need not elaborate on parameter usage. Per the rubric, a tool with no parameters gets a baseline of 4 regardless of schema coverage. The description does not need to add any parameter-related information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool reports the health of both LCU and CDP subsystems, event tap state, and effective config. It identifies distinct resources and a clear purpose (health check) that distinguishes it from sibling action-oriented tools like lol_get or lol_eval. However, it lacks an explicit verb like 'get' or 'check', making the action implicit rather than direct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this first when another tool fails', providing a precise condition for when to use it. This gives clear contextual guidance and implies it is a diagnostic first step, effectively routing the agent away from alternatives in failure scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_wamp_record_dumpDump the recorded WAMP timelineA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | URI prefix filter, applied to event entries only | |
| kinds | No | restrict to these entry kinds | |
| limit | No | max entries, default 100 | |
| since | No | lower bound on ts, epoch milliseconds | |
| until | No | upper bound on ts, epoch milliseconds | |
| cursor | No | seq cursor from a previous dump |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that stats are cumulative and survive buffer eviction, that a non-zero 'dropped' means post-cursor eviction, and that lifecycle entries survive a uri filter. It stops short of stating permissions, read-only nature, or whether cursor state mutates, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core return value and followed by the non-obvious semantics (eviction, filter interaction, time units). Every sentence adds information; nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return shape (timeline plus per-URI stats) and the meaning of key fields like stats and dropped. Combined with a fully documented 6-parameter schema, it is nearly complete; only the pagination/limit interaction and read-only confirmation are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds genuine semantics beyond the schema: the interaction between 'uri' and 'kinds' (lifecycle entries survive a uri filter, only kinds exclude them), the meaning of a non-zero 'dropped' relative to the cursor, and clock comparability of timestamps. This meaningfully enriches the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the recorded timeline plus per-URI stats.' The resource ('recorded WAMP timeline') is unique against siblings lol_wamp_record_start/stop, making it clear this is the retrieval counterpart to recording. No ambiguity about what it produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the pairing with lol_wamp_record_start/stop, and the cursor/dropped semantics hint at polling behavior, but there is no explicit 'use this when...' or exclusion against alternatives like lol_events_poll. An agent can infer the context but is given no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_wamp_record_startStart recording LCU WAMP trafficA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uris | No | subscribe per URI instead of the firehose, e.g. ["/lol-gameflow/v1/gameflow-phase"] | |
| restart | No | discard a running recording and start a fresh one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses that a second independent socket is opened, that every frame plus lifecycle events (open, close code, error, reconnect gap) are recorded into one timeline, and that double-start is an error. It stops short of stating resource cost, permission needs, or that uris must begin with '/'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scoping constraint in the first sentence, and each subsequent sentence justifies a parameter or the error path. It is dense with nested quoted examples and escaped inner quotes, which makes it slightly harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations, so the description must stand alone, and it does for what the tool does and how to start it. Retrieval of the recorded timeline is delegated to the sibling dump/stop tools, so no critical gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantic value: uris 'reproduces what a page-side plugin sees' and cannot distinguish socket death, and restart explicitly 'discard[s] the old [recording]'. That is decision-relevant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Start recording LCU WAMP traffic') with an explicit scope statement that it opens a second WAMP socket independent of lol_events_*. An agent can distinguish it from lol_events_start, lol_wamp_record_stop and lol_wamp_record_dump without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the default (firehose) and the alternative (passing uris), plus the diagnostic trade-off that selects between them: firehose lets you tell 'socket died' from 'nothing happened', per-URI cannot. It also states the error condition when a recording is already running and names the remedy (restart).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lol_wamp_record_stopStop recording LCU WAMP trafficA
Close the recorder socket. The recorded timeline stays readable with lol_wamp_record_dump.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose one important trait: the recorded timeline persists and stays readable afterward, so stopping is non-destructive. It omits other behaviors that matter for a state-mutating call, such as whether it errors when no recorder is active or whether it flushes buffered data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action is front-loaded ahead of the follow-up pointer to the dump tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema toggle, the description covers the essential agent concern: that stopping doesn't lose the recording. It leaves only minor gaps around error/prerequisite conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond the schema's empty object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource are concrete: 'Close the recorder socket' maps unambiguously to stopping capture, and the reference to lol_wamp_record_dump distinguishes it from the sibling that reads the timeline. It never explicitly says it halts LCU WAMP traffic capture (that comes from the name/title), so it stops just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to lol_wamp_record_dump for reading recorded data, which is useful implied guidance, but it never states when this tool should be used (e.g., after lol_wamp_record_start) or what happens if nothing is recording. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.2.0- Added
lol_cdp_console_start - Added
lol_cdp_console_stop - Added
lol_cdp_console_tail - Added
lol_cdp_screenshot - Added
lol_cdp_targets - Added
lol_forensics_correlate - Added
lol_restart_ux - Added
lol_schema - Added
lol_wamp_record_dump - Added
lol_wamp_record_start - Added
lol_wamp_record_stop
9 tool updates
v0.1.0- First observed
lol_dom_query - First observed
lol_endpoints - First observed
lol_eval - First observed
lol_events_poll - First observed
lol_events_start - First observed
lol_events_stop - First observed
lol_get - First observed
lol_request - First observed
lol_status
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.
Maintenance
Related MCP Connectors
Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).
Publish and discover MCP servers via the official MCP Registry. Powered by HAPI MCP server.
Send transactional email and manage domains, audiences, and broadcasts from any MCP client.
Related MCP Servers
- AlicenseCqualityDmaintenanceAn 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.1212Apache 2.0
- AlicenseBqualityAmaintenanceMCP server exposing 30 tools for League of Legends player analysis, match review, and training-plan generation.3512 npmMIT
- AlicenseAqualityCmaintenanceProvides MCP tools to query Liquipedia esports data (matches, teams, players, tournaments, placements, standings) via the Liquipedia v3 API and MediaWiki action API.8MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to control a local TradingView Desktop instance, providing tools to read chart state, change symbols and timeframes, and fetch OHLCV data.99 npm133MIT