forked from aburch/simutrans
-
Notifications
You must be signed in to change notification settings - Fork 24
MCP Server
teamhimeH edited this page Apr 19, 2026
·
5 revisions
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状態になるまで数秒かかります。
ゲームデータディレクトリ(simバイナリと同じ場所)に .mcp.json を作成します。
{
"mcpServers": {
"simutrans": {
"type": "stdio",
"command": "nc",
"args": ["localhost", "13354"]
}
}
}注意: Simutransを先に起動してからClaude Codeを開いてください。Simutransが起動していない状態では接続に失敗します。
Squirrelスクリプトを受け取り、ゲーム内で実行します。
パラメータ:
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
code |
string | ○ | 実行するSquirrelコード |
player_nr |
integer | △ | プレイヤー番号(0〜15、デフォルト: 1) |
戻り値: スクリプトが return した値を文字列として返します。
スクリプトからはSimutransの標準スクリプトAPIがすべて使用できます。主なクラスと関数を示します。
| 名前 | 説明 |
|---|---|
world |
マップ全体の情報へのアクセス(テーブル、関数ではない) |
player_x(nr) |
プレイヤーオブジェクトを取得 |
| メソッド | 戻り値 | 説明 |
|---|---|---|
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(nr).get_name() |
string | プレイヤー名 |
player_x(nr).is_valid() |
bool | プレイヤーが存在するか |
player_x(nr).get_line_list() |
line_list_x |
路線リスト |
| メソッド / 構文 | 説明 |
|---|---|
lines.get_count() |
路線数を返す |
foreach(line in lines) |
路線を順番に取得(line は 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.get_name() |
string | 停留所名 |
halt.is_valid() |
bool | 停留所が存在するか |
halt.get_line_list() |
line_list_x |
経由する路線リスト |
halt.get_convoy_list() |
リスト | 現在停車中の車両リスト |
| フィールド | 説明 |
|---|---|
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 resultlocal 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の完全なリストはSimutransのソースコード(script/api/ ディレクトリ以下)を参照してください。Simutransのスクリプト機能(AIスクリプト・シナリオスクリプト)と同じAPIが利用できます。