Unreal Engine Vibe Coding tool
# Add to your Claude Code skills
git clone https://github.com/kevinpbuckley/VibeUEhttps://www.vibeue.com/
VibeUE brings AI directly into Unreal Engine with an In-Editor Chat Client and Model Context Protocol (MCP) integration. Plan, inspect, create, and modify Blueprints, assets, materials, animation, landscapes, audio, UI, AI behavior, project settings, and more through natural language.
🔑 A free VibeUE API key is required for the MCP server and AI Chat to work. Get yours at vibeue.com/login — then paste it into the VibeUE settings gear icon inside Unreal Editor. See the AI Clients setup guide for IDE configuration.
No comments yet. Be the first to share your thoughts!
VibeUE uses a Python-first architecture that gives AI assistants access to:
Lightweight MCP tools for AI interaction with Unreal:
| Tool | Purpose |
|------|---------|
| discover_python_module | Inspect module contents (classes, functions, constants) |
| discover_python_class | Get class methods, properties, and inheritance |
| discover_python_function | Get function signatures and docstrings |
| execute_python_code | Run Python code in Unreal Editor context |
| list_python_subsystems | List available UE editor subsystems |
| manage_skills | Load domain-specific knowledge on demand |
| manage_asset | Search, open, save, move, duplicate, and delete assets safely |
| read_logs | Read and filter Unreal Engine log files with regex support |
| terrain_data | Generate real-world heightmaps, map images, and water feature data from geographic coordinates |
| deep_research | Web search, page fetching, and GPS geocoding — no API key required |
Note: The read_logs MCP tool provides access to Unreal Engine's log files for debugging, error analysis, and workflow understanding.
Note: The manage_asset MCP tool is the preferred path for asset search, save, move, duplicate, and delete workflows. It avoids ad hoc Python asset handling and preserves references when renaming or moving content.
Note: The terrain_data and deep_research tools work together for real-world terrain workflows: geocode a place name → generate a heightmap → import into a landscape → fetch water features.
discover_python_module
discover_python_module(
module_name: str, # e.g., "unreal" (lowercase for UE module)
name_filter: str = "", # Filter by name substring (case-insensitive)
include_classes: bool = True, # Include classes in results
include_functions: bool = True, # Include functions in results
max_items: int = 100, # Maximum items to return (0 = unlimited)
case_sensitive: bool = False # Whether filtering is case-sensitive
)
Example: discover_python_module("unreal", name_filter="Blueprint")
discover_python_class
discover_python_class(
class_name: str, # Fully qualified class name (e.g., "unreal.BlueprintService")
method_filter: str = "", # Filter methods by name substring
include_inherited: bool = False, # Include inherited methods
include_private: bool = False, # Include private methods starting with _
max_methods: int = 0 # Maximum methods to return (0 = unlimited)
)
Example: discover_python_class("unreal.BlueprintService", method_filter="variable")
discover_python_function
discover_python_function(
function_name: str # Fully qualified function name (e.g., "unreal.load_asset")
)
list_python_subsystems
list_python_subsystems() # No parameters - returns all UE editor subsystems
Usage: Access via unreal.get_editor_subsystem(unreal.SubsystemName)
execute_python_code
execute_python_code(
code: str # Python code to execute (must start with "import unreal")
)
Important: Use import unreal (lowercase). For subsystems: unreal.get_editor_subsystem(unreal.LevelEditorSubsystem)
Returns: stdout, stderr, and execution status
manage_skills
# List all available skills
manage_skills(action="list")
# Suggest skills based on query
manage_skills(action="suggest", query="create widget button")
# Load single skill
manage_skills(action="load", skill_name="blueprints")
# Load multiple skills together (more efficient - deduplicated discovery)
manage_skills(action="load", skill_names=["blueprints", "enhanced-input"])
Skill names: animation-blueprint, animation-editing, animation-montage, animsequence, asset-management, blueprint-graphs, blueprints, data-assets, data-tables, engine-settings, enhanced-input, enum-struct, foliage, gameplay-tags, landscape, landscape-auto-material, landscape-materials, level-actors, materials, metasounds, niagara-emitters, niagara-systems, project-settings, screenshots, skeleton, sound-cues, state-trees, terrain-data, umg-widgets
manage_asset
# Search before acting
manage_asset(action="search", search_term="BP_Player", asset_type="Blueprint")
# Open or save a specific asset
manage_asset(action="open", asset_path="/Game/Blueprints/BP_Player")
manage_asset(action="save", asset_path="/Game/Blueprints/BP_Player")
# Save everything dirty before a build or launch
manage_asset(action="save_all")
# Move or rename while preserving references
manage_asset(action="move", source_path="/Game/StateTree/STT_Rotate", destination_path="/Game/StateTree/Tasks/STT_Rotate")
Important: Use move, not duplicate + delete, when the intent is a rename or relocation. Duplicate creates a second asset identity.
read_logs
# List all logs
read_logs(action="list")
# Filter by category: System, Blueprint, Niagara, VibeUE
read_logs(action="list", category="Niagara")
# Get file info
read_logs(action="info", file="main")
# Read paginated content
read_logs(action="read", file="main", offset=0, limit=2000)
# Get last N lines
read_logs(action="tail", file="main", lines=50)
# Get first N lines
read_logs(action="head", file="main", lines=50)
# Regex filter with context
read_logs(
action="filter",
file="main",
pattern="ERROR|EXCEPTION",
context_lines=5,
max_matches=100,
case_sensitive=False
)
# Find errors
read_logs(action="errors", file="main", max_matches=20)
# Find warnings
read_logs(action="warnings", file="main", max_matches=20)
# Get new content since last read
read_logs(action="since", file="main", last_line=2500)
# Get help documentation
read_logs(action="help")
File Aliases:
main, system → Project log (FPS57.log)chat, vibeue → Chat history logllm → Raw LLM API logterrain_data
# Preview elevation stats and get suggested settings
terrain_data(action="preview_elevation", lng=-122.4194, lat=37.7749)
# Generate a heightmap matching your landscape resolution
terrain_data(
action="generate_heightmap",
lng=-122.4194, lat=37.7749,
base_level=0,
height_scale=100,
resolution=1009, # MUST match landscape resolution
format="png"
)
# Get a satellite or map reference image
terrain_data(
action="get_map_image",
lng=-122.4194, lat=37.7749,
style="satellite-v9" # satellite-v9, outdoors-v11, streets-v11, light-v10, dark-v10
)
# List available map image styles
terrain_data(action="list_styles")
# Fetch water features (rivers, lakes, ponds) for the same area
terrain_data(
action="get_water_features",
lng=-122.4194, lat=37.7749,
map_size=17.28
)
Parameters (generate_heightmap):
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| action | string | (required) | generate_heightmap, preview_elevation, get_map_image, list_styles, get_water_features |
| lng | number | — | Longitude of center point |
| lat | number | — | Latitude of center point |
| format | string | png | Output: png, raw, zip |
| resolution | number | 1081 | Output NxN pixels — MUST match landscape resolution |
| map_size | number | 17.28 | Map size in km |
| base_level | number | 0 | Base elevation offset in meters |
| height_scale | number | 100 | Height scale % (1-250) |
| water_depth | number | 40 | Water depth in C:S units |
| blur_passes | number | 10 | Plains smoothing passes |
| sharpen | boolean | true | Apply sharpening |
| save_path | string