o3de-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| O3DE_EDITOR_HOST | No | Editor remote console host. Default: 127.0.0.1 | |
| O3DE_EDITOR_PORT | No | Editor remote console port. Default: 4600 | |
| O3DE_ENGINE_NAME | No | Select engine by name when multiple are registered. Default: First valid engine | |
| O3DE_ENGINE_PATH | No | Override automatic engine discovery. Default: Auto-detected from manifest | |
| O3DE_BUILD_TIMEOUT | No | CMake build timeout (seconds). Default: 1800 | |
| O3DE_EDITOR_TIMEOUT | No | Editor command timeout (seconds). Default: 10 | |
| O3DE_EXPORT_TIMEOUT | No | Project export timeout (seconds). Default: 3600 | |
| O3DE_CMAKE_GENERATOR | No | CMake generator for builds. Default: Auto-detected per platform | |
| O3DE_CONFIGURE_TIMEOUT | No | CMake configure timeout (seconds). Default: 600 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_capabilitiesA | Check what O3DE MCP capabilities are currently available. Call this first to determine whether the editor is connected (for editor tools) and whether the O3DE CLI is available (for project tools). This avoids wasting tokens on tools that will fail. Tool categories are discovered dynamically — any new tools added to the server will automatically appear in the response. Returns:
JSON object with |
| run_editor_pythonA | Execute a Python script inside the running O3DE Editor. The script runs in the editor's embedded Python interpreter and has access to the full azlmbr (EditorPythonBindings) API. Use this for custom editor automation that isn't covered by other tools. Args: script: Python code to execute. Has access to azlmbr modules. timeout: Optional per-call execution timeout in seconds. The editor runs the script synchronously and does not reply until it finishes, so raise this for known-heavy operations. Omit to use the O3DE_EDITOR_TIMEOUT default (600s). |
| get_scene_snapshotA | Return the full scene state as JSON, served natively by the AiCompanion gem. Entities, components, transforms and hierarchy in one call, produced
by the gem's C++ SceneSnapshotProvider rather than an editor Python
script. Cheaper than |
| get_entity_treeA | Return the entity hierarchy as a nested JSON tree. Served natively by the AiCompanion gem, without editor Python. |
| get_entityA | Return one entity's name, transform, parent and component list as JSON. Served natively by the AiCompanion gem's C++ ( |
| validate_sceneA | Run the AiCompanion gem's scene validation and return the report as JSON. Flags common problems (missing cameras, entities without transforms, physics bodies without colliders, and similar) without executing any editor Python. |
| list_entitiesA | List all entities in the currently open O3DE level. Returns a JSON array of objects with 'id' and 'name' fields. |
| create_entityA | Create a new entity in the current O3DE level. Tries the AiCompanion gem's native Args: name: Name for the new entity. parent_id: Optional entity ID of the parent. Omit (or pass null) for root-level. |
| delete_entityA | Delete an entity from the current O3DE level. Tries the gem's native Args: entity_id: The entity ID to delete. |
| duplicate_entityA | Duplicate an entity (and its children) in the current O3DE level. Args: entity_id: The entity ID to duplicate. |
| get_entity_componentsA | List all components attached to an entity. Args: entity_id: The entity ID to inspect. Returns: JSON array of objects with 'component_id' and 'type' fields. |
| add_componentA | Add a component to an entity. Args: entity_id: The entity ID to add the component to. component_type: Component type name (e.g. 'Mesh', 'PhysX Dynamic Rigid Body'). |
| get_component_propertyA | Get a property value from a component on an entity. Args: entity_id: The entity ID. component_type: Component type name (e.g. 'Transform'). property_path: Property path using '|' separator (e.g. 'Controller|Configuration|Model Asset'). |
| set_component_propertyB | Set a property value on a component. Args: entity_id: The entity ID. component_type: Component type name (e.g. 'Transform'). property_path: Property path using '|' separator (e.g. 'Controller|Configuration|Model Asset'). value: The value to set (as a string — booleans as 'true'/'false', numbers as their string representation). |
| assign_assetA | Assign an asset to a component property by resolving the asset path.
|
| remove_componentC | Remove a component from an entity. |
| set_transformA | Set the world transform of an entity (only provided components are changed).
On gem API 0.5.0 and later (gem 0.6.0) the quaternion and the scale are
sent as is. A non-uniform scale is applied through the engine's
Non-uniform Scale component (each element at least 0.01); an O3DE
Transform itself holds only a uniform scale. A later uniform scale sets
that component back to 1. The reply carries On older gems the quaternion is converted to XYZ Euler degrees, a
rotation at a gimbal pole (pitch within 0.02 degrees of plus or minus 90)
goes through editor Python instead, which prints
|
| get_transformB | Get the world transform of an entity. Returns |
| set_parentA | Set the parent of an entity (reparent in the hierarchy). |
| run_console_commandC | Execute an O3DE console command in the running editor. |
| get_cvarB | Get the value of an O3DE console variable (CVAR). |
| set_cvarB | Set the value of an O3DE console variable (CVAR). |
| load_levelB | Open a level in the O3DE Editor. Args: level_path: Path to the level relative to the project (e.g. 'Levels/MyLevel'). |
| get_level_infoA | Get information about the currently loaded level. Returns: JSON object with 'level_name' and 'level_path' fields. |
| save_levelA | Save the currently open level. |
| create_levelA | Create a new level in the current O3DE project and open it in the editor. Args:
name: Level name (alphanumeric, hyphens or underscores, starting with
a letter). The level is written to |
| list_levelsC | List all levels available in an O3DE project. |
| enter_game_modeA | Enter game mode (play-in-editor) in the O3DE Editor. |
| exit_game_modeA | Exit game mode and return to edit mode. |
| undoB | Undo the last editor action. |
| redoA | Redo the last undone editor action. |
| get_viewport_cameraA | Get the position and rotation of the active editor viewport camera. Returns JSON with |
| set_viewport_cameraC | Set the active editor viewport camera transform. |
| focus_entityB | Focus the viewport camera on an entity. |
| capture_viewportA | Capture a screenshot of the editor viewport. Captures the rendered frame with Atom's
Args:
output_path: File path for the screenshot (.png, .jpg, .jpeg, .bmp, or .tga).
width: Scale width for the PySide6 grab only; ignored by the Atom
capture, so it has no effect on 26.10.0.
height: Scale height for the PySide6 grab only; ignored like |
| instantiate_prefabC | Instantiate a prefab in the current level. |
| create_prefab_from_entityA | Write a prefab file to disk from an existing entity. The path is relative to the project root. The level is not modified;
use |
| save_prefabA | Report where a prefab instance came from. Propagating live entity edits back to a .prefab file is not reachable
from the editor's Python API: |
| begin_sessionA | Begin a persistent Python session in the O3DE editor. |
| exec_in_sessionB | Execute Python code in a persistent session. |
| end_sessionB | End a persistent Python session and clean up its namespace. |
| get_session_varsA | List the variable names in a persistent Python session. |
| get_bus_schemaB | Discover the scripting API of any O3DE gem's reflected EBuses. |
| get_bus_schema_liveB | Query the running editor's BehaviorContext for a bus schema. Tries the AiCompanion gem's native |
| capture_renderdoc_frameA | Trigger a RenderDoc frame capture in the O3DE editor. Attempts to trigger a RenderDoc capture via Returns:
JSON with status |
| get_engine_infoA | Get information about the local O3DE engine installation. Returns: JSON object with engine metadata, or an error message if no engine is found. |
| list_projectsA | List all O3DE projects registered on this machine. Returns:
JSON array of project objects, or the error |
| list_gemsA | List all external gems registered on this machine. Returns:
JSON array of gem objects, or the error |
| list_project_gemsA | List gems enabled in a specific O3DE project. Args: project_path: Path to the O3DE project. |
| create_projectA | Create a new O3DE project. Args: name: Project name (alphanumeric, hyphens, underscores). path: Directory where the project will be created. template: Project template to use (default: DefaultProject). |
| register_gemA | Register an external gem with an O3DE project. Args: gem_path: Path to the gem directory. project_path: Path to the project to add the gem to. |
| enable_gemC | Enable a gem in an O3DE project. Args: gem_name: Name of the gem to enable. project_path: Path to the project. |
| build_projectB | Build an O3DE project using CMake. This runs CMake configure followed by CMake build. Timeouts are
configurable via Args: project_path: Path to the O3DE project. config: Build configuration -- profile, debug, or release (default: profile). |
| disable_gemB | Disable a gem in an O3DE project. Args: gem_name: Name of the gem to disable. project_path: Path to the project. |
| create_gemB | Create a new O3DE gem. Args: name: Gem name (alphanumeric, hyphens, underscores). path: Directory where the gem will be created. template: Gem template to use (default: DefaultGem). |
| export_projectA | Export an O3DE project for distribution. This is a long-running operation. Timeout is configurable via
the Args: project_path: Path to the O3DE project to export. output_path: Directory where the exported project will be written. config: Build configuration -- profile, debug, or release (default: profile). |
| edit_project_propertiesB | Edit properties of an existing O3DE project. Args: project_path: Path to the project. project_name: New name for the project (optional). origin: New origin URL or description (optional). |
| list_templatesA | List available O3DE project and gem templates. Scans the engine's Templates directory for template definitions. Returns: JSON array of template objects with name, summary, and path. |
| register_engineA | Register an O3DE engine installation with the O3DE manifest. Args: engine_path: Path to the engine root directory (must contain engine.json). |
| set_active_engineA | Set the active O3DE engine by name (in-process, not persistent). Args: name: Name of the registered engine to activate. |
| start_buildA | Start a CMake build in the background and return a build ID. Unlike Args: project_path: Path to the O3DE project. config: Build configuration -- profile, debug, or release (default: profile). target: Optional CMake target to build (default: all targets). |
| get_build_statusA | Check the status of a background build. Args:
build_id: Build ID returned by |
| list_sequencesA | List the Track View cinematic sequences in the current level. Returns |
| create_sequenceA | Create a new Track View cinematic sequence in the current level. Creates a modern Sequence Component sequence (on its own entity). A new
sequence has no nodes; add a Args: name: Sequence name. |
| delete_sequenceC | Delete a Track View cinematic sequence from the current level. Args: name: Sequence name. |
| get_sequenceA | Describe one Track View sequence: its time range and its nodes. Returns JSON with the time range and the node names at the sequence root. A sequence with no Director node yet reports an empty node list. Args: name: Sequence name. |
| set_sequence_time_rangeB | Set a Track View sequence's play time range, in seconds. Args: name: Sequence name. start: Range start in seconds. end: Range end in seconds (must be greater than start). |
| add_sequence_nodeA | Add a node to a Track View sequence. Add a Args:
name: Sequence name.
node_type: One of |
| play_sequenceC | Start playing a Track View sequence in the editor. Args: name: Sequence name. |
| stop_sequenceB | Stop the Track View sequence currently playing in the editor. |
| list_anim_graphsA | List every EMotion FX anim graph the engine holds. Returns the gem's JSON: |
| get_anim_graphA | Describe one EMotion FX anim graph in full. Returns the gem's JSON: Args:
anim_graph_id: Graph id from |
| create_anim_graphA | Create a new, empty, in-memory EMotion FX anim graph to author. Returns |
| remove_anim_graphB | Remove an anim graph from the engine (not its file on disk). Returns Args: anim_graph_id: Graph id (number or digit string). |
| load_anim_graphA | Load an Returns Args:
file_name: Absolute path, an |
| save_anim_graphA | Save an anim graph to disk. Not undoable. Returns Args: anim_graph_id: Graph id (number or digit string). file_name: Where to save. Omit to save to the graph's current file. |
| add_anim_graph_nodeA | Add a node to an anim graph. Returns the new node object exactly as Args:
anim_graph_id: Graph id (number or digit string).
node_type: RTTI or palette name, case-insensitive (for example
|
| remove_anim_graph_nodeA | Remove a node (and its children) from an anim graph. The root is refused. Returns Args:
anim_graph_id: Graph id (number or digit string).
node_id: Node id from |
| set_anim_graph_entry_stateB | Make a node the entry state of the state machine that contains it. Returns Args: anim_graph_id: Graph id (number or digit string). node_id: The node to enter first; it must be able to act as a state. |
| add_anim_graph_parameterA | Add a value parameter to an anim graph. Returns the parameter object as Args:
anim_graph_id: Graph id (number or digit string).
name: Parameter name.
parameter_type: |
| remove_anim_graph_parameterB | Remove a value parameter from an anim graph. Groups are refused. Returns Args: anim_graph_id: Graph id (number or digit string). name: The parameter's name. |
| add_anim_graph_transitionA | Add a state-machine transition, optionally with conditions. Returns the transition object as Args:
anim_graph_id: Graph id (number or digit string).
target_node_id: The state to transition to.
source_node_id: The state to transition from. Required unless
|
| set_anim_graph_transitionA | Change a transition's settings. Pass at least one setting. Returns the transition object as Args:
anim_graph_id: Graph id (number or digit string).
transition_id: Transition id from |
| remove_anim_graph_transitionB | Remove a transition (and its conditions). Returns Args:
anim_graph_id: Graph id (number or digit string).
transition_id: Transition id from |
| connect_anim_graph_portsA | Connect an output port to an input port (blend trees). Returns the target node's input port object. Refused: a target inside a
state machine (use Args: anim_graph_id: Graph id (number or digit string). source_node_id: Node whose output to connect. source_port: Output port index or name. target_node_id: Node whose input to connect. target_port: Input port index or name. |
| disconnect_anim_graph_portsA | Remove the connection feeding an input port. Returns Args: anim_graph_id: Graph id (number or digit string). target_node_id: Node whose input to free. target_port: Input port index or name. |
| set_anim_graph_nodeA | Edit a node: rename, move, enable/disable, or set reflected fields. Returns the node object as Args:
anim_graph_id: Graph id (number or digit string).
node_id: Node id from |
| get_asset_processor_statusB | Check whether the O3DE Asset Processor is running. |
| wait_for_assetsA | Wait for the Asset Processor process to exit (or until timeout). This watches for the process to stop, not for it to go idle, so it suits
a one-off AssetProcessorBatch run. A GUI Asset Processor running beside
the editor stays up while idle, so with one running this waits out the
timeout and reports Returns a progress result |
| refresh_assetsC | Trigger an Asset Processor rescan for a project. |
| tail_logB | Read the last N lines of an O3DE log file. |
| get_log_errorsC | Extract error lines from an O3DE log file. |
| get_asset_statusA | Ask the Asset Processor, through the editor, for one asset's build status. Returns Args: path: A source or product path, relative to the project, or a full path. flush_io: Flush the file monitor first. Use right after writing the file. |
| get_asset_jobsA | List the Asset Processor jobs for one source file, with failure logs. Returns Args: source_path: The source file, relative to the project or a full path. escalate: Move the file's queued jobs to the front of the queue. include_logs: Attach each failed job's log (cut at 64 KB). |
| get_asset_processor_connectionA | Report whether the editor is connected to the Asset Processor. Returns |
| wait_for_assetA | Wait until one asset is built, or report why it failed. Polls Args:
path: The asset to wait for: its source path (best, since the job
check needs the source) or a product path.
timeout: Seconds to wait (default 120, max 3600).
just_written: True right after writing the file, so the first query
flushes the file monitor.
source_path: The source file to check for failed jobs, when |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 96 tools
The set contains several tool clusters with overlapping purposes: seven asset-processor status/wait tools, multiple entity-query tools (list_entities, get_entity, get_entity_tree, get_scene_snapshot, get_entity_components), and several Python/session execution tools (run_editor_python, exec_in_session, run_console_command). The descriptions are unusually detailed and do explain the distinctions, but with 96 tools an agent still faces real misselection risk across these clusters.
Nearly all names use a consistent snake_case verb_noun pattern (create_entity, delete_entity, get_transform, set_transform, add_anim_graph_node, remove_anim_graph_node). Minor deviations like undo/redo and the _live suffix on get_bus_schema_live are readable but not perfect matches for the pattern.
96 tools is far beyond what an agent can reliably manage in one MCP surface and qualifies as an extreme mismatch, even for a broad game-engine editor. Many operations (asset status, entity queries, project/gem management) could be consolidated into fewer, more capable tools.
The surface is very broad, covering entity/component CRUD, transforms, levels, sequences, anim-graph authoring, assets, and project/gem lifecycle. There are some notable gaps and dead ends: no delete_level, delete_project, remove_gem, or deregister_engine, and save_prefab is documented as unable to propagate edits back to disk.