Unity MCP Claude Code
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FIGMA_TOKEN | No | Optional Figma API token for asset creation tools. |
Capabilities
Features and capabilities supported by this server
| 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_environment_statusA | Vollständiger Umgebungsstatus: Hub-Pfad/-Version, installierte Editoren, neue unity-CLI, Standard-Projektordner, erlaubte Roots, ob Hub/Editor laufen. Idealer Einstiegspunkt. |
| check_hub_runningA | Prüft, ob Unity Hub aktuell läuft (Prozessliste). |
| list_unity_processesA | Listet alle laufenden Unity-Prozesse (Hub und Editoren getrennt). |
| launch_hubA | Startet die Unity-Hub-GUI (losgelöster Prozess). |
| close_hubA | Beendet alle Unity-Hub-Prozesse (NICHT die Editoren). Erfordert confirm=true. |
| stop_editorA | Beendet laufende Unity-Editor-Prozesse (Unity.exe), ohne den Hub. Erfordert confirm=true. |
| list_installed_editorsA | Listet installierte Unity-Editoren (Hub-CLI 'editors --installed'). |
| list_available_releasesA | Listet von Unity beworbene installierbare Releases (Hub-CLI, Online — kann dauern). |
| resolve_editor_changesetA | Löst eine Editor-Version (z.B. '6000.4.10f1') über die Unity-Release-API zu Changeset + unityhub://-Deep-Link auf. Nötig für install_editor bei nicht-gelisteten Versionen. |
| get_editor_install_pathA | Gibt das aktuelle Editor-Installationsverzeichnis zurück (Hub-CLI 'install-path --get'). |
| set_editor_install_pathA | Setzt das Editor-Installationsverzeichnis (Hub-CLI 'install-path --set'). confirm=true nötig. |
| install_editorA | Installiert einen Unity-Editor (+ optionale Module) als Hintergrund-Job. changeset wird für nicht-gelistete Versionen benötigt (siehe resolve_editor_changeset). Module z.B.: android, ios, webgl, windows-il2cpp, mac-mono, linux-il2cpp, documentation. Fortschritt via get_job_status/read_job_output verfolgen. confirm=true nötig (großer Download). |
| install_editor_modulesA | Fügt Module zu einem bereits installierten Editor hinzu (Hub-CLI 'install-modules'). Läuft als Hintergrund-Job. confirm=true nötig. |
| add_existing_editorB | Bindet einen außerhalb des Hubs installierten Editor ein (Hub-CLI 'editors --add'). confirm=true. |
| install_editor_via_deeplinkA | Startet die Editor-Installation über einen unityhub://-Deep-Link in der Hub-GUI (Alternative zur headless-Installation; nützlich wenn GUI-Bestätigung gewünscht). |
| list_recent_projectsA | Listet die im Hub bekannten Projekte (aus projects-v1.json), nach Datum sortiert. |
| get_project_infoA | Liest Projekt-Metadaten aus Dateien (schnell, ohne Editor-Start): Unity-Version, Changeset, productName/companyName/bundleVersion, Paketanzahl, Build-Szenen, Assets-Größe. |
| get_project_info_liveB | Startet den Editor headless und liest Live-Infos (aktives BuildTarget, Scripting-Defines, aktive Szenen) via injiziertem C#-Skript. Läuft als Job; Ergebnis aus result_file lesen. |
| create_projectA | Erstellt ein neues, leeres Unity-Projekt (Unity.exe -createProject) als Job. version optional (sonst neuester installierter Editor). confirm=true nötig. |
| open_projectA | Öffnet ein Projekt in der Editor-GUI. Nutzt die neue unity-CLI ('unity open') falls vorhanden, sonst 'Unity.exe -projectPath' (Editor-Version aus ProjectVersion.txt). |
| register_project_in_hubA | Trägt ein vorhandenes Projekt in die Hub-Recents ein (schreibt projects-v1.json). Hub sollte geschlossen sein (sonst überschreibt er die Änderung). confirm=true nötig. |
| unregister_project_from_hubA | Entfernt ein Projekt aus der Hub-Liste (löscht NICHT die Projektdateien). confirm=true nötig. |
| set_project_favoriteB | Setzt/entfernt den Favoriten-Stern eines Projekts in der Hub-Liste. confirm=true nötig. |
| build_playerB | Baut einen Player (BuildPipeline.BuildPlayer via injiziertem C#) als Hintergrund-Job. build_target z.B.: win64, StandaloneWindows64, android, webgl, ios, linux64, osxuniversal. scenes optional (sonst aktivierte Build-Settings-Szenen). Ergebnis nach Jobende aus result_file lesen (get_build_result). confirm=true nötig. |
| run_testsA | Führt Unity-Tests via Test Framework aus (Job). platform: EditMode | PlayMode | StandaloneWindows64. Schreibt NUnit-XML; danach get_test_results aufrufen. |
| get_test_resultsA | Parst eine NUnit3-Ergebnis-XML (von run_tests) und liefert Pass/Fail-Zahlen + Fehlerdetails. |
| check_compileA | Kompiliert alle Skripte des Projekts headless (öffnet+quittiert den Editor), als Job. Danach get_compile_result(log_file) für strukturierte Compiler-Fehler/Warnungen — funktioniert auch, wenn der Code NICHT kompiliert. Ideal für Schreiben→Prüfen→Auto-Fix-Schleifen. |
| get_compile_resultA | Parst Compiler-Fehler/Warnungen (Datei/Zeile/Spalte/CS-Code/Meldung) aus einem Editor-Log (von check_compile, build_scene, build_player …). |
| import_unitypackageB | Importiert ein .unitypackage headless in ein Projekt (Unity.exe -importPackage), als Job. confirm=true nötig (verändert Projekt-Assets). |
| export_unitypackageA | Exportiert Assets als .unitypackage (AssetDatabase.ExportPackage via C#), als Job. asset_paths sind projektrelativ (z.B. ['Assets/Prefabs']). confirm=true nötig. |
| run_editor_methodA | Führt eine BELIEBIGE statische Editor-Methode headless aus (-executeMethod), als Job. Mächtig und potenziell riskant (führt projektinternen Code aus) — confirm=true nötig. method als 'Namespace.Klasse.Methode'. extra_args werden unverändert angehängt. |
| remove_automation_scriptC | Entfernt das vom Server injizierte C#-Automationsskript (Assets/Editor/MCP) wieder. confirm=true. |
| list_project_packagesA | Listet die direkten Paket-Abhängigkeiten eines Projekts aus Packages/manifest.json. |
| add_project_packageA | Fügt ein Paket zu Packages/manifest.json hinzu/ändert die Version (Backup wird erstellt). version kann SemVer, git-URL oder 'file:'-Pfad sein. confirm=true nötig. |
| remove_project_packageA | Entfernt ein Paket aus Packages/manifest.json (Backup wird erstellt). confirm=true nötig. |
| get_hub_settingsA | Liest die Unity-Hub-Einstellungen (user-settings.json): Theme, Tray, Download-Limit, Channel … |
| update_hub_settingA | Setzt einen Hub-Einstellungswert (verschachtelt per '.', z.B. 'download.maxConcurrentDownloads' oder 'themeSource'). Backup wird erstellt; wirksam nach Hub-Neustart. confirm=true nötig. |
| get_default_project_dirA | Gibt den Standardordner für neue Projekte zurück (projectDir.json). |
| set_default_project_dirB | Setzt den Standardordner für neue Projekte (projectDir.json). confirm=true nötig. |
| read_editor_logB | Liest die Unity-Editor-Logdatei (Editor.log bzw. Editor-prev.log), letzte tail_lines Zeilen. |
| read_hub_logsA | Liest die Unity-Hub-Logs. which: 'info' (info-log.json) oder 'install' (install-log.json). |
| detect_errors_in_logA | Scannt ein Log auf Fehler/Exceptions. source: 'editor' | 'hub' | 'job' (mit job_id). |
| get_job_statusB | Status eines Hintergrund-Jobs (Install/Build/Test/Import/Export/Methode). |
| read_job_outputC | Liest die Ausgabe eines Jobs. stream: 'stdout' | 'stderr'. |
| list_jobsB | Listet die letzten Hintergrund-Jobs mit Status. |
| stop_jobB | Bricht einen laufenden Job ab. confirm=true nötig. |
| get_build_resultC | Liest das von build/export/info erzeugte Ergebnis-JSON (result_file aus dem jeweiligen Tool). |
| get_license_statusB | Best-effort Lizenzstatus über den Unity Licensing Client (read-only). |
| create_manual_activation_fileB | Erzeugt eine manuelle Aktivierungsdatei (.alf) zum Hochladen auf license.unity3d.com. confirm=true. |
| apply_license_fileB | Wendet eine heruntergeladene .ulf-Lizenzdatei an (manuelle Aktivierung, Schritt 3). confirm=true. |
| open_create_project_uiA | Öffnet die 'Neues Projekt'-Oberfläche im Hub (Deep-Link). |
| open_package_install_uiA | Öffnet im aktiven Editor den Package-Manager-Install für ein Paket (Deep-Link), z.B. 'com.unity.cinemachine@2.9.7'. |
| open_deep_linkC | Öffnet einen beliebigen unityhub://-Deep-Link. |
| screenshot_desktopA | Erstellt einen Desktop-Screenshot (PNG) zur Sichtprüfung des aktuellen GUI-Zustands. |
| list_backupsB | Listet die vom Server erstellten Datei-Backups (neueste zuerst). |
| restore_backupA | Stellt eine gesicherte Datei an target_path wieder her (die aktuelle Datei wird vorher erneut gesichert). confirm=true nötig. |
| write_scriptA | Schreibt ein C#-Skript (MonoBehaviour etc.) ins Projekt, z.B. rel_path='Assets/Scripts/PlayerController.cs'. Überschreibt mit Backup. Path-Sandbox aktiv. Kernbaustein für Game-Logik; danach via build_scene als Komponente per Klassenname anhängbar. |
| write_text_assetC | Schreibt eine beliebige Textdatei ins Projekt (JSON, .asmdef, .shader, .txt, .csv …). Path-Sandbox + Backup. |
| read_project_fileB | Liest eine Projektdatei als Text (z.B. ein Skript oder eine Config). |
| import_external_assetA | Kopiert eine externe Datei (Modell/Textur/Audio …) nach dest_rel (unter Assets/) ins Projekt. Unity importiert sie beim nächsten Editor-Lauf; Feintuning danach via configure_asset_import. |
| list_project_assetsC | Listet Asset-Dateien eines Projekts (rekursiv, ohne .meta). pattern z.B. '*.cs'. |
| create_project_folderB | Erstellt einen Ordner im Projekt (z.B. 'Assets/Scripts'). Path-Sandbox aktiv. |
| delete_project_assetA | Löscht eine Asset-Datei (+ .meta) nach Backup. confirm=true nötig. |
| build_sceneA | Baut aus einer JSON-Spezifikation eine echte .unity-Szene (via injiziertes C#), als Job. spec = { "scenePath": "Assets/Scenes/Game.unity", "addToBuildSettings": true, "gameObjects": [ {"name":"Main Camera","camera":true,"position":[0,1,-10]}, {"name":"Sun","light":{"type":"Directional","intensity":1.0},"rotation":[50,-30,0]}, {"name":"Floor","primitive":"Plane","scale":[5,1,5]}, {"name":"Player","primitive":"Capsule","position":[0,1,0],"tag":"Player", "components":["Rigidbody","PlayerController"]} ] } components dürfen eingebaute Typen (Rigidbody, BoxCollider …) ODER eigene MonoBehaviour- Klassennamen sein (vorher per write_script anlegen). PROFI-Features pro gameObject (optional): "material": {"color":[r,g,b],"metallic":0.0,"smoothness":0.6,"emission":[r,g,b],"emissionIntensity":2.0, "mainTexture":"Assets/.../baseColor.png","normalMap":"Assets/.../normal.png", "occlusionMap":"Assets/.../ao.png","metallicGlossMap":"Assets/.../mask.png","normalScale":1.0} (URP-aware, wird als .mat gespeichert+zugewiesen; PBR-Maps automatisch korrekt importiert: normalMap→NormalMap+_NORMALMAP, ao/mask→linear. Maps z.B. via download_pbr_material / download_polyhaven_texture holen = Premium-Look) "physicMaterial": {"bounciness":0.8,"dynamicFriction":0.3,"staticFriction":0.4} "props": Komponenten-Properties setzen (Werte/Referenzen/Assets/Enums/Vektoren/Farben), z.B. {"component":"Rigidbody","name":"mass","value":2.0} {"component":"Rigidbody","name":"linearDamping","value":0.5} # Unity-6-Name (alt: drag) {"component":"Rigidbody","name":"constraints","enum":"FreezeRotationX|FreezeRotationZ"} {"component":"CameraFollow","name":"target","ref":"Player"} # Referenz auf Scene-Objekt {"component":"AudioSource","name":"clip","asset":"Assets/Audio/x.wav"} {"component":"Light","name":"color","color":[1,0.9,0.7]} "prefab": "Assets/Prefabs/X.prefab" # statt primitive eine Prefab-Instanz erzeugen "isStatic": true, "tag":"Player", "layer":8, "parent":"OtherObjectName" Top-Level optional: "environment": {"ambientMode":"Trilight","ambient":[r,g,b],"skyboxMaterial":"Assets/...","fog":true,"fogColor":[..],"fogDensity":0.01} "postProcessing": {"bloom":{"intensity":1.2,"threshold":0.9,"scatter":0.7}, "colorAdjustments":{"postExposure":0.2,"contrast":10,"saturation":15}, "vignette":{"intensity":0.3},"tonemapping":{"mode":"ACES"}, "antialiasing":"SubpixelMorphologicalAntiAliasing"} (URP; Bloom braucht emissive/HDR-Quellen) "saveAsPrefabs": [{"object":"Enemy","path":"Assets/Prefabs/Enemy.prefab"}] Ergebnis via get_build_result(result_file). |
| configure_projectA | Setzt Projekt-Einstellungen (Job): PlayerSettings (productName/companyName/bundleVersion/ Auflösung/fullScreenMode/runInBackground/colorSpace), Quality-Level, sowie eigene Tags und Layer. config = { "productName":"My Game","companyName":"My Studio","bundleVersion":"1.0.0", "defaultWidth":1920,"defaultHeight":1080,"fullScreenMode":"FullScreenWindow", "runInBackground":true,"colorSpace":"Linear","qualityLevel":5, "tags":["Player","Enemy"],"layers":{"8":"Ground","9":"Interactable"} } Layer-Indizes müssen 8..31 sein (0..7 sind reserviert). |
| capture_scene_renderB | Rendert die Kamera einer Szene headless in eine PNG (Job) — für visuelle Prüfung:
Claude kann die PNG anschließend per Bild-Werkzeug ansehen und Shader-/Clipping-/Layout-Fehler
erkennen. Läuft bewusst OHNE -nographics (mit -force-d3d11), sonst schwarzes Bild.
Nach Jobende |
| analyze_scene_performanceA | Statische Performance-Analyse einer Szene (Job): Dreiecke/Vertices, Mesh-/Renderer-Anzahl, eindeutige Materialien (Draw-Call-Proxy), Lichter/Echtzeitlichter. Ergebnis via get_build_result(result_file) — liefert Budget-Daten zum Optimieren ohne Play-Modus. |
| profile_playA | Laufzeit-Profiling SCHRITT 1 (Job): baut einen Development-Player der Szene (inkl. Profiling-
Probe). Echte Draw-Call-/Frame-Zeit-Werte gibt es nur im laufenden Player (Headless-Editor liefert
0 Render-Zähler). Liefert |
| run_profiled_playerA | Laufzeit-Profiling SCHRITT 2 (Job): startet den von profile_play gebauten Player im Fenster (mit GPU), misst N Frames (Frame-Zeit/FPS/Draw Calls/Speicher/GC) und schreibt das Perf-JSON; der Player beendet sich selbst. Danach get_profile_result(perf_file). |
| get_profile_resultB | Liest das Profiling-Ergebnis: avgFrameMs, avgFps, maxMemMB, avgGcAllocBytes, maxDrawCalls/ maxSetPass/maxTriangles, renderCountersValid. |
| configure_asset_importB | Setzt Import-Einstellungen eines Assets (Job) und reimportiert. asset_path ist projektrelativ (z.B. 'Assets/Textures/hero.png'). settings_props = Liste von {name, value} oder {name, enum}: Texturen: maxTextureSize(int), textureCompression(enum Uncompressed/Compressed/CompressedHQ/LQ), crunchedCompression(bool), mipmapEnabled(bool), isReadable(bool), textureType(enum) Modelle: globalScale(float), meshCompression(enum Off/Low/Medium/High), materialImportMode(enum), animationType(enum), optimizeMeshPolygons(bool), optimizeMeshVertices(bool) Audio: forceToMono(bool) |
| create_animation_clipA | Erzeugt eine AnimationClip (.anim, Job) aus Keyframe-Kurven — prozedurale Animation ohne externe Assets (z.B. Idle-Bob, Pulsieren, Rotation). spec = {"path":"Assets/Anims/Bob.anim","frameRate":30,"loop":true, "curves":[{"relativePath":"Visual","type":"Transform","property":"localPosition.y", "keys":[{"t":0,"v":0},{"t":0.5,"v":0.25},{"t":1,"v":0}]}]} |
| build_animator_controllerA | Baut einen Animator-Controller (.controller, Job) mit States, Parametern und Transitions — macht Charaktere animiert (Idle/Run/Jump). Clips referenzieren via '.anim'-Pfad oder 'Pfad.fbx::ClipName'. Danach den Controller per build_scene an einen Animator hängen: components:["Animator"], props:[{"component":"Animator","name":"runtimeAnimatorController", "asset":"Assets/Animators/Player.controller"}]. spec = {"path":"...","parameters":[{"name":"Speed","type":"Float"}],"defaultState":"Idle", "states":[{"name":"Idle","clip":"..."},{"name":"Run","clip":"..."}], "transitions":[{"from":"Idle","to":"Run","conditions":[{"param":"Speed","mode":"Greater","threshold":0.1}]}]} Parameter-Typen: Float/Int/Bool/Trigger. Condition-Modi: Greater/Less/If/IfNot/Equals/NotEqual. |
| create_spriteB | Erzeugt einen prozeduralen Platzhalter-Sprite (PNG → als Sprite importiert, Job) für 2D-Spiele ohne externe Art. shape: 'square' | 'circle'. Danach via build_scene an einen 'SpriteRenderer' hängen (components:['SpriteRenderer'], props:[{component:'SpriteRenderer',name:'sprite',asset:path}]). 2D-Kamera: props {component:'Camera',name:'orthographic',value:true} + 'orthographicSize'. 2D-Physik: Komponenten 'Rigidbody2D' / 'BoxCollider2D' / 'CircleCollider2D'. |
| list_animation_clipsB | Listet die AnimationClip-Namen in einem importierten Asset (FBX/.anim, Job) — z.B. um die Clip-Namen eines Mixamo-/Asset-Pack-Charakters für build_animator_controller zu erfahren. Ergebnis via get_build_result(result_file) -> result.clips. |
| gui_list_windowsA | Listet sichtbare Top-Level-Fenster (Titel, Klasse, Handle, Position). Filter z.B. 'Unity'. |
| gui_inspect_windowA | Listet den UIA-Steuerelementbaum eines Fensters (Buttons/Texte/IDs) — ideal für den Hub. |
| gui_focus_windowB | Bringt ein Fenster in den Vordergrund (Teil-Titel genügt). |
| gui_clickA | Klickt an Bildschirmkoordinaten (button: left|right|middle). Für den selbst gezeichneten Editor der Fallback; vorher screenshot_desktop zur Orientierung nutzen. |
| gui_type_textC | Tippt literalen Text in das fokussierte Fenster. |
| gui_send_keysA | Sendet rohe Tastenfolgen (pywinauto-Syntax), z.B. '^s' = Strg+S, '{ENTER}', '%{F4}'. |
| blender_statusA | Prüft, ob Blender (headless) verfügbar ist (Version, Python, glTF/FBX-Export). |
| blender_run_pythonA | Führt ein bpy-Python-Skript headless in Blender aus → eigene 3D-Assets erzeugen (Mesh/Material/UV/Bake/Export GLB+FBX/Render) für Unity. Das mächtige Primitiv der 3D-Erstellung. Im Skript verfügbar: |
| blender_render_previewA | Rendert eine Vorschau-PNG eines 3D-Modells (GLB/FBX/OBJ) headless in Blender (CYCLES) — damit Claude generierte/importierte 3D-Assets per Bild prüfen kann. |
| blender_bake_pbrA | Erzeugt prozedural einen tileable PBR-Textursatz (baseColor/normal/roughness/ao) via Blender-CYCLES-Bake — eigene Premium-Texturen ohne Download, für Dinge, die keine CC0-Bibliothek hat. preset: 'brick' | 'rock' | 'wood' | 'metal'. resolution z.B. 512/1024/2048. Danach in Unity via build_scene material (mainTexture=baseColor, normalMap=normal, occlusionMap=ao) verbaubar. |
| pack_sprite_atlasA | Packt alle PNGs eines Ordners (rekursiv) in einen kohärenten Sprite-Atlas (atlas.png + atlas.json/JsonHash, POT, getrimmt) via free-tex-packer-core. Für 2D-Kohärenz
|
| figma_export_imagesA | Exportiert Figma-Frames/Components als PNG/SVG (für Game-UI) und lädt sie nach output_dir. node_ids aus der Figma-URL (?node-id=…); '-' wird zu ':' konvertiert. Token via Parameter oder FIGMA_TOKEN. ⚠️ Free-Tier ~6 Calls/Monat → alle Nodes in EINEM Aufruf batchen. |
| figma_get_outlineA | Holt die obere Struktur einer Figma-Datei (Frame-/Node-IDs + Namen finden), sparsam (depth). |
| krita_exportA | Konvertiert eine .kra/.psd/.tiff … in PNG/JPG (Endung von out_path) via Krita. |
| krita_openB | Öffnet Krita (GUI) zum Hand-Polieren von 2D-Art; danach als .kra speichern → krita_export. |
| search_pbr_materialsA | Sucht hochwertige CC0-PBR-Materialien auf ambientCG (z.B. 'brick', 'wood', 'metal', 'rock', 'fabric'). Liefert Asset-IDs für download_pbr_material. |
| download_pbr_materialB | Lädt ein CC0-PBR-Set von ambientCG (gescannt, kostenlos) und entpackt die Maps (baseColor/normal/roughness/ao/height/metallic). asset_id z.B. 'Bricks075A'; resolution z.B. '1K-PNG','2K-PNG','4K-PNG'. Danach in Unity (build_scene material mainTexture = baseColor, NormalMap importieren) oder Blender verbauen. Premium-Qualität ohne eigene Erstellung. |
| search_polyhaven_texturesA | Sucht CC0-Texturen auf Poly Haven (zweite Premium-Quelle, oft schöner für Natur/Stein/Holz; Tags/Kategorien). Liefert Asset-Slugs für download_polyhaven_texture. |
| download_polyhaven_textureB | Lädt ein CC0-PBR-Set von Poly Haven und klassifiziert die Maps (baseColor/normal(nor_gl)/ roughness/ao/height/metallic/arm). asset_id z.B. 'brick_wall_02'; resolution '1k'/'2k'/'4k'/'8k'; fmt 'png'/'jpg'. Danach in Unity via build_scene material (mainTexture=baseColor, normalMap=normal, occlusionMap=ao) verbaubar — volle PBR-Qualität ohne eigene Erstellung. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MauricePutinas/Unity-MCP-Claude-Code'
If you have feedback or need assistance with the MCP directory API, please join our Discord server