Skip to main content
Glama
Triggered0

lcu-mcp

by Triggered0

lcu-mcp

License: MIT Node Tests

Сервер MCP, который предоставляет запущенный клиент League of Legends любому MCP-хосту — REST API LCU, его живой поток OnJsonApiEvent, а также собственный DOM и JavaScript-контекст интерфейса клиента — в виде девяти инструментов через stdio.

Спросите своего ассистента, в какой очереди вы находитесь, наблюдайте за выбором чемпионов событие за событием, исследуйте DOM клиента или управляйте самим клиентом — без единой строки связующего кода.

Содержание

Related MCP server: League of Legends MCP Server

Как это работает

Две независимые подсистемы работают в одном процессе Node:

  • LcuClient читает lockfile клиента, чтобы узнать порт и пароль, затем общается по REST через HTTPS с привязанным корневым сертификатом Riot, и держит WebSocket-подключение к OnJsonApiEvent, которое питает кольцевой буфер в процессе.

  • CdpClient подключается к конечной точке Chrome DevTools Protocol клиента (предоставляемой Pengu Loader) для запросов к DOM и выполнения JavaScript.

Обе подсистемы подключаются лениво и переживают перезапуски клиента — порт lockfile меняется при каждом запуске, поэтому отслеживается каталог, а не файл. События опрашиваются, а не отправляются, потому что MCP не поддерживает push от сервера к клиенту.

Обоснование дизайна и проверенные вживую детали протокола описаны в docs/design.md.

Требования

Node.js

>= 24 (ESM, без шага сборки)

League of Legends

Запущен. Lockfile в C:\Riot Games\League of Legends\lockfile предоставляет порт и пароль.

Pengu Loader

Необязательно — требуется только для lol_dom_query и lol_eval. Всё остальное работает без него.

На практике только Windows: путь к lockfile по умолчанию и интеграция с Pengu специфичны для Windows.

Установка

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

Зависимости времени выполнения — ровно три: @modelcontextprotocol/sdk, zod и ws.

Регистрация в MCP-хосте

Claude Code

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

Любой хост, читающий .mcp.json

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

LCU_MCP_CONFIG необязателен; без него сервер ищет config/allowlist.json относительно своего рабочего каталога и возвращается к встроенным значениям по умолчанию, если файл не существует.

Инструменты

Инструмент

Назначение

lol_status

Состояние каждой подсистемы, разрешённый порт LCU, настроенный порт CDP, включён ли allowEval

lol_get(path)

GET любого пути LCU

lol_request(method, path, body?)

Любой глагол, с учётом белого списка на запись

lol_endpoints(filter?)

Список таблицы выбранных конечных точек

lol_events_start(filters?)

Открыть WebSocket-подключение и начать буферизацию

lol_events_poll(since?, limit?, filter?)

Опустошить кольцевой буфер

lol_events_stop()

Закрыть подключение

lol_dom_query(selector, all?, props?)

Запрос к DOM клиента

lol_eval(expression, awaitPromise?)

Выполнить JavaScript на странице

Сначала lol_status. Когда что-то ещё не работает, он сообщает, какая половина неисправна — закрытый клиент не похож на отсутствующий Pengu.

События опрашиваются. lol_events_poll возвращает cursor; передайте его обратно как since в следующий раз. Ненулевой dropped означает, что кольцевой буфер переполнился и столько событий было потеряно после вашего курсора. Записи с truncated: true имеют data, обрезанный до 4 КБ — повторно получите полное тело с помощью lol_get по uri записи.

Клиент отправляет события только при изменении состояния. В простое на главном экране он может молчать бесконечно; навигация по интерфейсу или вход в лобби вызывает всплески. Пустой опрос обычно означает, что ничего не произошло, а не то, что подключение сломано — проверьте running и lol_status, чтобы различить эти случаи.

Фильтры — это префиксы URI, применяемые при приёме. Нефильтрованный поток быстро заполняет буфер, поэтому передавайте что-то вроде ["/lol-champ-select/", "/lol-gameflow/"], если вам действительно не нужно всё.

Конфигурация

config/allowlist.json:

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

Ключ

По умолчанию

Значение

allowEval

true

Может ли lol_eval выполнять JavaScript на странице

cdpPort

8888

Порт удалённой отладки Pengu Loader

eventBufferSize

1000

Ёмкость кольцевого буфера; старые записи удаляются первыми

writeAllowlist

[]

Какие изменяющие запросы lol_request может отправлять

Правила сопоставления белого списка:

  • Запись — это METHOD path. Метод сравнивается без учёта регистра, путь — с учётом регистра.

  • GET и HEAD всегда разрешены и не требуют записи.

  • * имеет смысл только как завершающий сегмент пути: /a/b/* соответствует /a/b/c, но не /a/b/c/d и не /a/b. В любом другом месте это литеральный символ.

  • Отклонённый вызов возвращает точную строку конфигурации, которая разрешила бы его, и запрос никогда не отправляется.

Включение доступа к DOM

lol_dom_query и lol_eval требуют порт удалённой отладки CEF клиента, который сборка Riot открывает только через Pengu Loader — внешний флаг --remote-debugging-port игнорируется.

Конфигурация Pengu — это обычный текст key=value, одна пара на строку — не JSON, не INI. В C:\Program Files\Pengu Loader\config установите:

RemoteDebuggingPort=8888

Затем перезапустите пользовательский интерфейс клиента, чтобы CEF подхватил порт:

POST /riotclient/kill-and-restart-ux

Это не затрагивает активную игру. Пока этого не произойдёт, оба инструмента завершаются с этими точными инструкциями, а не с голым ECONNREFUSED.

Безопасность

  • Проверка TLS остаётся включённой. Самоподписанный сертификат LCU проверяется по корневому сертификату Riot, включённому в certs/riotgames.pem. Сервер никогда не устанавливает rejectUnauthorized: false.

  • Пароль никогда не покидает процесс. Он хранится только для построения заголовка Authorization — ни один инструмент его не возвращает, ничто его не логирует, а текст ошибок очищается от него до того, как он попадёт к хосту. URL-адреса целей CDP также содержат его, поэтому они редактируются перед возвратом любым инструментом.

  • lol_eval по своей конструкции обходит белый список на запись. Страница клиента может fetch любой конечной точке LCU из своего собственного источника, поэтому выполненный JavaScript может делать всё, что может клиент. Это принято, а не исправлено: это ограничено флагом allowEval, состояние которого сообщает lol_status.

Относитесь к белому списку на запись как к защите от ошибок, а не как к границе безопасности — пока allowEval равен true, его можно обойти. Установите allowEval в false для реальной границы. lol_dom_query продолжает работать, потому что он внедряет селектор как данные, а не как код.

Разработка

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

npm run smoke печатает одну строку на этап и завершается с кодом 1, если какой-либо этап не пройден. Он никогда не запускается в CI. Этап событий ждёт реальной доставки и сообщает о трёх результатах: PASS, когда события пришли, SKIP, когда подключение установлено, но бездействующий клиент ничего не отправил, и FAIL, когда подключение не удалось установить.

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

Устранение неполадок

Симптом

Причина

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

Клиент закрыт или установлен не по пути по умолчанию.

Каждый инструмент CDP завершается с подсказкой Pengu

Pengu Loader не активен или RemoteDebuggingPort не задан. Следуйте разделу Включение доступа к DOM.

no "page" target

CDP доступен, но интерфейс ещё запускается. Повторите попытку, когда клиент станет видимым.

lol_events_poll ничего не возвращает

Обычно это бездействующий клиент, а не ошибка. Перейдите по интерфейсу и опросите снова; проверьте running в ответе.

Запись отклонена

Глагол и путь отсутствуют в белом списке. Сообщение об ошибке содержит точную строку для добавления.

Ошибки TLS при каждом вызове REST

Включённый корневой сертификат неверен или устарел. Исправьте PEM — никогда не отключайте проверку.

Отказ от ответственности

lcu-mcp не одобрен Riot Games и не отражает взгляды или мнения Riot Games или кого-либо, кто официально участвует в производстве или управлении продуктами Riot Games. Riot Games и все связанные продукты являются товарными знаками или зарегистрированными товарными знаками Riot Games, Inc.

Этот проект использует собственный локальный API клиента. Вы несёте ответственность за то, как вы его используете; автоматизация игрового процесса может нарушать Условия предоставления услуг Riot.

Лицензия

MIT © Triggered

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

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

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

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

View all related MCP servers

Related MCP Connectors

  • Riot Games API MCP.

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

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

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Triggered0/lcu-mcp'

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