Free SKILL.md scraped from GitHub. Clone the repo or copy the file directly into your Claude Code skills directory.
npx versuz@latest install ivanmurzak-unity-mcp-unity-mcp-plugin-claude-skills-assets-modifygit clone https://github.com/IvanMurzak/Unity-MCP.gitcp Unity-MCP/SKILL.MD ~/.claude/skills/ivanmurzak-unity-mcp-unity-mcp-plugin-claude-skills-assets-modify/SKILL.md---
name: assets-modify
description: |-
Modify asset file in the project. Use 'assets-get-data' tool first to inspect the asset structure before modifying. Not allowed to modify asset file in 'Packages/' folder. Please modify it in 'Assets/' folder.
Three modification surfaces (use whichever fits the task):
1. 'content' — full SerializedMember override (legacy, backwards compatible).
2. 'pathPatches' — list of {path, value} pairs routed through Reflector.TryModifyAt.
3. 'jsonPatch' — JSON Merge Patch routed through Reflector.TryPatch.
When more than one is supplied they run in this order: jsonPatch → pathPatches → content. At least one is required.
Path syntax: 'fieldName', 'nested/field', 'arrayField/[i]', 'dictField/[key]'. Leading '#/' is stripped.
---
# Assets / Modify
## How to Call
```bash
unity-mcp-cli run-tool assets-modify --input '{
"assetRef": "string_value",
"content": "string_value",
"pathPatches": "string_value",
"jsonPatch": "string_value"
}'
```
> For complex input (multi-line strings, code), save the JSON to a file and use:
> ```bash
> unity-mcp-cli run-tool assets-modify --input-file args.json
> ```
>
> Or pipe via stdin (recommended):
> ```bash
> unity-mcp-cli run-tool assets-modify --input-file - <<'EOF'
> {"param": "value"}
> EOF
> ```
### Troubleshooting
If `unity-mcp-cli` is not found, either install it globally (`npm install -g unity-mcp-cli`) or use `npx unity-mcp-cli` instead.
Read the /unity-initial-setup skill for detailed installation instructions.
## Input
| Name | Type | Required | Description |
|------|------|----------|-------------|
| `assetRef` | `any` | Yes | Reference to UnityEngine.Object asset instance. It could be Material, ScriptableObject, Prefab, and any other Asset. Anything located in the Assets and Packages folders. |
| `content` | `any` | No | Optional. The asset content. It overrides the existing asset content (legacy path). |
| `pathPatches` | `any` | No | Optional. List of path-scoped patches routed through Reflector.TryModifyAt. |
| `jsonPatch` | `string` | No | Optional. JSON Merge Patch (RFC 7396, extended with [i]/[key] keys) routed through Reflector.TryPatch. |
### Input JSON Schema
```json
{
"type": "object",
"properties": {
"assetRef": {
"$ref": "#/$defs/AIGD.AssetObjectRef"
},
"content": {
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember"
},
"pathPatches": {
"$ref": "#/$defs/System.Collections.Generic.List<AIGD.PathPatch>"
},
"jsonPatch": {
"type": "string"
}
},
"$defs": {
"System.Type": {
"type": "string"
},
"AIGD.AssetObjectRef": {
"type": "object",
"properties": {
"instanceID": {
"type": "integer",
"description": "instanceID of the UnityEngine.Object. If this is '0' and 'assetPath' and 'assetGuid' is not provided, empty or null, then it will be used as 'null'."
},
"assetType": {
"$ref": "#/$defs/System.Type",
"description": "Type of the asset."
},
"assetPath": {
"type": "string",
"description": "Path to the asset within the project. Starts with 'Assets/'"
},
"assetGuid": {
"type": "string",
"description": "Unique identifier for the asset."
}
},
"required": [
"instanceID"
],
"description": "Reference to UnityEngine.Object asset instance. It could be Material, ScriptableObject, Prefab, and any other Asset. Anything located in the Assets and Packages folders."
},
"com.IvanMurzak.ReflectorNet.Model.SerializedMemberList": {
"type": "array",
"items": {
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember"
}
},
"com.IvanMurzak.ReflectorNet.Model.SerializedMember": {
"type": "object",
"properties": {
"typeName": {
"type": "string",
"description": "Full type name. Eg: 'System.String', 'System.Int32', 'UnityEngine.Vector3', etc."
},
"name": {
"type": "string",
"description": "Object name."
},
"value": {
"description": "Value of the object, serialized as a non stringified JSON element. Can be null if the value is not set. Can be default value if the value is an empty object or array json."
},
"fields": {
"type": "array",
"items": {
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
"description": "Nested field value."
},
"description": "Fields of the object, serialized as a list of 'SerializedMember'."
},
"props": {
"type": "array",
"items": {
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
"description": "Nested property value."
},
"description": "Properties of the object, serialized as a list of 'SerializedMember'."
}
},
"required": [
"typeName"
],
"additionalProperties": false
},
"AIGD.PathPatch": {
"type": "object",
"properties": {
"Path": {
"type": "string",
"description": "Slash-delimited path to the target field/element/entry. Plain segment navigates a field or property (e.g. 'admin' or 'admin/name'). Use '[i]' for array/list index (e.g. 'planets/[0]/orbitRadius'). Use '[key]' for dictionary entry (e.g. 'config/[timeout]'). A leading '#/' is stripped automatically. Required."
},
"Value": {
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
"description": "The new value to write at the path. Use the standard SerializedMember envelope: 'typeName' + 'value' for primitives, or nested 'fields'/'props' for complex types. Required — omitting it overwrites the target with a default empty SerializedMember."
}
}
},
"System.Collections.Generic.List<AIGD.PathPatch>": {
"type": "array",
"items": {
"$ref": "#/$defs/AIGD.PathPatch"
}
}
},
"required": [
"assetRef"
]
}
```
## Output
### Output JSON Schema
```json
{
"type": "object",
"properties": {
"result": {
"$ref": "#/$defs/System.String[]"
}
},
"$defs": {
"System.String[]": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"result"
]
}
```