OpenBeam MCP tools

Share

This reference covers the 22 tools exposed by the OpenBeam game's MCP server. Through OpenBeam Cloud, they operate on the game in the session you connected to. Follow MCP access and connection to connect a client.

Use your connected server's tools/list response to confirm the names and input schemas available in your session. Game versions can differ.

Tool index

Tool Purpose
status Inspect the simulation, vehicles, menus, and operation state.
telemetry Read the current player vehicle's motion and physics summary.
screenshot Capture the game window.
read_log Read recent game or script log messages.
list_levels Find level archives available to the game.
upload_level Install a level archive into the session.
delete_level Remove an uploaded level archive from the session.
install_mod Install a vehicle mod, level archive, or combined archive.
list_mods Inspect uploaded mods and their usable vehicles.
delete_mod Remove an uploaded mod archive from the session.
load_level Load an installed level or classic terrain.
spawn_vehicle Spawn a vehicle in the loaded level.
reload Apply texture or level changes while the game runs.
asset_zone Show the area where an agent is creating or updating an asset.
run_script Execute an AngelScript statement.
gamepad Operate game menus through simulated controller input.
quit Request that the game exit.
cloud_status Inspect the game's Cloud account sign-in.
cloud_sign_in Sign the game into an OpenBeam Cloud account.
cloud_sign_out Clear the game's saved Cloud sign-in.
cloud_list_levels List the account's Cloud library.
cloud_upload_level Save a level or vehicle archive to the Cloud library.

Calling a tool

Most MCP clients let you call a tool by name and supply its arguments. Over HTTP, a tool call uses a JSON-RPC request like this:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "status",
    "arguments": {}
  }
}

The examples in each tool entry below show the params object. Tools with no arguments use {}. Supply only the documented argument names; the schemas disallow additional properties.

To discover the tools, send a tools/list request through your MCP client:

{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}

Files and coordinates

path, archive, and returned file paths refer to files on the machine running the game. In a hosted session, that is the game server. To install an archive from a URL, supply a URL the game can download and the archive's SHA-256 digest.

Positions and asset-zone bounds use three numbers, [x, y, z], in world metres, with positive Y pointing up.

Reading results

Tool results can include text, structuredContent, or image content. Check isError and any completion fields such as loaded, spawned, or succeeded. A queued or pending operation needs a later check before you treat it as finished.

For operations that report queued_at_frame, status.serviced_frames advancing beyond that frame with status.queue_empty: true indicates that queued work has been serviced. Use read_log to investigate a refusal.

State and diagnostics

status

Read the current game state. Call this first when working with a session.

Arguments: none.

Returns: app_state, sim_state, terrain, terrain_loaded, actor_count, and player_actor (or null). It also reports menu visibility in menus, operation progress through serviced_frames and queue_empty, cache_refresh_pending, hot-reload results in reloads, and current asset_zones.

{"name":"status","arguments":{}}

telemetry

Read a physics summary for the vehicle the player is currently using. Spawn and enter a vehicle first.

Arguments: none.

Returns: vehicle name, position, velocity, speed_mps, wheel_speed_mps, nodes, beams, and broken_beams. engine_rpm and gear are included when the vehicle has an engine. A session with no player vehicle returns a tool error.

{"name":"telemetry","arguments":{}}

screenshot

Capture the presented game window.

Argument Type Required Meaning
wait_seconds number No Time to wait for the capture, from 1 to 120 seconds. Default: 20.

Returns: image content when the capture fits the inline size limit, plus metadata containing path, bytes, and inline. Larger captures return the game-server file path and inline: false. A returned server path is not a public download URL.

{"name":"screenshot","arguments":{"wait_seconds":20}}

read_log

Read the tail of the game log or script log, optionally filtering the lines.

Argument Type Required Meaning
log string No game (default) or script.
lines integer No Number of matching lines to return, from 1 to 2000. Default: 100.
grep string No Regular expression used to filter messages.

Returns: log text. The game log is RoR.log; the script log is Angelscript.log. Filtering uses ECMAScript regular expressions.

{"name":"read_log","arguments":{"log":"game","lines":100,"grep":"Spawn|refus|JBeam"}}

Levels, vehicles, and asset updates

Archive arguments

upload_level and install_mod accept the same arguments:

Argument Type Required Meaning
url string One source HTTP or HTTPS URL of a ZIP archive. Supply exactly one of url or path.
path string One source ZIP archive already on the game's machine.
sha256 string With url Expected SHA-256 digest: 64 hexadecimal characters. It can also verify a local file.
filename string No Installed archive name, ending in .zip.
replace boolean No Allow replacement of an archive with the same installed name. Default: false.

Archive filenames must be 1–128 bytes, contain only letters, numbers, ., _, spaces, or -, and end in .zip. If filename is omitted, the tool derives it from the source name or digest.

An archive supplies a level through a levels/<level_id>/ directory. A vehicle mod supplies a vehicles/<vehicle_id>/ directory containing .jbeam or .pc files. The returned cache results identify which vehicles are usable.

list_levels

List uploaded level archives and level archives known to the game's mod cache.

Arguments: none.

Returns: a levels array and upload_directory. Archive records include filename, path, size, sha256 (which may be null), levelIds, vehicleIds, and uploaded. Cached level details can include display names and spawn points. A cache lookup problem is reported in cache_error when applicable.

{"name":"list_levels","arguments":{}}

upload_level

Install a ZIP archive containing a BeamNG level into the session. Use load_level afterward to enter one of its levels.

Arguments: exactly one of url or path, plus sha256, filename, and replace as described in Archive arguments. A URL requires sha256.

Returns: the installed archive under level, already_present, and the cache refresh result in cache. Cache information can include entries, vehicles, and refused. The archive's levelIds are the IDs to use with load_level.

{"name":"upload_level","arguments":{"url":"https://example.com/example-level.zip","sha256":"YOUR_ARCHIVE_SHA256","filename":"example-level.zip"}}

Replace the example URL and digest with values for your archive. Installing an archive and loading its level are separate operations.

delete_level

Remove an archive from the session's uploaded archive folder and refresh its cache entries.

Argument Type Required Meaning
filename string Yes Name of an uploaded ZIP archive, as returned by the listing tools.

Returns: deleted with the filename and cache with the refresh outcome. Only archives in the uploaded folder can be removed. The Cloud library is separate from the session's files.

{"name":"delete_level","arguments":{"filename":"example-level.zip"}}

install_mod

Install a vehicle mod, a level archive, or a ZIP containing both. The game refreshes the mod cache, including while a level is loaded.

Arguments: exactly one of url or path, plus sha256, filename, and replace as described in Archive arguments. A URL requires sha256.

Returns: the installed archive under mod, already_present, and cache. When available, vehicles contains the exact filenames accepted by spawn_vehicle; entries contains cache entries, and refused lists rejected entries and their causes.

{"name":"install_mod","arguments":{"url":"https://example.com/example-vehicle.zip","sha256":"YOUR_ARCHIVE_SHA256","filename":"example-vehicle.zip"}}

Copy a filename from the returned vehicles list when spawning a vehicle. The game's cache names can differ from the ZIP filename.

list_mods

List the session's uploaded archives and the cache contents associated with them.

Arguments: none.

Returns: a mods array and upload_directory. Records include archive metadata, levelIds, and vehicleIds; available cache details include vehicles, entries, and refused.

{"name":"list_mods","arguments":{}}

delete_mod

Remove an uploaded archive containing a vehicle mod, level, or both. It uses the same removal behavior as delete_level.

Argument Type Required Meaning
filename string Yes Name of an uploaded ZIP archive.

Returns: deleted with the filename and cache with the refresh outcome. Removing a session archive does not delete a copy in the Cloud library.

{"name":"delete_mod","arguments":{"filename":"example-vehicle.zip"}}

load_level

Leave the current level and load an installed BeamNG level or a classic terrain.

Argument Type Required Meaning
level_id string For a BeamNG level An ID returned by list_levels, upload_level, or install_mod.
filename string No Choose a particular installed archive when several contain the same level_id.
archive string No Explicit archive path on the game's machine, used with level_id.
sha256 string No Digest for the archive. The game can use a known digest or compute one if omitted.
terrain string For a classic terrain Terrain name. Use this instead of level_id and archive.
spawn string No Named spawn point for a BeamNG level.
wait_seconds number No Time to wait for completion, from 0 to 900 seconds. Zero returns after queuing the load.

Returns: requested, and sha256 for archive loads. A completed load reports loaded and terrain. A load still in progress reports loaded: false and pending: true; a zero wait reports queued: true. A refused load is a tool error with a message.

{"name":"load_level","arguments":{"level_id":"YOUR_LEVEL_ID","filename":"example-level.zip","wait_seconds":180}}

Set wait_seconds explicitly for a predictable wait across game versions. If loading remains pending, poll status and inspect read_log before requesting another load.

spawn_vehicle

Spawn a vehicle from the mod cache. A level must already be loaded.

Argument Type Required Meaning
file string Yes Exact vehicle filename from the cache, such as an entry returned by install_mod or list_mods.
config string No A configuration offered by that vehicle. The game selects an available configuration when omitted.
position array of 3 numbers No Spawn position [x, y, z] in world metres. Defaults to the player's character position when available.
enter boolean No Enter the spawned vehicle when it can be driven. Default: true.
wait_seconds number No Time to wait, from 0 to 600 seconds. Zero returns after queuing the spawn.

Returns: resolved and config. A completed attempt includes spawned, actor_count, and player_actor when available. An incomplete wait reports spawned: false and pending: true; zero wait reports queued: true. A completed attempt that creates no actor is a tool error.

{"name":"spawn_vehicle","arguments":{"file":"VEHICLE_FILENAME_FROM_LIST_MODS","enter":true,"wait_seconds":60}}

Set wait_seconds explicitly. Read telemetry after spawning and entering a vehicle to inspect its physics summary.

reload

Apply changed texture packs or changes to the loaded BeamNG level while the game runs.

Argument Type Required Meaning
what string Yes textures or level.

Returns: queued and count_before. Poll status.reloads.<what> for an increased count, applied, and outcome. A queued reply confirms the request was accepted; the later reload result reports whether it was applied.

{"name":"reload","arguments":{"what":"level"}}

asset_zone

Show an agent's work area as a box in the world with a status marker. Use it to communicate progress while creating or changing content.

Argument Type Required Meaning
action string Yes begin, update, end, remove, or list.
key string Except for list Stable identifier for the zone.
label string No Name shown to the user.
state string No pending or building while work is active. The default for a new zone is building.
progress number No Progress from 0 to 1.
message string No Progress details or the final result message.
box object No Bounds with min and max, each [x, y, z].
center array of 3 numbers With size Alternative to box: the box centre.
size array of 3 numbers With center Non-negative box dimensions in metres.
result string For end ready or failed.

Returns: zone for begin, update, or end; zones for list; or removed: true for removal. Zones also appear in status.asset_zones.

Begin a zone:

{"name":"asset_zone","arguments":{"action":"begin","key":"example-asset","label":"Example asset","center":[0,2,0],"size":[10,4,10],"state":"building","progress":0}}

Finish it:

{"name":"asset_zone","arguments":{"action":"end","key":"example-asset","result":"ready","message":"Asset is ready"}}

Use update with the same key to change progress or geometry. Use either box or the paired center and size. Keys beginning with level:, overlay:, or content: are reserved for the game's own zones. Completed zones fade; a zone with no updates for 15 minutes is marked as stalled.

Scripts and controls

run_script

Execute one AngelScript statement in the game.

Argument Type Required Meaning
code string Yes A non-empty AngelScript statement.

Returns: return_code and succeeded. Read the script log for messages or errors. An unsuccessful script can return succeeded: false, so check this field as well as the MCP result's isError.

{"name":"run_script","arguments":{"code":"game.log(\"Example test message\");"}}

Follow with read_log using log: "script" to inspect the output.

gamepad

Send controller input to the game's menus. The D-pad and left stick move focus; a selects, b goes back, and lb or rb switches tabs. In a simulation, menu opens the pause menu. This tool operates menus; vehicle driving is not implemented by this tool.

Argument Type Required Meaning
button string For a button press a, b, x, y, view, menu, ls, rs, lb, rb, up, down, left, or right.
action string No tap (default), down, or up.
axis string For axis input left_x, left_y, right_x, right_y, lt, or rt.
value number With axis Stick value from -1 to 1; use 0 to release. Trigger controls conventionally use 0 to 1.

Returns: the button and action, or axis and value, plus queued_at_frame. Use status.menus to confirm the resulting screen.

{"name":"gamepad","arguments":{"button":"a","action":"tap"}}

Send one button action or one axis value per call. After a held button (down), send up to release it. A non-zero axis value stays active until you send another value, typically 0.

quit

Request that the game exit. The MCP connection can become unavailable once it shuts down.

Arguments: none.

Returns: queued: true when shutdown has been requested.

{"name":"quit","arguments":{}}

Cloud account and library

These tools manage the running game's own sign-in to OpenBeam Cloud and its access to the account's stored archives. Connecting an external MCP client to a hosted session uses the separate MCP access flow.

cloud_status

Inspect whether the game has a saved Cloud sign-in and whether device approval is in progress.

Arguments: none.

Returns: signed_in, api_url, and user_id when available. A sign_in object