upilotCAUTION
upilot Unity Editor automation bridge for AI agents and MCP clients
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
让 Codex、Claude Code、Cursor、OpenCode 等 AI Agent 直接操作 Unity Editor。
UPilot 会在 Unity 中启动本地 MCP 服务,并为常见 Agent 自动写入项目级连接配置。配置完成后,你可以直接让 Agent 查看场景、检查编译错误、读取 Console、修改 GameObject、管理资源、运行测试或构建任务。
Unity:2022.3或更高 正式版使用独立 MCP Server,由 UPilot 下载并管理,无需另外安装运行环境。 默认 MCP 地址:http://127.0.0.1:8011/mcp
教程截图来自 Windows 上的 Unity 2022.3。不同 Unity 版本或编辑器主题下,界面外观可能略有差异,请以实际界面提示为准。
2 分钟上手
安装 Unity 包 → 安装推荐服务并配置 Agent → 验证连接,即可开始使用。首次下载和 Unity 编译的耗时取决于网络与项目规模。
1. 安装 Unity 包
在 Unity 中打开:
Window > Package Manager
点击左上角 +,选择 Add package from git URL...,输入:
https://github.com/codingriver/upilot.git#v0.3.44
点击 Add,等待 Unity 完成包导入和脚本编译。这里以固定发布版本 v0.3.44 为例;安装其他正式版本时,将链接末尾的标签替换为对应的 vMAJOR.MINOR.PATCH。
输入 UPilot Git URL 后点击右侧 Add。
2. 在 Unity 中安装服务并配置 Agent
包导入完成后,Unity 会自动打开 UPilot 设置界面。如果没有自动打开,请选择:
UPilot > 打开 UPilot
然后:
- 在设置向导的 网络端口 步骤使用推荐端口,点击 下一步。
- 在服务设置中选择 由 UPilot 管理服务,点击 安装推荐服务,等待独立服务下载完成后进入下一步。
- 选择你正在使用的 Agent:
Codex、Claude Code、Cursor或OpenCode,支持多选。 - 保持启动选项勾选,点击 写入配置并启动,等待主界面显示 已就绪。
按设置向导安装推荐服务、选择常用 Agent,再写入配置并启动。
UPilot 会自动选择可用端口、写入所选 Agent 的 MCP 配置,并同步所需的 Skill/规则。
3. 重启 Agent 并验证
首次写入配置后,请重新启动 Agent 客户端,或重新加载当前项目窗口,使 MCP 工具列表刷新。
然后对 Agent 说:
请调用 unity_mcp_status,确认 UPilot 已连接,并检查当前 Unity 工程路径。
成功时应满足:
connected: trueserverReady: true- 返回的 Unity 工程路径与当前项目一致
现在可以开始使用 UPilot。
UPilot 能做什么
UPilot 是 AI Agent 与 Unity Editor 之间的桥梁:Agent 通过 MCP 工具读取真实的 Unity 状态,并在授权后执行修改,而不只是生成一段代码供你手动粘贴。
cd31b88679bbOBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add io.github.codingriver.upilot -- npx -y [email protected]
{
"mcpServers": {
"io.github.codingriver.upilot": {
"command": "npx",
"args": [
"-y",
"[email protected]"
]
}
}
}Exposed tools (167)
117 read · 40 write · 10 destructive. Blast radius: 10 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
unity_agent_integrations_check | read | _log_tool_call( |
unity_agent_integrations_sync | write | _log_tool_call( |
unity_agent_rules_check | read | _log_tool_call( |
unity_agent_rules_install | write | _log_tool_call( |
unity_animator_controller_inspect | read | _log_tool_call( |
unity_asset_copy | read | _log_tool_call( |
unity_asset_create_folder | write | _log_tool_call( |
unity_asset_delete | destructive | _log_tool_call( |
unity_asset_find | read | _log_tool_call( |
unity_asset_find_built_in | read | _log_tool_call( |
unity_asset_get_data | read | _log_tool_call( |
unity_asset_get_info | read | _log_tool_call( |
unity_asset_modify_data | write | _log_tool_call( |
unity_asset_move | write | _log_tool_call( |
unity_asset_refresh | read | _log_tool_call( |
unity_asset_reimport | read | _log_tool_call( |
unity_asset_subresources_list | read | _log_tool_call( |
unity_auto_fix_start | write | _log_tool_call( |
unity_auto_fix_status | read | _log_tool_call( |
unity_auto_fix_stop | write | _log_tool_call( |
unity_avatar_mask_inspect | read | _log_tool_call( |
unity_batch_cancel | read | _log_tool_call( |
unity_batch_diagnostics | read | _log_tool_call( |
unity_batch_execute | write | _log_tool_call( |
unity_batch_results | read | _log_tool_call( |
unity_build_cancel | read | _log_tool_call( |
unity_build_start | write | _log_tool_call( |
unity_build_status | read | _log_tool_call( |
unity_build_targets | read | _log_tool_call( |
unity_camera_list | read | _log_tool_call( |
unity_capabilities_get | read | _log_tool_call( |
unity_client_config_diagnose | read | _log_tool_call( |
unity_compile_errors | read | _log_tool_call( |
unity_compile_errors_get | read | _log_tool_call( |
unity_compile_status | read | _log_tool_call( |
unity_component_add | write | _log_tool_call( |
unity_component_get | read | _log_tool_call( |
unity_component_list | read | _log_tool_call( |
unity_component_modify | write | _log_tool_call( |
unity_component_remove | destructive | _log_tool_call( |
unity_console_capture_attach | read | _log_tool_call( |
unity_console_capture_detach | read | _log_tool_call( |
unity_console_capture_list | read | _log_tool_call( |
unity_console_capture_status | read | _log_tool_call( |
unity_console_capture_stop | write | _log_tool_call( |
unity_console_clear | destructive | _log_tool_call( |
unity_console_mark_logs | read | _log_tool_call( |
unity_drag_drop | destructive | _log_tool_call( |
unity_editor_execute_command | write | _log_tool_call( |
unity_editor_redo | read | _log_tool_call( |
unity_editor_state | read | _log_tool_call( |
unity_editor_undo | read | _log_tool_call( |
unity_editor_window_focus | read | _log_tool_call( |
unity_editor_window_open | read | _log_tool_call( |
unity_ensure_ready | read | _log_tool_call( |
unity_gameobject_create | write | _log_tool_call( |
unity_gameobject_delete | destructive | _log_tool_call( |
unity_gameobject_duplicate | read | _log_tool_call( |
unity_gameobject_find | read | _log_tool_call( |
unity_gameobject_modify | write | _log_tool_call( |
unity_gameobject_move | write | _log_tool_call( |
unity_hang_capture | read | _log_tool_call( |
unity_hang_capture_status | read | _log_tool_call( |
unity_hang_status | read | _log_tool_call( |
unity_material_assign | read | _log_tool_call( |
unity_material_create | write | _log_tool_call( |
unity_material_get | read | _log_tool_call( |
unity_material_modify | write | _log_tool_call( |
unity_menu_execute | write | _log_tool_call( |
unity_menu_list | read | _log_tool_call( |
unity_model_importer_inspect | read | _log_tool_call( |
unity_monohook_tracing_configure | read | args = { |
unity_monohook_tracing_events | read | args = { |
unity_monohook_tracing_status | read | _log_tool_call( |
unity_mouse_event | read | _log_tool_call( |
unity_navmesh_sample | read | args = { |
unity_navmesh_status | read | args = { |
unity_navmesh_triangulation_summary | read | _log_tool_call( |
unity_open_editor | read | _log_tool_call( |
unity_operation_cancel | read | _log_tool_call( |
unity_operation_collect_artifacts | read | _log_tool_call( |
unity_operation_get | read | _log_tool_call( |
unity_operation_list | read | _log_tool_call( |
unity_operation_start | write | _log_tool_call( |
unity_operation_status | read | _log_tool_call( |
unity_operation_validate | read | _log_tool_call( |
unity_package_add | write | _log_tool_call( |
unity_package_list | read | _log_tool_call( |
unity_package_remove | destructive | _log_tool_call( |
unity_package_search | read | _log_tool_call( |
unity_playmode_pause | read | _log_tool_call( |
unity_playmode_resume | read | _log_tool_call( |
unity_playmode_start | write | _log_tool_call( |
unity_playmode_stop | write | _log_tool_call( |
unity_prefab_close | read | _log_tool_call( |
unity_prefab_create | write | _log_tool_call( |
unity_prefab_instantiate | read | _log_tool_call( |
unity_prefab_open | read | _log_tool_call( |
unity_prefab_patch | write | r = await _get_facade().prefab_patch( |
unity_prefab_save | write | _log_tool_call( |
unity_profiler_capture_start | write | args = { |
unity_profiler_capture_status | read | _log_tool_call( |
unity_profiler_capture_stop | write | _log_tool_call( |
unity_project_stack_detect | read | _log_tool_call( |
unity_queue_cleanup | read | r = await _get_facade().queue_cleanup(target_type=targetType, target_id=targetId, action=action, |
unity_reflection_operation_cancel | read | r = await _get_facade().reflection_operation_cancel(operation_id=operationId) |
unity_reflection_operation_status | read | r = await _get_facade().reflection_operation_status(operation_id=operationId) |
unity_reflection_operation_wait | read | r = await _get_facade().reflection_operation_wait( |
unity_scene_create | write | _log_tool_call( |
unity_scene_list | read | _log_tool_call( |
unity_scene_load | read | _log_tool_call( |
unity_scene_open | read | _log_tool_call( |
unity_scene_save | write | _log_tool_call( |
unity_scene_set_active | write | _log_tool_call( |
unity_scene_unload | read | _log_tool_call( |
unity_sceneview_command_status | read | _log_tool_call( |
unity_sceneview_navigate | read | _log_tool_call( |
unity_screenshot_camera | read | _log_tool_call( |
unity_screenshot_compare | read | args = { |
unity_screenshot_editor_window | read | _log_tool_call( |
unity_screenshot_game_view | read | _log_tool_call( |
unity_screenshot_pixel_stats | read | args = { |
unity_screenshot_save | write | _log_tool_call( |
unity_screenshot_scene_view | read | _log_tool_call( |
unity_script_analyze | read | _log_tool_call( |
unity_script_dependency_graph | read | _log_tool_call( |
unity_script_read | read | _log_tool_call( |
unity_selection_clear | destructive | _log_tool_call( |
unity_selection_get | read | _log_tool_call( |
unity_selection_set | write | _log_tool_call( |
unity_shader_check_errors | read | _log_tool_call( |
unity_shader_inspect | read | _log_tool_call( |
unity_shader_list | read | _log_tool_call( |
unity_snapshot_baseline_compare | read | args = { |
unity_snapshot_baseline_list | read | args = { |
unity_snapshot_baseline_update | write | args = { |
unity_snapshot_cancel | read | _log_tool_call( |
unity_snapshot_capture | read | try: |
unity_snapshot_collect_artifacts | read | _log_tool_call( |
unity_snapshot_status | read | args = { |
unity_task_cancel | read | _log_tool_call( |
unity_task_start | write | _log_tool_call( |
unity_task_status | read | _log_tool_call( |
unity_test_cancel | read | _log_tool_call( |
unity_test_force_cleanup | destructive | _log_tool_call( |
unity_test_force_reset | destructive | _log_tool_call( |
unity_test_list | read | _log_tool_call( |
unity_test_run | write | _log_tool_call( |
unity_test_status | read | _log_tool_call( |
unity_texture_importer_get | read | _log_tool_call( |
unity_texture_importer_patch | write | args = { |
unity_tool_call | read | _log_tool_call( |
unity_tools_find | read | _log_tool_call( |
unity_type_exists | read | _log_tool_call( |
unity_upilot_acceptance_run | write | args = { |
unity_upilot_flow_cancel | read | _log_tool_call( |
unity_upilot_flow_executions | read | _log_tool_call( |
unity_upilot_flow_force_reset | destructive | _log_tool_call( |
unity_upilot_flow_list | read | _log_tool_call( |
unity_upilot_flow_migrate | read | _log_tool_call( |
unity_upilot_flow_pause | read | _log_tool_call( |
unity_upilot_flow_resume | read | _log_tool_call( |
unity_upilot_flow_status | read | _log_tool_call( |
unity_upilot_flow_stop | write | _log_tool_call( |
unity_upilot_flow_validate | read | _log_tool_call( |
unity_verify_window | read | _log_tool_call( |
unity_write_batch_status | write | _log_tool_call( |
Trust audit
CAUTIONgrade F · trust 59/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (9 observation(s))
- Network
- declared (5 observation(s))
- Shell
- declared (2 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
YamlDotNet.dll
libMonoHookUtils_OSX.dylib
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
self.token = "opaque-private-owner-credential"
self.token = "private-owned-capture-token"
self.token = "opaque-private-owner-credential"
self.token = "private-owned-capture-token"
unity_asset_delete, unity_component_remove, unity_console_clear, unity_drag_drop, unity_gameobject_delete, unity_package_remove, unity_selection_clear, unity_test_force_cleanup, unity_test_force_reset
.upilot-flow.json
.upilot-install.json
.upilot-install.json
.upilot-flow.json
.upilot-install.json
exec(compile(text, str(path), "exec", dont_inherit=True), vars(module))
exec(compile(text, str(path), "exec", dont_inherit=True), vars(module))
"repository skill entry": (repo_entry, "../../../skills/upilot-unity-mcp/SKILL.md"),
"repository skill entry": (repo_entry, "../../../skills/upilot-unity-mcp/SKILL.md"),
"repository skill entry": (repo_entry, "../../../skills/upilot-unity-mcp/SKILL.md"),
endpoint.argv[-1] = "../../../../outside.json"
b' "io.github.codingriver.upilot": "file:../../.."\r\n'
- Streamable HTTP: `http://127.0.0.1:8011/mcp`
- Health check: `http://127.0.0.1:8011/health`
Gates applied: no_behavioural_pass.
cd31b88679bbfull audit observations/trust-audit/mcp-server/codingriver__upilot.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | cd31b88679bb | CAUTION | F | 59 | first audit |
Questions
What is the upilot MCP server?
upilot Unity Editor automation bridge for AI agents and MCP clients
What tools does upilot expose?
167 in total: 117 read-only, 40 that write, and 10 that can delete or overwrite (unity_asset_delete, unity_component_remove, unity_console_clear, unity_drag_drop, unity_gameobject_delete). Every one is listed on this page with its risk.
Is upilot safe to connect to an agent?
With care. The audit graded it F (59/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 10 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does upilot need?
No credential environment variables were found in its source, so it appears to need none.
How does upilot run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as io.github.codingriver.upilot at 0.3.46.
How current is this page?
The grade is for one exact copy of the source (cd31b88679bb), read on 2026-10-11. The repository is watched and re-audited when it changes.