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
} |
| experimental | {} |
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. |
| 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. Args: name: Name for the new entity. parent_id: Optional entity ID of the parent. None for root-level. |
| delete_entityB | Delete an entity from the current O3DE level. 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_assetC | 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). |
| get_transformA | Get the world transform of an entity. |
| 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 empty level in the current O3DE project. |
| 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. Tries PySide6 widget grab first (captures the viewport widget
including UI overlays). Falls back to Args: output_path: File path for the screenshot (.png, .jpg, .jpeg, .bmp, or .tga). width: Optional width to scale the screenshot to (PySide6 path only). height: Optional height to scale the screenshot to (PySide6 path only). |
| 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_liveC | Query the running editor's BehaviorContext for a bus schema. |
| 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 a message if none are found. |
| list_gemsA | List all external gems registered on this machine. Returns: JSON array of gem objects, or a message if none are found. |
| 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 |
| get_asset_processor_statusB | Check whether the O3DE Asset Processor is running. |
| wait_for_assetsB | Wait for the Asset Processor to finish processing (or until timeout). |
| 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. |
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 66 tools
The toolset covers many distinct areas, but several near-overlapping pairs exist: build_project/start_build, run_editor_python/exec_in_session, get_bus_schema/get_bus_schema_live, and get_scene_snapshot/get_entity_tree/list_entities. Descriptions help clarify the differences, but the sheer number of similarly-purposed tools makes misselection likely.
The dominant verb_noun snake_case pattern is consistent and predictable across most tools (list_*, create_*, get_*, set_*, enable_*, disable_*). Minor outliers like undo, redo, exec_in_session, and wait_for_assets break the pattern slightly without causing major confusion.
66 tools is far beyond what is typically appropriate for a coherent MCP surface, even for a complex engine. Many tools could be consolidated, such as blocking vs background builds, one-off vs persistent Python execution, and multiple scene/entity listing variants, making the set heavy and difficult for an agent to navigate.
The surface is remarkably comprehensive for the O3DE domain: engine registration, project and gem management, builds, asset processing, logs, levels, entities, components, prefabs, viewport control, Python sessions, bus schemas, and console commands are all covered. Minor lifecycle gaps exist, such as no delete project/gem/level or entity rename, but core workflows do not hit dead ends.