Skip to content
teamhimeH edited this page Apr 19, 2026 · 5 revisions

MCPサーバ機能

SimutransのゲームループにMCP(Model Context Protocol)サーバが組み込まれており、Claude CodeなどのAIツールからゲームの情報を取得したり操作を行ったりすることができます。

概要

  • AIツール(Claude Codeなど)からSquirrelスクリプトをゲーム内で実行できます
  • Squirrelスクリプトには、SimutransのスクリプトAPI(路線・停留所・車両・都市・工場など)がすべて利用可能です
  • 操作はローカルホストのみに公開されます(外部からはアクセスできません)

前提条件

  • OTRP-KUTAv6バイナリ(MCPサーバ機能を含む版)
  • Claude Code(公式サイト

起動方法

SimutransをMCPサーバ付きで起動するには、-mcp-port オプションを指定します。

./sim -mcp-port 13354 -load game1
オプション 説明
-mcp-port PORT MCPサーバをPORTで起動(デフォルト: 13354)
-load SAVENAME セーブデータ名(拡張子・パス不要)

起動後、ポートがLISTEN状態になるまで数秒かかります。

Claude Codeへの設定

ゲームデータディレクトリ(simバイナリと同じ場所)に .mcp.json を作成します。

{
  "mcpServers": {
    "simutrans": {
      "type": "stdio",
      "command": "nc",
      "args": ["localhost", "13354"]
    }
  }
}

注意: Simutransを先に起動してからClaude Codeを開いてください。Simutransが起動していない状態では接続に失敗します。

利用可能なツール

run_squirrel

Squirrelスクリプトを受け取り、ゲーム内で実行します。

パラメータ:

パラメータ 必須 説明
code string 実行するSquirrelコード
player_nr integer プレイヤー番号(0〜15、デフォルト: 1)

戻り値: スクリプトが return した値を文字列として返します。

Squirrel API

スクリプトからはSimutransの標準スクリプトAPIがすべて使用できます。主なクラスと関数を示します。

グローバルオブジェクト・関数

名前 説明
world マップ全体の情報へのアクセス(テーブル、関数ではない)
player_x(nr) プレイヤーオブジェクトを取得

world オブジェクト

メソッド 戻り値 説明
world.get_time() time_x 現在のゲーム内時刻
world.get_size() coord マップサイズ
world.find_nearest_city(coord) city_x 指定座標に最も近い都市
world.get_convoy_list() リスト 全車両リスト
world.get_attraction_list() リスト 全観光地リスト
world.get_citizens() array 都市人口の推移

player_x クラス

メソッド 戻り値 説明
player_x(nr).get_name() string プレイヤー名
player_x(nr).is_valid() bool プレイヤーが存在するか
player_x(nr).get_line_list() line_list_x 路線リスト

line_list_x クラス

メソッド / 構文 説明
lines.get_count() 路線数を返す
foreach(line in lines) 路線を順番に取得(lineline_x

line_x クラス

メソッド 戻り値 説明
line.get_name() string 路線名
line.is_valid() bool 路線が存在するか
line.get_owner() player_x 路線のオーナー
line.get_convoy_list() リスト この路線の車両リスト
line.get_way_type() int 交通種別

halt_x クラス(停留所)

メソッド 戻り値 説明
halt.get_name() string 停留所名
halt.is_valid() bool 停留所が存在するか
halt.get_line_list() line_list_x 経由する路線リスト
halt.get_convoy_list() リスト 現在停車中の車両リスト

time_x クラス

フィールド 説明
year
month 月(1〜12)

スクリプト例

ゲーム内時刻の取得

local t = world.get_time()
return t.year + "" + t.month + ""

路線一覧の取得

local player = player_x(0)  // プレイヤー番号は起動時の player_nr と合わせる
local lines = player.get_line_list()
local result = "路線数: " + lines.get_count() + "\n"
foreach(line in lines) {
    result += line.get_name() + "\n"
}
return result

プレイヤー一覧の取得

local result = ""
for(local p = 0; p < 16; p++) {
    local player = player_x(p)
    if(player.is_valid()) {
        result += "Player " + p + ": " + player.get_name() + "\n"
    }
}
return result

制限事項

  • ファイル操作・システムコマンドは無効: ファイルの読み書き(file, loadfile など)やシステム関数(system, getenv など)はセキュリティのため使用できません。
  • VM は呼び出しごとに初期化: グローバル変数や定義した関数は、呼び出し間で引き継がれません。状態を保持したい場合はゲームオブジェクト(路線名など)に書き込む必要があります。
  • ローカルホストのみ: MCPサーバは localhost のみでリスンします。ネットワーク越しのアクセスはできません。

デバッグ

スクリプト実行時のエラーはゲームデータディレクトリの script-mcp.log に記録されます。スクリプトがエラーになった場合はこのファイルを確認してください。

APIの詳細

利用可能なAPIの完全なリストはSimutransのソースコード(script/api/ ディレクトリ以下)を参照してください。Simutransのスクリプト機能(AIスクリプト・シナリオスクリプト)と同じAPIが利用できます。

Clone this wiki locally