Skip to main content
Glama

game-bridge-mcp

AIエージェントにゲームの起動、操作、そして結果の読み取りを任せましょう — HTTP経由で、インスタンスごとに1つのポートを使います。

あなたのゲームはすでに自分自身のことをすべて知っています。画面に何があるか、各エンティティがどこにいるか、どのコマンドを受け付けるか。game-bridge-mcp はそれをエージェントに渡す MCP サーバーです — ここにハードコードするのではなく、実行中のゲームから発見された、エージェントが呼び出せるツールとして。

agent ──MCP(stdio)──▶ game-bridge-mcp ──HTTP──▶ 127.0.0.1:7820  ← it launched this one
                                      ├───────▶ 127.0.0.1:7801  ← your IDE started this one
                                      └───────▶ 127.0.0.1:7802  ← a colleague's session

これを午後で書けるようなデバッグブリッジスクリプト以上のものにしている理由は3つあります:

  • インスタンスを起動し、ポートを選びます。 呼び出し側がポートを選んだりビルドコマンドを入力したりする必要がないため、2つのエージェントが衝突することはなく、ブリッジは自分が起動したものを回収します — セッション終了後に孤児となったゲームウィンドウは残りません。

  • すべてのツールは port を受け取ります。 1つのブリッジで、実行中のすべてのインスタンスを操作できます。1台のマシンで複数のエージェントを動かしたり、1つのエージェントが2つのビルドを並べて比較したりできます。

  • ツールリストはゲームから取得します。 ブリッジは実行時に各インスタンスから GET /tools を取得するので、今朝追加したデバッグコマンドは今日の午後には呼び出せます — このパッケージのリリースも、再接続も、エージェントがゲームが受け付けると思っているものと実際に受け付けるものとの乖離もありません。

エンジンに依存しません。どの言語でも、localhost で4つの小さなHTTPエンドポイントを提供できるものであれば何でも使えます。契約 は意図的に短くしてあります。


クイックスタート

npx @wildware/game-bridge-mcp --help

MCPクライアントに登録します — Claude Code の場合は、プロジェクトディレクトリから:

claude mcp add game-bridge -- npx -y @wildware/game-bridge-mcp

次に、エージェント側から:

launch_instance {}                                 // start a game; the bridge picks the port
list_instances  {}                                 // ...or find one already running
list_toolsets   { "port": 7820 }                   // what can this instance do?
describe_toolset { "port": 7820, "name": "play" }  // exact schemas
call_tool { "port": 7820, "name": "drop", "arguments": { "x": 1.2 } }
stop_instance { "port": 7820 }                     // clean shutdown, not a kill

launch_instance には 起動宣言 が必要です。それ以外はすべて、このブリッジが起動したかどうかに関係なく、HTTPサーフェスを実装する任意のゲームに対して機能します。


Related MCP server: minecraft-mcp

契約

これを実装すれば、このブリッジにゲーム固有のコードが一切なくても、あなたのゲームは任意のエージェントから操作可能になります。3つの部分からなり、それぞれが特定のものを提供します:

部分

提供されるもの

1. HTTPサーフェス

実行中のインスタンスの読み取りと操作。

2. 自己登録

ポートを推測せずにインスタンスを発見。

3. 起動宣言

人間がポートを選ばずにインスタンスを起動。

必須なのはパート1だけです。パート2は発見を確実にし、パート3は全体を快適にします。

1. HTTPサーフェス

これらを 127.0.0.1:<port> で提供します。ポートは明示的なデバッグフラグから取得します。ループバックのみにバインドし、ゲームがそのフラグで起動された場合を除いてサーフェス全体をオフにしてください。これはデバッグ用サーフェスであり、ネットワークサービスではありません。

GET /health — 必須

生存確認とID確認です。発見処理は範囲内のすべてのポートに対してこれを呼び出すため、安価である必要があります。

GET /health
{ "ok": true, "frame": 91422 }

ok: true が、そのポートを 私たちのもの としてマークします。それ以外のHTTP応答を返すポートは、エージェントに「別の何かがこのポートを占有している」と報告されます — これは「ゲームが実行されていない」とは別の問題であり、別の修正方法が必要です。

frame はプロセスの存続期間中増加し続けるカウンターです。ブリッジはこれを監視します。frame が 逆方向 に進むということは、新しいプロセスがこのポートで応答していることを意味し、キャッシュされたツールマニフェストは自動的に破棄されます。これにより、再ビルドと再実行がエージェントから見えないようになります。

GET /state — 必須

完全なスナップショット: エージェントが知りたいかもしれないすべてをJSONとして返します。必須のスキーマはありません — それはあなたのゲーム次第です — ただし、いくつかの慣例的なフィールドがブリッジの機能を解放します:

{
  "frame": 91422,
  "simFrame": 48110,
  "completedCommandId": 17,
  "paused": false,
  "ui": {
    "screen": "GameScreen",
    "elements": [ { "label": "Restart", "visible": true } ]
  },
  "events": [ { "m": "merge:cherry" }, { "m": "click:Restart" } ],
  "game": { "score": 1280, "state": "RUNNING" }
}

フィールド

ブリッジが気にする理由

frame

再起動の検出。コマンドが実行されたことのフォールバック確認。

completedCommandId

コマンドが実行されたことの強力な確認 — 下記参照。

ui.screen

list_instances によって報告され、5つのインスタンスを一目で見分けられます。

ui.elements[].label / .visible

コンパクトな get_state ダイジェストに含まれます。

events[].m

最近のイベント。各コマンドの後に返され、エージェントが結果を確認できます。プレーンな文字列も受け付けられます。

game

スカラーフィールドはダイジェストに含まれます。ネストされたオブジェクトと配列は含まれません — そこはメガバイト級のエンティティリストが置かれる場所です。

ここに置いた他のすべては、get_state によって変更されずにそのまま渡されます。

GET /command — 必須

GET /command?cmd=spawn&type=cherry&x=-1.5
{ "accepted": true, "commandId": 18, "frame": 91430 }

コマンド名は cmd というキーで指定します。name ではありません — コマンドはしばしば独自の name 引数を持つため、重複したクエリキーは呼び出されるコマンドを静かに上書きしてしまいます。他のすべてのクエリパラメータは引数です。

このエンドポイントはファイア・アンド・フォーゲットであり、契約について理解すべき最も重要な点です。 コマンドが キューに入れられた 瞬間にHTTPスレッドから応答します。コマンド自体は後でゲームスレッドで実行されます。直後に /state を読むクライアントは、コマンドが実行される 前 の世界を読むことになります。テストが不安定に見えても、ゲームは正常です。

ブリッジはこれを処理します。その方法が、あなたのゲームがサポートすべきことです:

  1. GET /command?... → 返された commandId を記録します。

  2. completedCommandId >= commandId になるまで GET /state をポーリングします。

  3. その状態を返します — コマンド実行後の本当の状態です。

ゲームが completedCommandId を公開しない場合、ブリッジは frame が2つ進むのを待つという劣化モードにフォールバックし、結果に "confirmation": "frames-advanced" というラベルを付けて、エージェントが弱い保証しか得られなかったことを知らせます。completedCommandId の公開は数行の作業で、それだけの価値があります:

// game thread, once per frame
while (true) {
    val cmd = queue.poll() ?: break
    apply(cmd)
    completedCommandId = cmd.id   // published in the next /state snapshot
}

通常のティアダウンを通じてゲームをシャットダウンする close コマンドを強く推奨します。エージェントがプロセスを強制終了せずにインスタンスを終了できるようになります。ブリッジは close を特別に扱います — 決して到着しない完了を待つのではなく、ポートが静かになるのを待ちます。

GET /tools — 任意ですが、これが一番の見どころです

マニフェスト: あなたのゲームが何をするよう指示できるかを、ゲーム自身の言葉で記述したものです。

{
  "game": { "name": "Orbital Freight", "version": "0.9.2", "protocol": 1 },
  "toolsets": [
    {
      "name": "play",
      "description": "Drive the game the way a player does.",
      "tools": [
        {
          "name": "drop",
          "description": "Release the held crate, aiming first if x is given.",
          "args": [
            { "name": "x", "type": "number", "description": "World x, -2..2", "required": true, "default": null },
            { "name": "settle", "type": "boolean", "description": "Wait for the stack to settle", "default": "true" }
          ]
        }
      ]
    }
  ],
  "passthrough": {
    "description": "Any command the debug bridge accepts, passed straight through.",
    "examples": ["set_seed { seed }", "set_gravity { x, y }"]
  }
}

フィールド

意味

game.name, game.version

識別情報。list_instances によって表示され、エージェントが5つの実行中インスタンスを見分ける方法です。

game.protocol

ドキュメントのバージョンであり、コマンドセットのバージョンではありません。コマンドを追加してもここは変わりません。マニフェストを再構成すると変わります。ブリッジが「これを読めない」と「このゲームは前回と異なるコマンドを知っている」を区別できるようにします。現在のバージョン: 1。

toolsets[]

呼び出し側が何をしようとしているかに基づいて名前付けされたグループであり、コードの構成に基づくものではありません。少数でわかりやすく保ちましょう。

tools[].name

エージェントが呼び出す名前。

tools[].description

エージェント向けに書かれます。何をするか そしていつ使うべきか を説明してください — これはモデルが推論するテキストです。

tools[].args[]

{ name, type, description, required, default }。type はJSON Schemaの型名なので、1つのコンバーターがゲームコマンドとブリッジツールの両方に使えます。

tools[].command

ツール名と異なる場合に送信する cmd。デフォルトは名前です。

tools[].sync

待機してはならないコマンドには false。デフォルトは true。

tools[].inputSchema

すでにJSON Schemaがある場合は、args の代わりにそれを送信すると、そのまま使用されます。

passthrough

正式に公開していないコマンドを説明する自由テキストと例。

デフォルト値は文字列の場合があります ("true"、"0.05") — 型付き言語からシリアライズされたマニフェストは通常そのようにレンダリングされます。ブリッジはスキーマに default を出力するのではなく、説明に折り込みます。なぜなら、boolean プロパティの default: "false" は厳格なクライアントが拒否する可能性があるからです。null は「デフォルトなし」を意味します。

パーサーは意図的に寛容です。マニフェストは手元にあるどんなシリアライザーでも書かれるからです:

  • toolsets はオブジェクトの配列 または name → toolset のマップの場合があります。

  • 引数は args、arguments、params のいずれかに置くことができ、オブジェクトの配列、素の名前の配列、または name → { type, description } のマップとして指定できます。

  • 不正なツールは破棄されますが、致命的ではありません。1つの悪いエントリがインスタンス全体をオフラインにしてはいけません。

/tools が404を返しても、何も壊れません。 ブリッジは契約レベルのツールのみを含む組み込みマニフェストにフォールバックし、ゲームがコマンドリストを公開していないことをエージェントに伝えるので、raw_command を通じて作業し、/state を読んでください。インスタンスはそれに応じて live または live-no-manifest として報告され、--manifest ./my-game.json は変更できないゲームのためにファイルからマニフェストを提供します。

2. 自己登録

ポートスキャンは発見の弱い形態です。誰かが推測した範囲に制限され、応答するまでゲームのIDについて沈黙し、起動中 — エージェントが最も見る可能性が高いまさにその瞬間 — に偽陰性が発生しがちです。

そこで、デバッグポートのバインドに成功したゲームは、自分自身を名乗る小さなJSONファイルを1つ書き込みます:

~/.game-bridge/instances/<pid>.json
{
  "name": "Orbital Freight",
  "version": "0.9.2",
  "protocol": 1,
  "port": 7820,
  "pid": 12345,
  "host": "127.0.0.1",
  "started": "2026-08-20T22:27:19.774Z",
  "cwd": "/home/dev/checkouts/main"
}

cwd は意図的です。同じゲームの複数のチェックアウトが同時に実行されることがあり、「これはどのビルドか?」という問いはプロセスの外部からは答えられません。

書き手が従わなければならないルール:

  • エントリは、ポートがバインドされた後に書く。それ以前には決して書かない。バインドされたことがないポートのエントリは、エントリなしより悪い。

  • クリーンシャットダウン時に削除する。

  • レジストリの失敗でゲームを壊してはならない。 書き込み不可のディレクトリ、読み取り専用のホーム、サンドボックスでも、ゲームは起動してエンドポイントを提供し続けなければならない。これは宣伝であって、基盤ではない。

  • GAME_BRIDGE_INSTANCES(エントリのディレクトリ)または GAME_BRIDGE_HOME(その親ディレクトリ)が設定されている場合は、それに従う。

読み手が従わなければならないルール — そしてこちらのほうが重要だ:

  • エントリは参考であって、正式な情報ではない。 クラッシュや強制終了が起きればファイルは残る。これは実際に頻繁に起こる。

  • すべてのエントリを信じる前に、GET /health で検証する。 ポートが応答しないエントリは、実行中のゲームではなく、古いファイルである。つまり、インスタンスとしてではなく、古いエントリとして報告しなければならない。

  • エントリを実行中のゲームより信頼してはならない。 ブリッジは、ゲームが応答したときに /tools から名前とバージョンを取得し、エントリはワイヤーが伝えられないもの(pid、作業ディレクトリ、起動時刻)にだけ使う。

  • デフォルトでは、他のプロセスのファイルを削除しない。 起動中にポートをバインドしているゲームは、クラッシュしたゲームと、1、2秒の間は区別できない。ブリッジは、明示的な prune: true がある場合にだけ、しかもポートが死んでいることを確認した後にだけ、整理する。

  • スキャンも続ける。 レジストリより前からあるゲームも存在する。ブリッジはレジストリのエントリとポートスキャンを統合し、ポートごとに重複排除する。各インスタンスの discovery は、registry、scan、または both として報告される。

3. 起動宣言

プロジェクトは起動方法を一度だけ宣言するので、呼び出し側がビルドコマンドを入力したりポートを選んだりする必要はない。gamebridge.json をプロジェクトルートに置く。ブリッジは作業ディレクトリから上へたどってそれを見つける。これは、他のすべての JS ツールが設定を見つける方法と同じであり、--config <file> で上書きできる。

{
  "name": "Orbital Freight",
  "launch": {
    "command": "./gradlew lwjgl3:run -PdebugPort={port} --console=plain",
    "cwd": ".",
    "portRange": "7820-7839",
    "readyTimeoutMs": 180000,
    "env": { "ORBITAL_DEV": "1" }
  }
}

Field

Meaning

command

シェルのコマンドライン。{port} が置換される。この場所からポートをゲームに届けなければならない——これが仕組みのすべてだ。

argv

command の代替: ["./run-game", "--port", "{port}"]。シェルを介さずに実行される。

cwd

作業ディレクトリ。このファイルからの相対パスとして解決される。MCP クライアントがたまたまブリッジを起動した場所(それはほとんどの場合プロジェクトではない)からの相対ではない。

portRange

ランチャーが取得できるポート範囲。デフォルトは 7820-7839。7777 と 7800-7810 は人手で割り当てられることが多いポートなので、意図的に避けている。

readyTimeoutMs

/health を待つ時間。コールドビルドに JVM が加わると数十秒かかる。デフォルトは 180000。

env, extraArgs

追加の環境変数と末尾の引数。

ランチャーが保証すること:

  • ポートが空いていることを2回確認する —— 何もバインドされていないこと、そしてヘルスチェックに応答するものが何もないこと。起動途中のゲームは、ミリ秒前にはバインドテストを失敗していたとしても、意味のある形でポートを主張しているからだ。宣言された範囲が一杯なら、OS が割り当てたポートにフォールバックする。

  • launch_instance は /health が応答するまで返さない。呼び出し側がリトライループを書くことはない。

  • 起動失敗は、子プロセスの出力を添えて、大きく失敗する。 ゲームが起動に失敗すると、スタックトレースが答えのすべてである:

BridgeUsageError: Launch failed on port 7820: the process exited with code 1.
Command: ./gradlew lwjgl3:run -PdebugPort=7820 --console=plain
Working directory: /home/dev/orbital
Full log: /tmp/game-bridge-logs/instance-7820-1787264781573.log

Last output:
'gradlew' is not recognized as an internal or external command,
operable program or batch file.
  • stdout と stderr は、インスタンスの生存期間中、そのログファイルに取り込まれ、最新の200行が instance_log のためにメモリに保持される。

  • 子プロセスは回収される。 stop_instance 時、サーバーシャットダウン時、SIGINT、SIGTERM、またはクライアント切断時に、起動済みのすべてのインスタンスはクローズされる。まずゲーム自身の close コマンド、次に、それでも終了しない場合のプロセスツリーの終了。クローズしたセッションがデスクトップにゲームウィンドウを残すことはない。

クリーンクローズを超えたエスカレーションが適用されるのは、このブリッジが起動し、今も追跡しているプロセスのみだ。それ以外のポートへの stop_instance は拒否され、代わりにゲーム自身にクローズするよう依頼するように指示される。


Tools

Tool

Arguments

機能

launch_instance

port?, timeoutMs?

ゲームを起動し、空きポートを選び、 /health を待って、ハンドルを返す。

list_instances

range?, registry?, scan?, prune?

レジストリとポートスキャン。名前、バージョン、pid、作業ディレクトリ、スクリーンを返す。読み取り専用。

stop_instance

port?, graceMs?

クリーンクローズ、その後エスカレーション。ただしこのブリッジが起動したインスタンスに限る。

instance_log

port?, lines?

起動したインスタンスのキャプチャ済み stdout/stderr。

list_toolsets

port?

そのインスタンス自身の説明によるツールセット。

describe_toolset

port?, name

完全な JSON Schemas。bridge はブリッジ自身のツール、passthrough は未公開コマンド用。

call_tool

port?, name, arguments?

ツールを実行し、ゲームが確認するのを待って、結果のダイジェストを返す。

宣伝されるのは、この7つだけ。ゲーム自身のツールには call_tool 経由で到達する。MCP クライアントは、接続時にツールリストを一度だけ渡され、二度と尋ねないからだ。固定リストでは、未開発のゲームにとって古くなり、1つのセッションが2つの異なるビルドを動かしているときは、単に 間違い になる。 (--eager は、ディスカバリパスを歩けないクライアントのために、全部を前もって平坦化する。)

ブリッジ自身のツールセット

適合するすべてのゲームに提供されるもの:

Tool

What it does

get_state

/state の完全なスナップショット。summary: true でコンパクトなダイジェスト。

get_health

生存確認とフレームカウンター。

raw_command

公開済みか未公開かに関係なく、任意のコマンドを名前で実行。

wait_for

フィールドが値に達するか、フィールドが変化するか、イベントが出現するまで /state をポーリングする。これは、開始したコマンドが報告できないことを待つ方法 — 例えば、キューに入ったスクリーンショットがディスクに到達する、シミュレーションがフレーム N に到達する。

close

クリーンシャットダウン。ポートが沈黙すれば確認になる。

call_tool は名前をどう解決するか

  1. ブリッジの複合ツール。ホストアプリケーションが登録したものも含む。複合ツールは同じ名前のゲームコマンドを覆うが、これは驚きではなく常に改善である。複合ツールがその名前を持つのは、生のコマンドが、要求されたことが起こる前に戻ってくるからだ。

  2. ゲームのマニフェスト。見つからなければ1回再取得する。新しいコマンドで再ビルドされたゲームは、セッションの途中で見つかるようになる。

  3. パススルー。それ以外はすべて生のコマンドとして送信される。ゲームには存在するがマニフェストにないコマンドでも、今でも機能する。ゲームが unknown として拒否した場合は、ゲームが受け付けるコマンド失敗の一覧が得られる。

port の解決方法

すべてのツールは、オプションで port を取る(トップレベルまたは arguments 以下)。次の順序で解決される:

  1. 呼び出し内の明示的な port

  2. コマンドラインの --port

  3. 環境変数 GAME_BRIDGE_PORT

  4. 7777

これにより、単一インスタンスの構成ではポートのことを考える必要がなく、マルチインスタンスのセッションでは2番目のサーバービスは不要になる。


元シーケンスを2つ同時に動かす

本ツールが作られたシナリオ: 同じゲームの2つのビルドを並べて、1つのエージェント、1つのセッション。

// 1. What is already running?
list_instances {}
{
  "registryDir": "/home/dev/.game-bridge/instances",
  "live": [
    { "port": 7801, "discovery": "scan", "status": "live-no-manifest",
      "frame": 2453, "manifest": "fallback", "screen": "GameScreen" },
    { "port": 7820, "discovery": "both", "status": "live", "game": "Orbital Freight",
      "version": "0.9.2", "protocol": 1, "manifest": "game", "pid": 87488,
      "cwd": "/home/dev/checkouts/main", "screen": "MenuScreen",
      "toolsets": ["play", "build", "flow", "bridge"], "launchedByThisBridge": true }
  ],
  "stale": [],
  "notAGame": [],
  "free": [7777, 7802, 7803]
}

ポート 7801 は /tools が古いビルド。それでも完全に操作できる、ただ自己記述的でないだけ。ポート 7820 は、このブリッジが起動したもの。

// 2. Start a second one. You do not choose the port.
launch_instance {}
{ "port": 7821, "pid": 90114, "name": "Orbital Freight", "version": "0.9.3-rc1",
  "cwd": "/home/dev/checkouts/rc", "readyInMs": 4080,
  "logFile": "/tmp/game-bridge-logs/instance-7821-1787264835950.log" }
// 3. Same seed, same move, both runs.
call_tool { "port": 7820, "name": "set_seed", "arguments": { "seed": 12345 } }
call_tool { "port": 7821, "name": "set_seed", "arguments": { "seed": 12345 } }

call_tool { "port": 7820, "name": "drop", "arguments": { "x": 1.2 } }
call_tool { "port": 7821, "name": "drop", "arguments": { "x": 1.2 } }

それぞれはコマンドが適用された後の状態を返すので、2つを直接比較できる:

{
  "port": 7821, "tool": "drop", "via": "manifest", "command": "drop",
  "applied": true, "commandId": 18, "confirmation": "completedCommandId",
  "frame": 948, "screen": "GameScreen",
  "game": { "score": 1280, "state": "RUNNING" },
  "events": ["merge:cherry", "score:+40"]
}
// 4. Wait for something the command could not report.
call_tool { "port": 7821, "name": "wait_for",
            "arguments": { "path": "game.pendingMerges", "equals": 0, "timeoutMs": 5000 } }

// 5. Clean up what you started. 7801 is not yours - leave it alone.
stop_instance { "port": 7821 }
{ "port": 7821, "stopped": true, "how": "closed cleanly" }

何かおかしいとき

ブリッジは、外から見ると同じにわかる失敗たちを区別する:

GameOffline: No game is answering on http://127.0.0.1:7809.
Start one with:
  ./gradlew lwjgl3:run -PdebugPort=7809

NotAGameSurface: Something is listening on http://127.0.0.1:7802, but it is not a
debuggable game: GET /health returned HTTP 404.
A drivable game must answer GET /health with {"ok":true,"frame":N}. Check whether
another process has taken this port.

CommandTimeout: Command 'restart' was queued on port 7801 but was not applied
within 5000ms. The game accepted it, so it is probably blocked, frozen, or on a
screen that ignores this command.

最初のメッセージで指定されたコマンドを設定する: --launch-hint "make run PORT={port}" (または、launch_instance に起動を任せる)。


CLI

npx @wildware/game-bridge-mcp [options]

  -p, --port <n>           Default port for tools that do not name one (default 7777)
      --scan-range <spec>  Ports list_instances sweeps (default 7777,7800-7810)
      --no-scan            Discover only via the instance registry
      --no-registry        Discover only by scanning ports
      --registry-dir <dir> Where instance entries live (default ~/.game-bridge/instances)
      --config <file>      Project launch declaration (default: nearest gamebridge.json)
      --launch-hint <cmd>  Command shown when a port is dead; {port} is substituted
      --manifest <file>    Tool manifest for games that do not serve GET /tools
      --eager              Advertise every tool flatly, for clients that cannot discover
      --timeout <ms>       HTTP and command timeout (default 5000)
  -h, --help
  -v, --version

環境変数: GAME_BRIDGE_PORT, GAME_BRIDGE_SCAN_RANGE (または GAME_BRIDGE_SCAN), GAME_BRIDGE_LAUNCH_HINT (または GAME_BRIDGE_LAUNCH), GAME_BRIDGE_MANIFEST, GAME_BRIDGE_CONFIG, GAME_BRIDGE_INSTANCES, GAME_BRIDGE_HOME.

ブリッジがログ出力するものはすべて stderr に送られる。stdout は MCP トランスポートであり、そこに余計な行が入るとプロトコルストリームが壊れる。


自分自身のプロジェクトから使う

部品は CLI として提供されるだけでなく、エクスポートもされている。あなたのゲームを複数のコマンドをテレーン化するツールが必要なら——「ドロップし、ボードが収まるのを待ち、スコア差分を報告する」——それらを 複合ツール として登録し、プロトコル、ランチャー、ディスカバリ、エラーメッセージをコピーで別に保持する代わりに、そのまま活用してください。

#!/usr/bin/env node
import { parseCli, applyProjectConfig, startStdioServer } from "@wildware/game-bridge-mcp";

const { config } = parseCli(process.argv.slice(2), process.env);
await applyProjectConfig(config);

await startStdioServer(config, {
  composites: [
    {
      name: "drop_and_settle",
      description: "Drop at world x and wait until nothing is moving. The main way to play.",
      only: "Orbital Freight",            // never offered to a game that has no crates
      args: [{ name: "x", type: "number", required: true, description: "World x" }],
      async run(ctx) {
        const before = await ctx.state();
        await ctx.commandAndSync("drop", { x: ctx.args.x });
        const settled = await ctx.call("wait_for", { path: "game.moving", equals: 0, timeoutMs: 10000 });
        const after = await ctx.state();
        return { settled: settled.matched, scoreDelta: after.game.score - before.game.score };
      },
    },
  ],
});

複合ツールには、1つのインスタンスにスコープされたコンテキストが渡される——state, health, command, commandAndSync, call(他の任意のツール), manifest, summarise, sleep——だから、ポートを考える必要は一切ない。 only は、それが適用できるゲームの名前を指定し、マニフェストの game.name と照合される。 "genericだ" と主張するブリッジが、フライトシミュレーターに drop_and_settleを提供してはならない。

複合ツールに含めるもののルール: それは複数のコマンドをチェーンするか、/command が報告できないことを待つかのどちらかである。 1コマンドと1引数セットでできるには、ゲーム自身のマニフェストに属し、実装コードと歩調を合わせられる。

下位レベルの部品——Bridge, GameClient, Launcher, readRegistry, normaliseManifest——もエクスポートされている。 Bridge と GameClient はオプションの fetchImpl を受け取る。テストスイートはこれを使って、ゲームやソケットなし全体を動かしている。


開発

npm install
npm run build     # TypeScript -> dist/
npm test          # builds, then runs node --test

81件のテストは、いずれも実行中のゲームを必要としません。ポート解決順序、マニフェストのキャッシュとその3つの無効化パス、/tools の404フォールバック、command/poll/confirmサイクルとそのフレーム進行の劣化、古いエントリや不正なエントリを含むレジストリ読み取り、ランチャーのポート選択、起動失敗と子プロセスの回収、そしてインメモリトランスポート上で駆動されるMCPサーフェス自体です。

公開

まだnpmには公開されていません。公開される際は以下の通りです。

npm version minor          # keep SERVER_VERSION in src/server.ts in step
npm test                   # prepublishOnly runs build + test again
npm pack --dry-run         # confirm dist/, README.md and LICENSE are the payload
npm publish                # publishConfig.access is already "public"

package.json の files はターボールを dist/、README.md、LICENSE に制限します。prepare はgitからのインストール時にビルドを行うため、git からインストールした依存関係はチェックインされた dist/ なしで動作します。

ライセンス

MIT — LICENSE を参照してください。

Available Tools

7 tools
call_toolA

Run a tool on one instance and return the result. Accepts any tool from any of that instance's toolsets, and any raw debug command it understands even if unpublished. Commands are waited on until the game reports them applied, so the state returned is the state after the command ran.

NameRequiredDescriptionDefault
nameYesTool or command name
portNoDebug port of the game instance to talk to. Defaults to the bridge's --port, then GAME_BRIDGE_PORT, then 7777. launch_instance returns one; list_instances finds the rest.
argumentsNoArguments for the tool

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that it accepts unpublished raw debug commands, runs on one instance, waits until the game reports the command applied, and returns the state after execution. This gives an agent crucial insight into side effects and synchronization behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two focused sentences with no filler. The primary purpose is front-loaded, and the important behavioral qualifiers about command applicability and waiting semantics are delivered compactly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a generic dynamic executor, especially given the schema documents parameters. It covers purpose, target scope, command breadth, and post-command state. It does not enumerate return-value shapes or possible errors, but that is difficult for arbitrary tools and is not a major gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaningful semantics to the 'name' parameter by explaining it can be any tool from the instance's toolsets or any raw debug command, even unpublished. It also implicitly ties 'port' to 'one instance' and clarifies that arguments are forwarded to the selected tool or command.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Run a tool on one instance and return the result.' It clearly distinguishes call_tool from the lifecycle/discovery siblings (launch_instance, list_instances, stop_instance, instance_log) by framing it as the generic executor for any tool or command.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context instead of stating it explicitly: use this tool when you need to run any tool or raw debug command against a single instance. However, it never mentions alternatives or calls out when not to use it, such as preferring instance_log for log retrieval or launch_instance for starting a game.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_toolsetA

Full schemas for the tools in one toolset on one instance. 'bridge' is the toolset this bridge adds itself; 'passthrough' explains how to send commands the game has not published.

NameRequiredDescriptionDefault
nameYesToolset name, 'bridge', or 'passthrough'
portNoDebug port of the game instance to talk to. Defaults to the bridge's --port, then GAME_BRIDGE_PORT, then 7777. launch_instance returns one; list_instances finds the rest.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure. It implies a read-only introspection operation by saying it provides 'full schemas' and 'explains' commands, which is reasonably transparent. It does not mention error behavior, whether a running instance is required, or that it makes no modifications, but the read-only nature is strongly implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, with the core purpose front-loaded in the first sentence and essential special-case terminology in the second. Every sentence contributes useful information and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple introspection tool with two parameters and full schema coverage, the description covers the essential semantics including special name values and instance scoping. It does not describe the exact return structure, but 'full schemas' sufficiently conveys the expected output for this tool type. Missing explicit usage guidance vs siblings is the main gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The tool description adds genuine value beyond the schema by explaining what 'bridge' and 'passthrough' mean for the name parameter, which the schema only lists as allowed values. Port semantics are already fully covered in the parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns full schemas for all tools in a toolset on a single instance, which is a specific, recognizable purpose. It also distinguishes itself from siblings like list_toolsets by emphasizing schema detail and instance scoping. The special values 'bridge' and 'passthrough' add useful differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: if an agent needs full tool schemas, this is the tool. However, it does not explicitly contrast with list_toolsets, call_tool, or other siblings, nor state when not to use it. The explanation of 'bridge' and 'passthrough' gives usage context but not alternative-based selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

instance_logA

The captured stdout/stderr of an instance this bridge launched. When a game fails to boot, or dies mid-session, the stack trace is here and nowhere else.

NameRequiredDescriptionDefault
portNoDebug port of the game instance to talk to. Defaults to the bridge's --port, then GAME_BRIDGE_PORT, then 7777. launch_instance returns one; list_instances finds the rest.
linesNoHow many trailing lines (default 50)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It clearly states this is a read-only view of captured stdout/stderr from bridge-launched instances and that the interesting failure information is 'here and nowhere else', giving a strong execution-time mental model. It doesn't mention output formatting or truncation, but the captured-log framing covers the main behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first defines what the tool returns, the second says when to use it. No filler, no repetition of schema details, and the key use case is front-loaded early.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only log tool with two optional parameters and schema-covered parameter semantics, this description plus the schema is nearly complete. It tells the agent what the tool does, which scenarios call for it, and how parameters work. A minor gap is the exact return format, but with no output schema this is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters port and lines already have clear meaning, defaults, and port resolution order. The description adds no extra parameter-level detail, but the baseline is 3 when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool's resource: captured stdout/stderr for an instance launched by this bridge, and ties it to boot failures and mid-session crashes. It lacks an explicit verb like 'get' or 'read', but the meaning is unmistakable and it is clearly distinct from the launch/list/stop siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives direct usage context: when a game fails to boot or dies mid-session, the stack trace is here. It doesn't name alternative tools, but among lifecycle/toolset siblings this one is obviously the log-reader, so the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

launch_instanceA

Start a game instance and wait until it answers. The bridge picks a free port itself, so you never choose one and never collide with someone else's instance, and it owns the process: it is reaped when this server shuts down. Uses the project's launch declaration (gamebridge.json). Returns the port to pass to every other tool. Prefer this over starting the game yourself.

NameRequiredDescriptionDefault
portNoForce a specific port instead of letting the bridge choose. Rarely needed.
timeoutMsNoHow long to wait for the game to answer. A cold build plus a JVM can take minutes.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden, and it largely succeeds. It discloses that launch is synchronous ('wait until it answers'), that ports are auto-selected to avoid collisions, that the bridge owns the process and reaps it on shutdown, that it reads the project's gamebridge.json, and that the tool returns a port. These are exactly the behavioral details an agent needs beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place. The description is front-loaded with the core action and wait behavior, then explains port auto-selection, process ownership, config source, return value, and provides a usage recommendation. It is compact, well-organized, and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two optional parameters and no output schema, the description explains the key runtime contract: the launched process lifecycle, how the port is chosen, what the return value is for, and why the tool should be preferred over manual startup. An agent has enough context to select and call the tool correctly, including what to do with the returned port.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters (port and timeoutMs), so baseline is 3. The description adds meaningful context beyond the schema: the bridge automatically picks a free port, so forcing one is rarely needed, and the returned port must be passed to all other tools. This helps an agent understand when and why to use or omit the optional port parameter. Timeout semantics are left mostly to the schema, but the description's 'wait until it answers' supports the intent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear, specific verb and resource: 'Start a game instance and wait until it answers.' It also distinguishes itself from starting the game manually and, by mentioning the returned port that every other tool needs, it implicitly differentiates from listing/stopping/logging tools. This is unambiguous and not a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it is the preferred way to launch the game, the bridge handles port allocation, and the tool waits until the game responds. It explicitly says 'Prefer this over starting the game yourself,' which is strong guidance. It does not enumerate exact when-not-to-use conditions for each sibling, but the context is sufficient for an agent to choose it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_instancesA

What is running: instances that self-registered, plus a sweep of the configured port range for games that predate the registry. Reports name, version, pid, working directory, current screen and whether each was found via the registry or the scan. Read-only, so it is safe to point at instances someone else owns. Use it to attach to a game you did not launch.

NameRequiredDescriptionDefault
scanNoSweep the port range (default true)
pruneNoDelete registry entries whose port has been verified dead. Off by default: a game still binding its port looks identical to a crashed one.
rangeNoPorts to sweep, e.g. '7777,7800-7810'. Defaults to --scan-range.
registryNoRead the instance registry (default true)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly discloses the read-only safety property ('Read-only, so it is safe to point at instances someone else owns'), which is the key behavioral trait an agent needs. It does not contradict any annotations since none exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose ('What is running'), followed by reported fields, then safety and use case. Zero wasted words; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields and that coverage is complete for a read-only enumeration tool. The only mild gap is that the output format/ordering is unspecified, which is a minor omission for a listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3 applies even without param detail in the description. The description adds conceptual framing (the port sweep relation to 'games that predate the registry') but the schema already documents scan, prune, range, and registry thoroughly, including the dangerous prune default behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Leads with a specific verb and object — 'What is running: instances that self-registered, plus a sweep of the configured port range'. It names the exact fields reported (name, version, pid, working directory, current screen) and the two discovery sources (registry vs scan), and the read-only framing plus the 'attach to a game you did not launch' use case clearly separates it from the launch/stop/log siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit purpose statement — 'Use it to attach to a game you did not launch' — and explains the two data sources, which signals when a scan is needed (old instances) vs the registry alone. It does not explicitly name when NOT to use it or point to an alternative (e.g. instance_log for logs), but the context is clear enough for an agent to select it for enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_toolsetsA

List the toolsets one instance publishes, as that instance describes itself. Different ports can legitimately return different lists. Start here, then describe_toolset, then call_tool.

NameRequiredDescriptionDefault
portNoDebug port of the game instance to talk to. Defaults to the bridge's --port, then GAME_BRIDGE_PORT, then 7777. launch_instance returns one; list_instances finds the rest.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It reveals that the response reflects the instance's self-description and can vary by port, which is meaningful behavioral context. It also implies a read-only listing operation, though it doesn't go deeper into failure cases or return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences deliver the purpose, a critical caveat, and the recommended workflow. Every sentence earns its place, and the key distinction is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential workflow, port variability, and the self-describing nature of the response. It doesn't describe the exact return structure, but for a simple list operation without an output schema this is a minor gap given the clear intent and provided next steps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'port' parameter is fully documented in the schema, including defaults and how to obtain a port from sibling tools. The description adds only the note that different ports may return different lists, which supplements but does not significantly expand on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('List') and resource ('toolsets one instance publishes') and adds the important qualifier 'as that instance describes itself.' It is immediately distinguishable from sibling tools like launch_instance, list_instances, describe_toolset, and call_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs the agent to start here and then proceed to describe_toolset and call_tool, giving a clear workflow. It also warns that different ports can return different lists, which is essential context for choosing which instance/port to query.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_instanceA

Shut down an instance this bridge launched: the game's own close command first, then termination of the process tree if it will not go. Only ever applies to a process this bridge started. To ask a game you did not launch to exit, use call_tool { name: 'close' }.

NameRequiredDescriptionDefault
portNoDebug port of the game instance to talk to. Defaults to the bridge's --port, then GAME_BRIDGE_PORT, then 7777. launch_instance returns one; list_instances finds the rest.
graceMsNoHow long to wait for a clean exit

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it discloses the two-stage shutdown behavior, the escalation to process-tree termination, and the boundary that only bridge-launched processes are affected. This is exactly the kind of hidden destructive behavior an agent needs to know before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, with the core action and escalation front-loaded and no filler. Every sentence earns its place; nothing restates the tool name or repeats schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a shutdown tool with two optional parameters, clear destructive behavior, explicit scope boundaries, and a named sibling alternative, everything needed to select and invoke it correctly is present. The absence of an output schema is not a practical gap since the agent does not need return-value details to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are already fully described in the input schema, including port resolution order and graceMs purpose. The description adds no additional parameter-level detail, but with 100% schema coverage the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Shut down') and resource ('an instance this bridge launched'), and explicitly contrasts it with call_tool's 'close' command. An agent can immediately tell this tool is for shutdown of bridge-launched instances only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly scopes the tool to processes this bridge started and gives the exact alternative for games not launched by the bridge: use call_tool { name: 'close' }. This gives the agent both a clear when-to-use and when-not-to-use rule.

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.

  1. 7 tool updatesv0.1.0
    • First observedcall_tool
    • First observeddescribe_toolset
    • First observedinstance_log
    • First observedlaunch_instance
    • First observedlist_instances
    • First observedlist_toolsets
    • First observedstop_instance

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: launch, list, stop, get log, list toolsets, describe toolset, and call tool. No overlapping functionality.

Naming Consistency4/5

Most tools follow the verb_noun pattern (launch_instance, list_instances, stop_instance, list_toolsets, describe_toolset, call_tool), but 'instance_log' is a noun phrase rather than a verb action, which is a minor inconsistency.

Tool Count5/5

Seven tools is well-scoped for a game bridge server, covering management and introspection without being excessive or insufficient.

Completeness5/5

The tool set covers the full lifecycle of game instances (launch, list, stop, log) and toolset interaction (list, describe, call), leaving no obvious gaps for the stated purpose.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers