{"id":45593649,"url":"https://github.com/veyronsakai/unicortex","last_synced_at":"2026-04-20T05:00:56.207Z","repository":{"id":338578516,"uuid":"1158335300","full_name":"VeyronSakai/UniCortex","owner":"VeyronSakai","description":"A toolkit for controlling Unity Editor externally via REST API, MCP (Model Context Protocol), and CLI.","archived":false,"fork":false,"pushed_at":"2026-04-16T15:00:49.000Z","size":1149,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T16:32:44.054Z","etag":null,"topics":["cli","mcp-server","unity"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VeyronSakai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-15T07:22:40.000Z","updated_at":"2026-04-13T14:49:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/VeyronSakai/UniCortex","commit_stats":null,"previous_names":["veyronsakai/unityeditorbridge","veyronsakai/unicortex"],"tags_count":31,"template":false,"template_full_name":"VeyronSakai/UnityPackageTemplate","purl":"pkg:github/VeyronSakai/UniCortex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VeyronSakai%2FUniCortex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VeyronSakai%2FUniCortex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VeyronSakai%2FUniCortex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VeyronSakai%2FUniCortex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VeyronSakai","download_url":"https://codeload.github.com/VeyronSakai/UniCortex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VeyronSakai%2FUniCortex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32033717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","mcp-server","unity"],"created_at":"2026-02-23T13:18:52.884Z","updated_at":"2026-04-20T05:00:56.200Z","avatar_url":"https://github.com/VeyronSakai.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UniCortex\n\n\u003e [!CAUTION]\n\u003e This project is still under active development. The API and command structure may change without notice.\n\nA toolkit for controlling Unity Editor externally via REST API, MCP (Model Context Protocol), and CLI.\n\nUniCortex can be used in two ways:\n\n1. As an **MCP server** for AI agents such as Claude Code or Codex CLI\n2. As a **CLI tool** for direct terminal-based control\n\nIn both cases, you must install the UniCortex Unity package into the target Unity project first.\n\n## Requirements\n\n- Unity 2022.3 or later\n- .NET 10 SDK (for MCP server and CLI)\n\n## Installation\n\nAdd via Unity Package Manager using a Git URL:\n\n1. Open Package Manager\n2. Click the `+` button\n3. Select \"Add package from git URL\"\n4. Enter the following URL:\n\n```\nhttps://github.com/VeyronSakai/UniCortex.git\n```\n\n## Use UniCortex as an MCP Server\n\nUse this mode when you want an MCP client to call Unity operations as tools. The UniCortex Unity package must be installed in the target Unity project.\n\n### MCP Server Setup\n\nAdd the following MCP server configuration to your MCP client's settings file (e.g., `.mcp.json`, `claude_desktop_config.json`, etc.). Refer to your client's documentation for the exact configuration location.\n\n```json\n{\n  \"mcpServers\": {\n    \"Unity\": {\n      \"type\": \"stdio\",\n      \"command\": \"bash\",\n      \"args\": [\"-c\", \"dotnet run --project ${UNICORTEX_PROJECT_PATH}/Library/PackageCache/com.veyron-sakai.uni-cortex@*/Tools~/UniCortex.Mcp/\"],\n      \"env\": {\n        \"UNICORTEX_PROJECT_PATH\": \"/path/to/your/unity/project\"\n      }\n    }\n  }\n}\n```\n\nReplace `/path/to/your/unity/project` with the absolute path of your Unity project. After saving the configuration, restart the client to apply the changes.\n\nThe MCP server reads the port number from `Library/UniCortex/config.json` (written automatically when Unity Editor starts) and connects to the HTTP server.\n\nNo pre-build or tool installation is required. The MCP server is built and started automatically via `dotnet run`.\n\nAlternatively, you can specify the URL directly via the `UNICORTEX_URL` environment variable (takes priority over `UNICORTEX_PROJECT_PATH`):\n\n```json\n{\n  \"mcpServers\": {\n    \"Unity\": {\n      \"type\": \"stdio\",\n      \"command\": \"bash\",\n      \"args\": [\"-c\", \"dotnet run --project ${UNICORTEX_PROJECT_PATH}/Library/PackageCache/com.veyron-sakai.uni-cortex@*/Tools~/UniCortex.Mcp/\"],\n      \"env\": {\n        \"UNICORTEX_PROJECT_PATH\": \"/path/to/your/unity/project\",\n        \"UNICORTEX_URL\": \"http://localhost:12345\"\n      }\n    }\n  }\n}\n```\n\n### Available MCP Tools\n\nThe MCP server exposes the following built-in tools.\n\n#### Editor Control\n\n| Tool | Description |\n|------|-------------|\n| `ping_editor` | Check connectivity with the Unity Editor |\n| `enter_play_mode` | Start Play Mode |\n| `exit_play_mode` | Stop Play Mode |\n| `get_editor_status` | Get the current state of the Unity Editor (play mode, paused) |\n| `pause_editor` | Pause the Unity Editor. Use with `step_editor` for frame-by-frame control |\n| `unpause_editor` | Unpause the Unity Editor |\n| `step_editor` | Advance the Unity Editor by one frame while paused |\n| `reload_domain` | Request script recompilation (domain reload) |\n| `undo` | Undo the last operation |\n| `redo` | Redo an undone operation |\n| `save` | Save the currently active stage (Scene, Prefab, Timeline, etc.) |\n#### Scene\n\n| Tool | Description |\n|------|-------------|\n| `create_scene` | Create a new empty scene and save it at the specified asset path |\n| `open_scene` | Open a scene by path |\n| `get_hierarchy` | Get the GameObject hierarchy tree of the current scene or Prefab |\n\n#### GameObject\n\n| Tool | Description |\n|------|-------------|\n| `find_game_objects` | Search GameObjects by name, tag, component type, instanceId, layer, path, or state |\n| `create_game_object` | Create a new empty GameObject |\n| `delete_game_object` | Delete a GameObject (supports Undo) |\n| `modify_game_object` | Modify name, active state, tag, layer, or parent |\n\n#### Component\n\n| Tool | Description |\n|------|-------------|\n| `add_component` | Add a component to a GameObject |\n| `remove_component` | Remove a component from a GameObject |\n| `get_component_properties` | Get serialized properties of a component |\n| `set_component_property` | Set a serialized property on a component |\n\n#### Prefab\n\n| Tool | Description |\n|------|-------------|\n| `create_prefab` | Save a scene GameObject as a Prefab asset |\n| `instantiate_prefab` | Instantiate a Prefab into the scene |\n| `open_prefab` | Open a Prefab asset in Prefab Mode for editing |\n| `close_prefab` | Close Prefab Mode and return to the main stage |\n\n#### Asset\n\n| Tool | Description |\n|------|-------------|\n| `refresh_asset_database` | Refresh the Unity Asset Database |\n\n#### Project Window\n\n| Tool | Description |\n|------|-------------|\n| `select_project_window_asset` | Select an asset in the Project Window, focus the window, and ping it |\n\n#### Console\n\n| Tool | Description |\n|------|-------------|\n| `get_console_logs` | Get console log entries from the Unity Editor |\n| `clear_console_logs` | Clear all console logs |\n\n#### Test\n\n| Tool | Description |\n|------|-------------|\n| `run_tests` | Run Unity Test Runner tests and return results |\n\n#### Menu Item\n\n| Tool | Description |\n|------|-------------|\n| `execute_menu_item` | Execute a Unity Editor menu item by path |\n\n#### Screenshot\n\n| Tool | Description |\n|------|-------------|\n| `capture_screenshot` | Capture a screenshot of the current Unity rendering output (Play Mode only) |\n\n#### View\n\n| Tool | Description |\n|------|-------------|\n| `focus_scene_view` | Switch focus to the Scene View window |\n| `focus_game_view` | Switch focus to the Game View window |\n| `get_game_view_size` | Get the current Game View size (width and height in pixels) |\n| `get_game_view_size_list` | Get the list of available Game View sizes (built-in and custom) |\n| `set_game_view_size` | Set the Game View resolution by index from the size list |\n\n#### Recorder\n\n| Tool | Description |\n|------|-------------|\n| `get_all_recorders` | Get the list of all configured recorders and their settings (requires com.unity.recorder) |\n| `add_movie_recorder` | Add a Movie recorder to the list with name, output path, encoder, quality, audio capture (requires com.unity.recorder) |\n| `remove_movie_recorder` | Remove a Movie recorder from the list by index (requires com.unity.recorder) |\n| `start_movie_recorder` | Start recording with the specified Movie recorder (Play Mode only, requires com.unity.recorder) |\n| `stop_movie_recorder` | Stop recording and save the video file (requires com.unity.recorder) |\n\n#### Input\n\n| Tool | Description |\n|------|-------------|\n| `send_key_event` | Send a keyboard event via Input System in Play Mode (requires com.unity.inputsystem) |\n| `send_mouse_event` | Send a mouse event via Input System in Play Mode (requires com.unity.inputsystem). Supports press, release, and move for drag simulation |\n\n#### Timeline\n\n| Tool | Description |\n|------|-------------|\n| `create_timeline` | Create a new TimelineAsset (.playable file) at the specified asset path (requires com.unity.timeline) |\n| `add_timeline_track` | Add a track to a TimelineAsset (requires com.unity.timeline) |\n| `remove_timeline_track` | Remove a track from a TimelineAsset by index (requires com.unity.timeline) |\n| `bind_timeline_track` | Set the binding of a Timeline track on a PlayableDirector (requires com.unity.timeline) |\n| `add_timeline_clip` | Add a default clip to a Timeline track (requires com.unity.timeline) |\n| `remove_timeline_clip` | Remove a clip from a Timeline track by index (requires com.unity.timeline) |\n| `play_timeline` | Start playback of a Timeline on a PlayableDirector (requires com.unity.timeline) |\n| `stop_timeline` | Stop playback of a Timeline on a PlayableDirector and reset to the beginning (requires com.unity.timeline) |\n\n#### Extensions\n\nUser-defined extensions in your Unity project are automatically discovered and exposed alongside the built-in tools. See [Extension](#extension) for details.\n\n## Use UniCortex as a CLI Tool\n\nUse this mode when you want to control Unity Editor directly from a terminal. As with the MCP server, the UniCortex Unity package must be installed in the target Unity project, and the Unity Editor must be open with the package loaded.\n\n### Connection settings\n\nThe CLI resolves the Unity Editor endpoint in the following order:\n\n1. If `UNICORTEX_URL` is set, the CLI connects directly to that URL.\n2. Otherwise, it uses `UNICORTEX_PROJECT_PATH` to read `Library/UniCortex/config.json`, which is written when the Unity Editor starts.\n3. If neither is set, the CLI exits with an error.\n\n### Choose how to run the CLI\n\nChoose one of the following options depending on how you want to invoke the CLI.\n\nWhichever option you choose, make sure the CLI version matches the UniCortex package version installed in the Unity project. Running via `dotnet run --project` from `Library/PackageCache` naturally uses the same package version.\n\n#### Option 1: Run commands with `dotnet run --project`\n\n```bash\nexport UNICORTEX_PROJECT_PATH=\"/path/to/your/unity/project\"\nexport UNICORTEX_CLI_PROJECT=$(echo \"${UNICORTEX_PROJECT_PATH}\"/Library/PackageCache/com.veyron-sakai.uni-cortex@*/Tools~/UniCortex.Cli)\n\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- editor ping\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- scene hierarchy\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- gameobject find \"t:Camera\"\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- component properties 1234 UnityEngine.Transform\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- test run --test-mode EditMode\n```\n\n#### Option 2: Install as a `dotnet` local tool\n\nInstall `UniCortex.Cli` from NuGet.org as a local tool.\n\n```bash\ndotnet new tool-manifest\ndotnet tool install --local UniCortex.Cli\n\ndotnet tool run unicortex -- editor ping\ndotnet tool run unicortex -- scene hierarchy\n```\n\nIf the tool is already installed, run `dotnet tool update --local UniCortex.Cli` instead.\n\nIf you share the tool manifest with your team, run `dotnet tool restore` before the first `dotnet tool run ...` so the manifest-defined tools are installed locally.\n\n#### Option 3: Install as a `dotnet` global tool\n\nInstall `UniCortex.Cli` globally when you want to invoke `unicortex` directly from your shell.\n\n```bash\ndotnet tool install --global UniCortex.Cli\n\nunicortex editor ping\nunicortex scene hierarchy\n```\n\nIf the tool is already installed, run `dotnet tool update --global UniCortex.Cli` instead.\n\n### Argument and output conventions\n\n- Required parameters are positional arguments, for example `scene open Assets/Scenes/Main.unity`.\n- Optional parameters with defaults become named options, for example `gameobject modify 1234 --name CameraRig --active-self true`.\n- Read/query commands usually print JSON, such as `scene hierarchy`, `gameobject find`, `component properties`, and `recorder all list`.\n- State-changing commands usually print a short status message, such as `editor play`, `scene open`, `component add`, and `timeline track bind`.\n- `screenshot capture` writes a file to the path you pass, and recorder commands create media files in the configured output path.\n\n### Available CLI Commands\n\n#### `editor`\n\n| Command | Description |\n| --- | --- |\n| `editor ping` | Check connectivity with the Unity Editor. |\n| `editor play` | Start Play Mode in the Unity Editor. |\n| `editor stop` | Stop Play Mode in the Unity Editor. |\n| `editor status` | Show the current play/paused state. |\n| `editor pause` | Pause the Unity Editor. |\n| `editor unpause` | Unpause the Unity Editor. |\n| `editor step` | Advance the Unity Editor by one frame while paused. |\n| `editor undo` | Perform Undo. |\n| `editor redo` | Perform Redo. |\n| `editor save` | Save the active stage. |\n| `editor reload-domain` | Request script recompilation. |\n\n#### `scene`\n\n| Command | Description |\n| --- | --- |\n| `scene create` | Create a new empty scene at the specified asset path. |\n| `scene open` | Open a scene by asset path. |\n| `scene hierarchy` | Print the current scene hierarchy as JSON. |\n\n#### `gameobject`\n\n| Command | Description |\n| --- | --- |\n| `gameobject find` | Search GameObjects by Unity Search query. |\n| `gameobject create` | Create a new empty GameObject with the specified name. |\n| `gameobject delete` | Delete a GameObject by `instanceId`. |\n| `gameobject modify` | Rename, reparent, or change active state, tag, or layer. |\n\n#### `component`\n\n| Command | Description |\n| --- | --- |\n| `component add` | Add a component to a GameObject. |\n| `component remove` | Remove a component from a GameObject. |\n| `component properties` | Print serialized component properties as JSON. |\n| `component set-property` | Set a serialized property by path. |\n\n#### `prefab`\n\n| Command | Description |\n| --- | --- |\n| `prefab create` | Save a scene GameObject as a Prefab asset. |\n| `prefab instantiate` | Instantiate a Prefab into the current scene. |\n| `prefab open` | Open a Prefab in Prefab Mode. |\n| `prefab close` | Close Prefab Mode and return to the main stage. |\n\n#### `test`\n\n| Command | Description |\n| --- | --- |\n| `test run` | Run Unity Test Runner tests. Supports filters such as `--test-mode`, `--test-names`, `--group-names`, `--category-names`, and `--assembly-names`. |\n\n#### `console`\n\n| Command | Description |\n| --- | --- |\n| `console logs` | Read Unity Editor console logs. |\n| `console clear` | Clear Unity Editor console logs. |\n\n#### `asset`, `project-window`, `menu`, `screenshot`\n\n| Command | Description |\n| --- | --- |\n| `asset refresh` | Refresh the Unity Asset Database. |\n| `project-window select` | Select and ping an asset in the Project Window. |\n| `menu execute` | Execute a Unity menu item by path. |\n| `screenshot capture` | Capture a PNG screenshot. Play Mode only. |\n\n#### `scene-view`, `game-view`, `game-view size`\n\n| Command | Description |\n| --- | --- |\n| `scene-view focus` | Focus the Scene View window. |\n| `game-view focus` | Focus the Game View window. |\n| `game-view size get` | Show the current Game View size. |\n| `game-view size list` | List available Game View sizes. |\n| `game-view size set` | Set the Game View size by index. |\n\n#### `input`\n\n| Command | Description |\n| --- | --- |\n| `input send-key` | Send an Input System key event. Requires `com.unity.inputsystem`; Play Mode only. |\n| `input send-mouse` | Send an Input System mouse event. Requires `com.unity.inputsystem`; Play Mode only. |\n\n#### `recorder all`, `recorder movie`\n\n| Command | Description |\n| --- | --- |\n| `recorder all list` | List configured recorders. Requires `com.unity.recorder`. |\n| `recorder movie add` | Add a Movie recorder. Requires `com.unity.recorder`. |\n| `recorder movie remove` | Remove a Movie recorder by index. Requires `com.unity.recorder`. |\n| `recorder movie start` | Start movie recording. Play Mode only; requires `com.unity.recorder`. |\n| `recorder movie stop` | Stop movie recording and save the output file. |\n\n#### `timeline`, `timeline track`, `timeline clip`\n\n| Command | Description |\n| --- | --- |\n| `timeline create` | Create a Timeline asset. Requires `com.unity.timeline`. |\n| `timeline play` | Start Timeline playback on a PlayableDirector. Requires `com.unity.timeline`. |\n| `timeline stop` | Stop Timeline playback and reset to the beginning. Requires `com.unity.timeline`. |\n| `timeline track add` | Add a Timeline track. Requires `com.unity.timeline`. |\n| `timeline track remove` | Remove a Timeline track by index. Requires `com.unity.timeline`. |\n| `timeline track bind` | Bind a Timeline track to a target object. Requires `com.unity.timeline`. |\n| `timeline clip add` | Add a clip to a Timeline track. Requires `com.unity.timeline`. |\n| `timeline clip remove` | Remove a clip from a Timeline track. Requires `com.unity.timeline`. |\n\n#### `extension`\n\n| Command | Description |\n| --- | --- |\n| `extension list` | List registered extensions from the Unity project. |\n| `extension execute` | Execute an extension by name, optionally passing JSON through `--arguments`. |\n\n### Representative workflows\n\n```bash\n# Find cameras and inspect a component\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- gameobject find \"t:Camera\"\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- component properties 1234 UnityEngine.Transform\n\n# Rename and reparent a GameObject\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- gameobject modify 1234 --name CameraRig --parent-instance-id 5678\n\n# Set a serialized property\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- component set-property 1234 UnityEngine.Transform m_LocalPosition.x 1.5\n\n# Capture a screenshot\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- screenshot capture ./Artifacts/gameview.png\n\n# Discover and run a custom extension\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- extension list\ndotnet run --project \"$UNICORTEX_CLI_PROJECT\" -- extension execute count_gameobjects --arguments '{\"nameFilter\":\"Camera\"}'\n```\n\n## Extension\n\nYou can define extensions in your Unity project by creating Editor-only C# classes that inherit from `ExtensionHandler`. They are automatically discovered via `TypeCache` and exposed as MCP tools and CLI commands.\n\n```csharp\n#if UNITY_EDITOR\nusing UniCortex.Editor.Handlers.Extension;\nusing UnityEngine;\n\npublic class CountGameObjects : ExtensionHandler\n{\n    public override string Name =\u003e \"count_gameobjects\";\n    public override string Description =\u003e \"Count GameObjects in the current scene.\";\n    public override bool ReadOnly =\u003e true;\n\n    public override ExtensionSchema InputSchema =\u003e new ExtensionSchema(\n        new ExtensionProperty(\"nameFilter\", ExtensionPropertyType.String,\n            \"Only count GameObjects whose name contains this string.\")\n    );\n\n    public override string Execute(string argumentsJson)\n    {\n        // Runs on the Unity main thread — safe to call Unity APIs\n        var filter = \"\";\n        if (!string.IsNullOrEmpty(argumentsJson))\n        {\n            var args = JsonUtility.FromJson\u003cArgs\u003e(argumentsJson);\n            if (!string.IsNullOrEmpty(args.nameFilter))\n                filter = args.nameFilter;\n        }\n\n        var allObjects = Object.FindObjectsByType\u003cGameObject\u003e(FindObjectsSortMode.None);\n        var count = 0;\n        foreach (var obj in allObjects)\n        {\n            if (string.IsNullOrEmpty(filter) || obj.name.Contains(filter))\n                count++;\n        }\n\n        return $\"Found {count} GameObject(s).\";\n    }\n\n    [System.Serializable]\n    private class Args\n    {\n        public string nameFilter;\n    }\n}\n#endif\n```\n\n### API Reference\n\n| Class | Description |\n|-------|-------------|\n| `ExtensionHandler` | Abstract base class. Override `Name`, `Description`, `InputSchema`, and `Execute()` |\n| `ExtensionSchema` | Defines the input parameter schema via `ExtensionProperty` array |\n| `ExtensionProperty` | Defines a single parameter: name, type, description, and whether it is required |\n| `ExtensionPropertyType` | Parameter types: `String`, `Number`, `Integer`, `Boolean` |\n\n\u003e [!NOTE]\n\u003e After adding or removing extensions, restart the MCP client (e.g., Claude Code) to refresh the tool list.\n\n## Architecture\n\n```mermaid\ngraph LR\n    Agent[\"AI Agent\"]\n    MCP[\"UniCortex.Mcp\u003cbr/\u003e.NET 10\"]\n    CLI[\"UniCortex.Cli\u003cbr/\u003e.NET 10\"]\n    Unity[\"Unity Editor\u003cbr/\u003eHTTP Server\"]\n\n    Agent -- \"MCP / stdio\" --\u003e MCP\n    Agent -- \"CLI\" --\u003e CLI\n    MCP -- \"HTTP\" --\u003e Unity\n    CLI -- \"HTTP\" --\u003e Unity\n```\n\n- **Unity Editor side**: C# `HttpListener` HTTP server embedded in the Editor\n- **Shared Core**: `UniCortex.Core` — service layer and HTTP infrastructure shared by MCP and CLI\n- **MCP Server**: `UniCortex.Mcp` — .NET 10 + [Model Context Protocol C# SDK](https://github.com/modelcontextprotocol/csharp-sdk)\n- **CLI Tool**: `UniCortex.Cli` — .NET 10 + [ConsoleAppFramework](https://github.com/Cysharp/ConsoleAppFramework)\n- **UPM Package**: `com.veyron-sakai.uni-cortex`\n\n## Documentation\n\n- [`Documentations~/SPEC.md`](Documentations~/SPEC.md) — Full API endpoint and MCP tool definitions\n\n## Contributing\n\nWhen developing this package locally:\n\n```bash\n# Build all projects\ndotnet build Tools~/UniCortex.Core/\ndotnet build Tools~/UniCortex.Mcp/\ndotnet build Tools~/UniCortex.Cli/\n\n# Run tests\nUNICORTEX_PROJECT_PATH=$(pwd)/Samples~ dotnet test Tools~/UniCortex.Core.Test/\n\n# Run MCP server\ndotnet run --project Tools~/UniCortex.Mcp/\n\n# Run CLI\ndotnet run --project Tools~/UniCortex.Cli/ -- editor ping\n```\n\n## License\n\nMIT License - [LICENSE.txt](LICENSE.txt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveyronsakai%2Funicortex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveyronsakai%2Funicortex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveyronsakai%2Funicortex/lists"}