Unity MCP 遥测机制全解析:隐私保护、数据采集、退出机制与源码级实现
【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp
本指南基于 Unity MCP 仓库中的官方架构文档 website/docs/architecture/telemetry.md,系统讲解 Unity MCP 内建遥测系统的设计原则、采集范围、退出机制、本地存储与传输实现,并结合 Server/src/core/telemetry.py、MCPForUnity/Editor/Helpers/TelemetryHelper.cs 等源码与测试用例进行纵深剖析。读完本文,你将掌握 Unity MCP 遥测的完整工作原理、三种退出方式,以及如何在 Python Server 与 Unity 编辑器两侧自定义遥测事件。
遥测系统的设计初衷与四大原则
Unity MCP(MCP for Unity)是连接 AI 助手与 Unity 编辑器的桥梁,工具执行频率、成功率、场景操作分布等数据对产品质量提升至关重要。为此,项目内置了一套遥测系统,其官方文档明确了四条核心原则(见 telemetry.md):
- 匿名(Anonymous):使用随机生成的 UUID 标识安装实例,不携带任何个人信息;
- 非阻塞(Non-blocking):遥测在任何情况下都不干扰 Unity 工作流;
- 易退出(Easy opt-out):通过环境变量或 Unity 编辑器设置即可一键关闭;
- 透明(Transparent):所有采集的数据类型都在文档中公开列明。
从源码实现看,这四条原则并非口号。在 telemetry.py 的record()方法中,事件通过queue.put_nowait()非阻塞入队,队列满时直接丢弃并记录 debug 日志;发送失败也仅记录日志,绝不抛出影响主流程的异常。整条链路贯彻了"fail-safe"的设计思想。
采集范围:收集什么,不收集什么
使用分析(Usage Analytics)
- 工具使用情况(Tool Usage):记录了哪些 MCP 工具被调用,如
manage_script、manage_scene等; - 性能指标(Performance):工具执行耗时与成功/失败率;
- 系统信息(System Info):Unity 版本、运行平台(Windows/Mac/Linux)、MCP 版本号;
- 里程碑事件(Milestones):首次使用类事件,如首次创建脚本、首次调用工具等。
技术诊断(Technical Diagnostics)
- 连接事件(Connection Events):Bridge 启动、连接成功或失败;
- 错误报告(Error Reports):脱敏后的错误消息(截断至 200 字符);
- 服务健康(Server Health):启动时间、连接延迟。
明确不收集的内容
- ❌ 你的代码或脚本内容
- ❌ 项目名称、文件名或路径
- ❌ 个人信息或标识符
- ❌ 敏感项目数据
- ❌ IP 地址(HTTP 请求所需的最小范围除外)
源码层面对"不收集代码内容"有硬性约束:record_tool_usage()中错误消息被强制截断为 200 字符(str(error)[:200]),record_failure()截断为 500 字符(见 telemetry.py),从结构上杜绝了长文本泄露的可能性。
如何退出遥测:三种方式详解
方式一:环境变量(推荐)
官方文档推荐设置以下任一环境变量为true即可全局禁用:
# 禁用全部遥测 export DISABLE_TELEMETRY=true # MCP for Unity 专用 export UNITY_MCP_DISABLE_TELEMETRY=true # MCP 协议级通用开关 export MCP_DISABLE_TELEMETRY=true从源码看,这一开关同时作用于 Python Server 与 Unity 编辑器两侧。Python 侧在 telemetry.py 的_is_disabled()中依次检查DISABLE_TELEMETRY、UNITY_MCP_DISABLE_TELEMETRY、MCP_DISABLE_TELEMETRY三个变量,且取值识别范围更宽——"true"、"1"、"yes"、"on"均视为关闭;Unity 侧在 TelemetryHelper.cs 的IsEnabled属性中同样检查这三个环境变量。两端的判定逻辑保持了一致性。
方式二:Unity 编辑器设置(Coming Soon)
官方文档标注该入口即将推出:Window > MCP for Unity > Settings > Disable Telemetry。虽然菜单入口尚未开放,但底层能力已经就绪——TelemetryHelper提供了DisableTelemetry()/EnableTelemetry()方法,将布尔值写入MCPForUnity.TelemetryDisabled这个 EditorPrefs 键(见 EditorPrefKeys.cs)。IsEnabled在环境变量检查通过后,还会读取EditorPrefs.GetBool("MCPForUnity.TelemetryDisabled", false)作为最终开关,说明编辑器 UI 只需接入现有 API 即可生效。
方式三:MCP 客户端配置
如果你的 MCP 客户端通过配置文件启动 Server,可以在配置的env段注入环境变量:
{ "env": { "DISABLE_TELEMETRY": "true" } }注意方式三本质上是方式一的落地形式——MCP 客户端启动子进程时注入环境变量,Server 进程启动后即被_is_disabled()捕获。
技术实现:从采集到传输的完整链路
整体架构
官方文档给出的架构分工为:
- Python Server:核心遥测采集与传输;
- Unity Bridge:从 Unity 编辑器侧进行本地事件采集;
- 匿名 UUID:按安装实例生成,用于聚合分析;
- 线程安全:后台线程非阻塞传输;
- 容错(Fail-safe):任何错误都不会中断工作流。
实际代码将这条链路实现为两个独立的采集源,最终都汇聚到同一个遥测端点。
Python Server 侧:TelemetryCollector 单例与后台 Worker
telemetry.py 中的TelemetryCollector是核心采集类:
- 初始化时加载持久化数据(UUID 与里程碑),随后启动一个守护线程(
daemon=True)作为唯一的后台 Worker; record()将TelemetryRecord通过put_nowait()放入容量为 1000 的有界队列,非阻塞且队列满时静默丢弃;- Worker 循环每 0.5 秒取一条记录调用
_send_telemetry()发送,天然串行化所有请求。
模块还提供了全局单例get_telemetry()与便捷函数record_telemetry()、record_milestone()、record_tool_usage()、record_resource_usage()、record_latency()、record_failure()(见 telemetry.py)。测试 test_telemetry_queue_worker.py 验证了队列背压行为:50 次快速record()调用在队列满载时仍能于 500ms 内全部返回(不阻塞),且确认整个 Collector 只存在一个 Worker 线程。
RecordType枚举定义了九类记录:VERSION、STARTUP、USAGE、LATENCY、FAILURE、RESOURCE_RETRIEVAL、TOOL_EXECUTION、UNITY_CONNECTION、CLIENT_CONNECTION(见 telemetry.py)。
工具装饰器:零侵入埋点
为了让 44 个工具服务类(位于 Server/src/services/tools)与资源服务都获得遥测能力,项目提供了telemetry_tool与telemetry_resource两个装饰器(见 telemetry_decorator.py):
- 同步与异步包装器自动记录工具名、成功标志、耗时(毫秒)、错误信息;
- 通过
inspect.signature().bind_partial()智能提取action参数作为sub_action(如manage_scene的get_hierarchy、save),使分析粒度细化到子操作; - 在
manage_script且action == "create"时触发FIRST_SCRIPT_CREATION里程碑,manage_scene*工具触发FIRST_SCENE_MODIFICATION里程碑,任何工具首次成功执行触发FIRST_TOOL_USAGE里程碑。
装饰器统一在注册入口应用:telemetry_tool(tool_name)在 Server/src/services/tools/init.py 与 Server/src/services/custom_tool_service.py 中包装内置工具与自定义 Python 工具,telemetry_resource在 Server/src/services/resources/init.py 中包装资源。测试 test_telemetry_subaction.py 验证了关键字参数与位置参数两种调用方式下sub_action的提取结果,以及无action参数时优雅降级为None。
Unity 编辑器侧:TelemetryHelper 轻量桥
Unity 侧不直接联网发送,而是扮演"轻量桥"角色。 TelemetryHelper.cs 提供:
RecordBridgeStartup():记录 Bridge 启动事件,附带包版本与自动连接模式;RecordBridgeConnection(success, error):记录连接结果,错误同样截断至 200 字符;RecordToolExecution(toolName, success, durationMs, error):记录工具执行;GetCustomerUUID():从 EditorPrefs(键MCPForUnity.CustomerUUID)读取或生成匿名 UUID;RegisterTelemetrySender():供传输层注册实际的发送委托,未注册时仅输出 debug 日志兜底。
这些事件在 StdioBridgeHost.cs 等传输宿主中触发,最终经由 MCP Server 统一处理与传输,印证了文档中"Unity Bridge 负责本地采集、Python Server 负责传输"的分工。
本地数据存储
遥测数据按平台存储在系统标准数据目录下:
- Windows:
%APPDATA%\UnityMCP\ - macOS:
~/Library/Application Support/UnityMCP/ - Linux:
~/.local/share/UnityMCP/(遵循XDG_DATA_HOME,见 telemetry.py)
目录下生成两个文件:
customer_uuid.txt:匿名标识符,POSIX 系统下以0o600权限写入以保护隐私;milestones.json:一次性事件追踪器(记录每个里程碑首次发生的时间戳与附加数据)。
源码还处理了持久化文件的健壮性:即使milestones.json损坏(如测试中写入{not-json}),UUID 也会保持不变,两者解耦加载(见 test_telemetry_endpoint_validation.py)。
数据传输:端点、超时与校验
官方文档列出的传输规格为:
- 端点:
https://api-prod.coplay.dev/telemetry/events - 方法:HTTPS POST,JSON 载荷
- 重试:后台线程优雅失败,不重试
- 超时:10 秒超时,失败不重试
源码中的细节更丰富:
- 默认超时实际为1.5 秒,可通过
UNITY_MCP_TELEMETRY_TIMEOUT覆盖;main.py 在 Server 启动时会自动将其提升为 5.0 秒(除非用户显式设置); - 端点可通过
UNITY_MCP_TELEMETRY_ENDPOINT环境变量或 config.py 中的telemetry_endpoint配置覆盖,配置优先级为"config 优先、env 显式覆盖"; _validated_endpoint()会对端点做安全校验:仅允许http/https协议、必须有 netloc、禁止 localhost/127.0.0.1/::1,非法值回退到默认端点(见 telemetry.py),对应测试 test_telemetry_endpoint_validation.py 验证了file:///etc/passwd这类非 HTTP 端点会被拒绝;- 发送时优先使用
httpx,不可用时回退到标准库urllib; - 载荷会附加
platform_detail(如Linux 5.15.0 (x86_64))与python_version字段,便于 BigQuery 分析端做细粒度聚合而无需改表结构。
数据用途、保留策略与开发边界
数据用于什么
官方文档明确数据仅用于产品改进与开发决策:
- 产品改进:了解工具使用分布、识别慢操作、跟踪错误率与连接问题、确保 Unity 版本兼容性;
- 开发优先级:根据功能使用频率决定 Roadmap、按错误频率排序 Bug 修复、按平台使用率分配资源、针对问题高发区改进文档。
明确不做的事
- ❌ 向第三方出售数据
- ❌ 用于广告/营销
- ❌ 追踪单个开发者
- ❌ 存储敏感项目信息
保留策略
- 聚合数据:无限期保留,用于产品洞察;
- 原始事件:90 天后自动清除;
- 个人数据:不采集,故无需清除;
- 退出生效:一旦退出立即停止上报,后续不再发送任何数据。
开发者扩展:自定义遥测事件与状态查询
官方文档提供了两个开发 API 示例,注意原文档代码示例存在遗漏(缺少from关键字),此处给出修正后可直接运行的版本:
from core.telemetry import record_telemetry, RecordType record_telemetry(RecordType.USAGE, { "custom_event": "my_feature_used", "metadata": "optional_data" })from core.telemetry import is_telemetry_enabled if is_telemetry_enabled(): print("Telemetry is active") else: print("Telemetry is disabled")更贴近业务的做法是直接使用语义化便捷函数:工具执行用record_tool_usage(tool_name, success, duration_ms, error, sub_action),资源读取用record_resource_usage(...),性能监控用record_latency(operation, duration_ms, metadata),异常上报用record_failure(component, error, metadata),用户旅程里程碑用record_milestone(MilestoneType.FIRST_STARTUP, data)。MilestoneType枚举还预置了DAILY_ACTIVE_USER、WEEKLY_ACTIVE_USER、MULTIPLE_SESSIONS等活跃度指标(见 telemetry.py),便于长期留存分析。
典型遥测事件示例与自检清单
官方文档给出的标准事件载荷如下:
{ "record": "tool_execution", "timestamp": 1704067200, "customer_uuid": "550e8400-e29b-41d4-a716-446655440000", "session_id": "abc123-def456-ghi789", "version": "3.0.2", "platform": "posix", "data": { "tool_name": "manage_script", "success": true, "duration_ms": 42.5 } }对照源码可确认其字段构成(见 telemetry.py):顶层包含记录类型、Unix 时间戳、匿名 UUID、会话 UUID(每次进程启动随机生成)、MCP 包版本(优先取安装元数据,Git 方式安装则回退读取 pyproject.toml,见 telemetry.py)、平台与数据体;若事件属于里程碑,还会附加milestone字段。
自检清单:
- ✅ 匿名 UUID(随机生成,与安装实例绑定)
- ✅ 工具性能指标(
duration_ms保留两位小数) - ✅ 成功/失败追踪
- ❌ 无代码内容
- ❌ 无项目信息
- ❌ 无个人数据
隐私合规建议与延伸阅读
结合本文与源码,给使用者的隐私合规建议可归纳为三点:其一,若在团队或企业环境统一部署,推荐在 MCP 客户端配置的env段写入DISABLE_TELEMETRY=true,从进程源头关闭;其二,若需审计,三个退出环境变量与MCPForUnity.TelemetryDisabledEditorPrefs 键均可作为配置审计点;其三,遥测端点与超时可通过UNITY_MCP_TELEMETRY_ENDPOINT、UNITY_MCP_TELEMETRY_TIMEOUT按需调整,而端点校验逻辑拒绝 localhost,防止误配导致数据流向本地代理。
如需继续深入,可进一步阅读:官方架构文档 website/docs/architecture/telemetry.md、Server 端实现 Server/src/core/telemetry.py 与装饰器 Server/src/core/telemetry_decorator.py、Unity 编辑器侧 MCPForUnity/Editor/Helpers/TelemetryHelper.cs,以及验证遥测行为的测试用例 test_telemetry_endpoint_validation.py、test_telemetry_queue_worker.py 和 test_telemetry_subaction.py。整个遥测代码均在仓库内开源,任何数据采集行为都可被追溯审查。
【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考