技能负责「怎么调」,MCP 负责「真正执行」。
先拿名称与短说明的目录,需要时再按名称读取完整参数,最后发起调用——数百个专业工具全部可用,常驻上下文只有几 KB。
保留 MCP 的完整能力,同时把上下文压到最小
目录只返回名称、短说明与标签,完整参数按名称单独读取,不再一次性灌入全部 Schema
服务每次启动成功即发布连接信息到本地 INI,客户端动态读取端口,改端口无需重配
固定标签组或本次动态成员集合,工具、提示词、资源可混合,一次拿一组完整定义
单次详情数量由服务配置决定(默认 32,可设不限),响应上限 64 KiB,禁止一次拉全量
tools/list、prompts/get、resources/read、tools/call 行为保持原样,既有 MCP 客户端照常工作
只需 Node.js 18+,无第三方依赖;Unity 设置与 INI 都不再需要选择脚本语言
SKILL.md 不内联任何工具能力;工具、参数与可用性一律由 discover / list / schema 现场发现
一次请求多个工具定义,顺序与请求一致,同样受数量与响应字节上限约束
按标签组或本次动态成员取详情,一次可取多个 Schema,全集请求一律拒绝
目录只给名称与短说明,先检索再取定义,不把全部 Schema 塞进上下文
脚本既可作 CLI,也可被 require 后用原生对象与工作流上下文组织多步访问
单次详情数量由 Unity 启动时发布,0 表示不限数量,仍受 64 KiB 响应上限约束
技能管说明,MCP 管执行,同一个监听端口
技能只描述「何时用、怎么传参、按什么顺序」,实际执行始终由 MCP 完成
发现快照在主线程构建,HTTP 线程只读快照,不触碰 Unity API 与项目设置
发现接口与 JSON-RPC 复用同一个 HttpListener(默认 8000,可在设置中修改)
新增工具类会自动出现在目录中;用 CapabilityTags 标注即可加入自定义分组
目录 → 参数 → 执行,三步完成一次调用
描述压缩空白并截断到约 160 字符,工具目录同时给出标签,便于先筛选后读取
单次去重成员数不超过 max_details(默认 32,0 表示不限),响应硬上限 65536 字节
一次 POST 取回多个工具定义,按请求顺序返回,可直接按 inputSchema 调用
覆盖全部可用能力的选择会被拒绝:请改用标签组或明确的动态成员,单项始终允许
参数错误 400、成员未知或已禁用 404、响应过大 413,均返回结构化 JSON,不静默截断
GET /discovery - 连接元数据、脚本语言、数量上限GET /groups - 标签组及工具/提示词/资源计数GET /tools - 工具名称、短说明、标签GET /prompts - 提示词目录GET /resources - 资源目录(uri、名称、mimeType)GET /tools/{name}/schemaPOST /capabilities/schemas - 一次多个工具 SchemaPOST /capabilities/details// 方式一:批量取工具 Schema,按请求顺序返回
{ "tools": ["hierarchy_search", "hierarchy_apply"] }
// 方式二:固定标签组
{ "tag": "hierarchy-management" }
// 方式三:本次动态成员,可混合三类
{
"members": [
{ "kind": "tool", "name": "hierarchy_search" },
{ "kind": "prompt", "name": "实际提示词名" },
{ "kind": "resource", "uri": "file://path/to/resource.yaml" }
]
}
既有 MCP 客户端无需任何改动;技能链路只是额外提供了一套更省上下文的入口。
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hierarchy_search",
"arguments": { "pattern": "Player" }
}
}
INI 与 /discovery 只发布 base_url、port 与各发现接口地址,不发布 /mcp 端点,避免 Agent 绕过技能直接拼协议地址。
一份 SKILL.md + 一个无依赖客户端,即可接入任意 Agent
技能目录位于 unity-package/Skills/unity-skilled-mcp/,只说明「服务怎么连、先取什么、再取什么、参数怎么传」,不枚举任何工具的参数;工具参数始终按需从服务端读取,替代过去一次性灌入全部 Schema 的做法。
Window/MCP/Status → 点击「复制技能安装提示词」,把剪贴板内容粘贴到任意 Agent,即可按提示完成安装。unity-skilled-mcp 文件夹复制到目标 Agent 的 skills 目录(如 ~/.workbuddy/skills/),目录名保持不变。SKILL.md:唯一入口说明,只写连接、发现、调用与安全边界,不内联具体工具能力。scripts/unity_bridge.js 与 scripts/unity_bridge.py:两个等价客户端(Node.js 18+ / Python 3.8+),只用标准库,子命令、选项、退出码与函数名一致。discover → list / find → schema 现场发现;文档中的名字不代表当前服务存在。script_language,Unity 端也没有脚本语言选项。# 1. 核对连接(读 INI,再验证 /discovery)
node scripts/unity_bridge.js discover
# 2. 先看有哪些组和目录
node scripts/unity_bridge.js groups
node scripts/unity_bridge.js list --kind tools
# 3. 取参数:按标签组,或本次动态成员(名称来自目录)
node scripts/unity_bridge.js details --tag TAG_FROM_GROUPS
node scripts/unity_bridge.js details --members-file selection.json
# 4. 取工具 Schema(单个或批量)后调用
node scripts/unity_bridge.js schema NAME_FROM_LIST
node scripts/unity_bridge.js schemas NAME1 NAME2
node scripts/unity_bridge.js call NAME_FROM_LIST --args-file args.json
# 5. 目录检索与正文读取,多步访问由库 API 编排
node scripts/unity_bridge.js find QUERY --kind tools
node scripts/unity_bridge.js prompt NAME
node scripts/unity_bridge.js resource URI
# 6. 文档不预设能力:任何工具都先发现、再取定义
node scripts/unity_bridge.js list --kind tools
node scripts/unity_bridge.js schemas NAME1 NAME2
find QUERY:只取一次目录摘要,在本地按名称 / URI / 说明 / 标签做大小写不敏感过滤,工具再多也不必灌入整份目录;不取详情、不读正文。prompt NAME / resource URI:详情接口只给注册定义,这两条命令先校验名称或 URI 在目录中,再走 prompts/get / resources/read 取正文。资源 URI 必须是已注册项,禁止借服务端对任意 http://、file:// 的兼容读取绕过外发授权。schema 再 call,技能不提供批量调用接口;循环次序、遇错是否继续与重放范围皆由代码决定。每次调用仍独立校验 INI 与 discovery。脚本既是 CLI 也是零依赖 CommonJS 库。require 后可用原生对象直接调用,让 AI 自己写代码组织多步访问;库函数复用 CLI 的全部校验与安全边界。
// Node.js 18+(CommonJS);先从目录与 schema 决定工具
const unity = require('./scripts/unity_bridge.js');
unity.configure({ timeout: 15 });
const catalog = await unity.listCapabilities('tools');
const { name, args } = pickFrom(catalog, await unity.getSchema(name));
const summary = await unity.workflowContext('TASK', 'DESCRIPTION', async function (wf) {
await unity.callSkill(name, args);
return wf.summary();
});
call_skill / callSkill 返回 MCP result;call_tool / callTool 返回完整 JSON-RPC 信封;*_text / *_json 提取并解析 content[*].text。workflowContext 只记录调用与耗时(wf.calls / wf.summary()),不重试、不回滚;失败照常抛出。工具名与参数须来自 find / list 与 schema,示例不含任何真实工具名。new Client({...});所有方法均为 async,异常为带 .code 的 ClientError;库模式默认静默 stderr。request /ROUTE 转成本地路径的问题已修复:客户端按 EXEPATH 自动还原,也支持裸路由 request groups。discover → groups / list / find → details / schema / schemas → call。schema 为准;返回未启用、未安装或未知时如实告知并停止,不换名猜、不重试、不用 request 绕过。scripts/unity_bridge.js(Node.js 18+),不再有脚本语言选项。# ~/.unity-mcp/skill.ini
[project:YourUnityProject]
base_url=http://localhost:8000
port=8000
project_path=E:/YourUnityProject
unity_version=2021.3.45f2c1
render_pipeline=Built-in
process_id=12345
started_at=2026-10-30T02:00:00.0000000Z
updated_at=2026-10-30T02:00:00.0000000Z
max_details=32
[project:AnotherProject]
base_url=http://localhost:8001
port=8001
project_path=E:/AnotherProject
project_name=AnotherProject
instance_id=8c2b71e0-...
unity_version=2021.3.45f2c1
render_pipeline=URP
process_id=23456
started_at=2026-10-30T03:00:00.0000000Z
updated_at=2026-10-30T03:00:00.0000000Z
max_details=32
每个端只写自己的 [project:工程名] 节,不再发布 [unity3d-skilled-mcp] 兼容节;started_at 是该端服务启动时刻,值最大者即最新启动的端。启动或改端口重启都会重写本端节,其它在线端的节保持不变。unity_version 与 render_pipeline 是启动时捕获的 Unity 版本与生效渲染管线(Built-in / URP / HDRP / 自定义类型全名)。客户端每次命令都重新读取,不扫描端口,也不自动重试写操作。
通过自然语言指令完成复杂的 Unity 开发任务;示例中的工具名仅为演示,实际以发现结果为准
"修复控制台中的所有警告和报错"
AI 自动分析控制台日志,识别问题类型,提供修复建议并执行修复操作
"创建一个 60 顶点的圆形雨伞网格,保存到 Meshes 目录"
使用 Python 脚本生成复杂 3D 网格,自动导入 Unity 并保存为资源文件
"安装 android-logcat 插件到 Unity"
通过 Package Manager 自动搜索、下载并安装 Unity 插件包,无需手动操作
"分析 Scripts 目录下的代码,用 Matplotlib 绘制架构图"
扫描项目代码结构,分析类依赖关系,生成专业的 UML 架构图
"基于 Prefabs 下的美术资源及文档,在场景中布置一个房间"
AI 理解资源说明文档,自动选择合适的预制体,按照设计规范摆放场景物体
"使用规则文件,在场景中构建 UGUI 界面"
根据 JSON/YAML 规则文件自动创建 UI 层级结构,设置布局和样式
"将 LoginView 界面引用的图片打包为 LoginViewAtlas"
自动收集 UI 引用的所有 Sprite,创建 Sprite Atlas 并优化纹理打包
"看看场景相关都有哪些工具,把参数给我"
先取 groups 与目录定位标签,再一次性取该组完整定义,避免逐个试错
"切到 Windows 平台,用开发配置构建到 Builds/Windows"
先确认构建设景,再切换平台并排队构建,最后轮询构建状态与错误数
"给角色做一个 Idle→Run 的状态机,按 Speed 切过去"
建控制器、加参数与状态、连线过渡条件,播放时直接切状态验证
"做一个主菜单 UXML,标题文字改成中文并接上 PanelSettings"
生成 UXML/USS,改元素属性,再给场景对象挂 UIDocument 并截图确认
"跑一遍 EditMode 里 Fast 类别的测试,把失败项列出来"
启动测试任务后轮询状态,读取通过/失败计数与失败用例清单
覆盖游戏开发完整工作流
集成 Stable Diffusion 批量生成游戏纹理,自动创建 Material 并应用
从 Poly Haven 等平台批量下载 PBR 材质,自动创建完整配置
分析 Unity 项目结构,生成可视化架构图和依赖关系
自动检测 Draw Call、高多边形模型,提供优化建议
使用 Faker 批量生成游戏配置数据,用于压力测试
集成 GPT-4 批量翻译游戏文本,支持多语言版本生成
四步完成配置,零第三方依赖
// 将 unity-package 目录导入 Unity 项目
// 或通过 Package Manager 添加 Git URL
"io.uframe.unity3d-mcp": "https://github.com/zoucdr/unity3d-mcp.git?path=/unity-package"
// 菜单 Window/MCP/Status → Start Server
// 默认端口 8000,可在设置或状态窗口中修改
// 启动成功即写入 ~/.unity-mcp/skill.ini
// 启动配置由 Unity 发布,例如 max_details(无脚本语言选项)
// 方式一:技能(省上下文)
// 状态窗口点击「复制技能安装提示词」→ 粘贴给任意 Agent
// 方式二:直接用 MCP 客户端(能力全量)
{
"mcpServers": {
"unity3d-mcp": {
"url": "http://localhost:8000"
}
}
}
// 技能链路:先核对连接,再按需读取
node scripts/unity_bridge.js discover
node scripts/unity_bridge.js list
// 直接对话也可以
"请帮我创建一个 Cube 对象"
"分析当前场景的性能问题并提供优化建议"
目录看摘要,详情按组取,正文由 prompt / resource 命令显式读取
实现 IRes 即可注册资源;目录接口只返回 uri、名称与 mimeType,详情返回注册定义,不隐式读取正文
实现 IPrompts 注册模板;目录给出名称与短说明,需要参数时按名称或标签组取完整定义
public class ProjectTreeRes : IRes
{
public string Url => "file://path/to/resource.yaml";
public string Name => "project_tree";
public string Description => "工程文件夹树型结构";
public string MimeType => "application/yaml";
}
file:// - 本地文件访问http:// - HTTP 资源访问mcp:// - MCP 自定义协议data: - 内联数据// 目录:只看摘要
GET /resources
// 详情:按标签组或指定 URI
POST /capabilities/details
{ "members": [{ "kind": "resource", "uri": "file://path/to/resource.yaml" }] }
// 读取正文:沿用原协议
{ "method": "resources/read", "params": { "uri": "file://path/to/resource.yaml" } }
// 技能命令:先校验目录,再读取正文
node scripts/unity_bridge.js resource file://path/to/resource.yaml
public class TestTalkStepPrompts : IPrompts
{
public string Name => "test_talk_step";
public string Description => "测试对话步骤";
public string PromptText => "请描述一个对话步骤的内容,包括角色的台词和情感。";
public MethodKey[] Keys => new MethodKey[]
{
new MethodKey("step", "对话步骤", false)
.AddExample("角色A:你好,我是A。角色B:你好,我是B。")
};
}
// 目录
GET /prompts
// 调用:沿用原协议
{ "method": "prompts/get", "params": { "name": "test_talk_step" } }
// 技能命令:先校验目录,再取模板正文
node scripts/unity_bridge.js prompt test_talk_step
以下为源码内置能力示例,实际可用工具以 discover / list 现场发现为准