Unity MCP 遥测机制全解析:隐私保护、数据采集、退出机制与源码级实现
2026/9/14 22:26:14 网站建设 项目流程

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_scriptmanage_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_TELEMETRYUNITY_MCP_DISABLE_TELEMETRYMCP_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是核心采集类:

  1. 初始化时加载持久化数据(UUID 与里程碑),随后启动一个守护线程daemon=True)作为唯一的后台 Worker;
  2. record()TelemetryRecord通过put_nowait()放入容量为 1000 的有界队列,非阻塞且队列满时静默丢弃;
  3. 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枚举定义了九类记录:VERSIONSTARTUPUSAGELATENCYFAILURERESOURCE_RETRIEVALTOOL_EXECUTIONUNITY_CONNECTIONCLIENT_CONNECTION(见 telemetry.py)。

工具装饰器:零侵入埋点

为了让 44 个工具服务类(位于 Server/src/services/tools)与资源服务都获得遥测能力,项目提供了telemetry_tooltelemetry_resource两个装饰器(见 telemetry_decorator.py):

  • 同步与异步包装器自动记录工具名、成功标志、耗时(毫秒)、错误信息
  • 通过inspect.signature().bind_partial()智能提取action参数作为sub_action(如manage_sceneget_hierarchysave),使分析粒度细化到子操作;
  • manage_scriptaction == "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_USERWEEKLY_ACTIVE_USERMULTIPLE_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_ENDPOINTUNITY_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询