Skip to main content
Glama
Triggered0

lcu-mcp

by Triggered0

lcu-mcp

License: MIT Node Tests

実行中のLeague of LegendsクライアントをあらゆるMCPホストに公開するMCPサーバーです。LCU REST API、そのライブOnJsonApiEventストリーム、クライアントUI自身のDOMとJavaScriptコンテキストを、stdio上の9つのツールとして公開します。

アシスタントに現在のキューを尋ねたり、チャンプセレクトの展開をイベントごとに追跡したり、クライアントのDOMを調べたり、クライアント自体を操作したりできます。グルーコードを一行も書く必要はありません。

目次

Related MCP server: League of Legends MCP Server

仕組み

1つのNodeプロセス内で、2つの独立したサブシステムが動作します。

  • LcuClient は、クライアントのロックファイルを読み取ってポートとパスワードを特定し、RiotのルートCAをピン留めしたHTTPSでREST通信を行い、OnJsonApiEventのWebSocketタップを保持して、プロセス内のリングバッファに供給します。

  • CdpClient は、クライアントのChrome DevTools Protocolエンドポイント(Pengu Loaderによって公開)に接続し、DOMクエリとJavaScript評価を行います。

どちらも遅延接続で、クライアントの再起動にも耐えます。ロックファイルのポートは起動のたびに変わるため、ファイルではなくディレクトリを監視します。イベントはプッシュではなくポーリングされます。MCPにはサーバーからクライアントへのプッシュがないためです。

設計の根拠とライブ検証済みのプロトコル詳細は、docs/design.mdにあります。

要件

Node.js

>= 24(ESM、ビルドステップなし)

League of Legends

実行中。C:\Riot Games\League of Legends\lockfile のロックファイルがポートとパスワードを提供します。

Pengu Loader

任意 — lol_dom_querylol_evalのみ必要。それ以外はすべてこれなしで動作します。

実際にはWindowsのみ:デフォルトのロックファイルパスとPengu統合はWindows固有です。

インストール

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

実行時依存関係は正確に3つ:@modelcontextprotocol/sdkzodws

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 を探し、そのファイルが存在しない場合は組み込みのデフォルトにフォールバックします。

ツール

Tool

Purpose

lol_status

サブシステムごとの健全性、解決されたLCUポート、設定されたCDPポート、allowEval が有効かどうか

lol_get(path)

任意のLCUパスへのGET

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_pollcursor を返します。次回はそれを since として渡します。非ゼロの dropped は、リングバッファがラップし、カーソル以降にその数のイベントが失われたことを意味します。truncated: true のエントリは、data が4 KBで切り詰められています。エントリの urilol_get を使用して完全なボディを再取得してください。

クライアントは状態が変化したときのみイベントを発行します。 ホーム画面でアイドル状態のときは、無期限に沈黙することがあります。UIをナビゲートしたりロビーに入ったりすると、バーストが発生します。空のポーリングは通常、何も起こらなかったことを意味し、タップが壊れているわけではありません。runninglol_status を確認して、2つを区別してください。

フィルタは取り込み時に適用される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/*"
  ]
}

Key

Default

Meaning

allowEval

true

lol_eval がページ内でJavaScriptを実行できるかどうか

cdpPort

8888

Pengu Loaderのリモートデバッグポート

eventBufferSize

1000

リングバッファ容量。最も古いエントリから先に削除されます

writeAllowlist

[]

lol_request が送信できる変更リクエストの種類

許可リストのマッチングルール:

  • エントリは METHOD path です。メソッドは大文字小文字を区別せず比較され、パスは大文字小文字を区別して比較されます。

  • GETHEAD は常に許可され、エントリは不要です。

  • * は末尾のパスセグメントとしてのみ意味を持ちます:/a/b/*/a/b/c にマッチしますが、/a/b/c/d/a/b にはマッチしません。他の場所ではリテラル文字です。

  • 拒否された呼び出しは、それを許可する正確な設定行を返し、リクエストは送信されません。

DOMアクセスの有効化

lol_dom_querylol_eval には、クライアントのCEFリモートデバッグポートが必要です。RiotのビルドはPengu Loaderを通じてのみこれを開きます。外部から追加された --remote-debugging-port フラグは無視されます。

Penguの設定はプレーンな key=value テキストで、1行に1ペアです。JSONでもINIでもありません。C:\Program Files\Pengu Loader\config で、以下を設定します:

RemoteDebuggingPort=8888

次に、クライアントUXを再起動して、CEFがポートを認識するようにします:

POST /riotclient/kill-and-restart-ux

これにより、進行中のライブゲームには影響しません。これが行われるまで、両方のツールは裸の ECONNREFUSED ではなく、これらの正確な指示とともに失敗します。

セキュリティ

  • TLS検証は有効のままです。 LCUの自己署名証明書は、certs/riotgames.pem にベンダーされたRiotのルートCAに対して検証されます。サーバーは決して rejectUnauthorized: false を設定しません。

  • パスワードはプロセスから出ません。 Authorization ヘッダーを構築するためだけに保持され、どのツールもそれを返さず、ログにも記録されず、エラーテキストはホストに到達する前にパスワードが除去されます。CDPターゲットURLにもパスワードが埋め込まれているため、どのツールが返す前にそれらも編集されます。

  • lol_eval は構造上、書き込み許可リストをバイパスします。 クライアントページは自身のオリジンから任意のLCUエンドポイントに fetch できるため、評価されたJavaScriptはクライアントができることをすべて実行できます。これは修正されるのではなく受け入れられています。allowEval フラグによってゲートされ、その状態は lol_status が報告します。

書き込み許可リストは、セキュリティ境界ではなく、ミスに対するガードレールとして扱ってください。allowEvaltrue の間はバイパス可能です。 実際の境界には allowEvalfalse に設定してください。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行を出力し、いずれかのステージが失敗すると終了コード1で終了します。CIで実行されることはありません。イベントステージは実際の配信を待ち、3つの結果を報告します:イベントが到着した場合は 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には到達可能ですが、UXがまだ起動中です。クライアントが表示されたら再試行してください。

lol_events_poll が何も返さない

通常はアイドル状態のクライアントであり、障害ではありません。UIをナビゲートして再度ポーリングし、応答の running を確認してください。

書き込みが拒否される

動詞とパスが許可リストにありません。エラーメッセージには追加すべき正確な行が含まれています。

すべてのREST呼び出しでTLSエラー

ベンダーされたCAが間違っているか古いです。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