lcu-mcp
lcu-mcp
Сервер 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 в |
Pengu Loader | Необязательно — требуется только для |
На практике только 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 относительно своего рабочего каталога и возвращается к встроенным значениям по умолчанию, если файл не существует.
Инструменты
Инструмент | Назначение |
| Состояние каждой подсистемы, разрешённый порт LCU, настроенный порт CDP, включён ли |
| GET любого пути LCU |
| Любой глагол, с учётом белого списка на запись |
| Список таблицы выбранных конечных точек |
| Открыть WebSocket-подключение и начать буферизацию |
| Опустошить кольцевой буфер |
| Закрыть подключение |
| Запрос к DOM клиента |
| Выполнить 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/*"
]
}Ключ | По умолчанию | Значение |
|
| Может ли |
|
| Порт удалённой отладки Pengu Loader |
|
| Ёмкость кольцевого буфера; старые записи удаляются первыми |
|
| Какие изменяющие запросы |
Правила сопоставления белого списка:
Запись — это
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 stdionpm 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Устранение неполадок
Симптом | Причина |
| Клиент закрыт или установлен не по пути по умолчанию. |
Каждый инструмент CDP завершается с подсказкой Pengu | Pengu Loader не активен или |
| CDP доступен, но интерфейс ещё запускается. Повторите попытку, когда клиент станет видимым. |
| Обычно это бездействующий клиент, а не ошибка. Перейдите по интерфейсу и опросите снова; проверьте |
Запись отклонена | Глагол и путь отсутствуют в белом списке. Сообщение об ошибке содержит точную строку для добавления. |
Ошибки TLS при каждом вызове REST | Включённый корневой сертификат неверен или устарел. Исправьте PEM — никогда не отключайте проверку. |
Отказ от ответственности
lcu-mcp не одобрен Riot Games и не отражает взгляды или мнения Riot Games или кого-либо, кто официально участвует в производстве или управлении продуктами Riot Games. Riot Games и все связанные продукты являются товарными знаками или зарегистрированными товарными знаками Riot Games, Inc.
Этот проект использует собственный локальный API клиента. Вы несёте ответственность за то, как вы его используете; автоматизация игрового процесса может нарушать Условия предоставления услуг Riot.
Лицензия
MIT © Triggered
Maintenance
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
- 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.3515MIT
- AlicenseAqualityAmaintenanceBridges MCP clients to Affinity by Canva's local MCP server, exposing tools for script execution, rendering, and SDK documentation.1564MIT
- AlicenseAqualityCmaintenanceProvides MCP tools to query Liquipedia esports data (matches, teams, players, tournaments, placements, standings) via the Liquipedia v3 API and MediaWiki action API.8MIT
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)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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