blockbench-hytale — Claude Code skill: Hytale models in Blockbench
This skill walks an agent through Blockbench MCP tools for Hytale: formats, UVs, cube stretch, shading, attachments and animation. The Hytale Models plugin is required.
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a claude-codeWhat blockbench-hytale does
Two Hytale formats are covered: hytale_character at 64 units per world block for characters and attachments such as tools, weapons and cosmetics, and hytale_prop at 32 for world props, furniture and blocks. The agent calls get_capabilities with include_tools=true and picks a returned format ID. A Bedrock project does not activate Hytale, so the check has to be explicit.
Geometry comes from cubes and quads, with groups built on joints. Stretch (hytale_set_cube_stretch) changes the visible shape but not the base UV size, and set_cube_uv keeps faces tied to their dimensions. Quads cannot convert to box UV. Exported models cap at 255 nodes, and exporter folding of a group's main cube affects the real count. Texture width and height must each be multiples of 32.
Attachments need care. hytale_set_attachment_piece only marks an existing group; it creates no collection and configures nothing in the game. The group name has to match a bone in the base model or the piece will not attach. Attachment export expects a live Collection, not a JSON string in the export options. Animation files run at 60 frame units per second while MCP keyframe times are seconds, so time=0.5 lands on frame 30.
What it helps with
- build a Hytale character model in the
hytale_characterformat - match UV dimensions to an atlas sized in multiples of 32
- mark a group as an attachment piece and check it against the base model bone
- set a cube's shading mode and double-sided rendering
- place visibility keyframes in seconds against 60 fps
Example prompts for the agent
- Create a project named
goblinin thehytale_characterformat and build a rig fromrig_rootandbody - Make a
goblin_atlastexture at 128×96 and confirm uv_size matches bitmap_size - Mark the
hand_rightgroup as an attachment piece and list the pieces
How to install blockbench-hytale
1Skills CLI (Vercel)
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a claude-code2Manually: put the files in place
~/.claude/skills/blockbench-hytale/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/blockbench-hytale/
1Skills CLI (Vercel)
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a codex2Manually: put the files in place
.agents/skills/blockbench-hytale/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a cursor2Manually: put the files in place
.cursor/skills/blockbench-hytale/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jasonjgardner/blockbench-mcp-project blockbench-hytale2Manually: put the files in place
.github/skills/blockbench-hytale/SKILL.md1Skills CLI (Vercel)
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a gemini-cli2Platform CLI
gemini skills install https://github.com/jasonjgardner/blockbench-mcp-project --path skills/blockbench-hytaleManually: put the files in place
.devin/skills/blockbench-hytale/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about blockbench-hytale
How do I install blockbench-hytale in Claude?
Run npx skills add jasonjgardner/blockbench-mcp-project --skill blockbench-hytale -a claude-code. The skill file lands at ~/.claude/skills/blockbench-hytale/SKILL.md.
What does blockbench-hytale do?
It guides an agent through Hytale model and animation work via Blockbench MCP tools: format selection, geometry, UVs, stretch, shading, attachments and visibility keyframes.
What does the skill need to work?
The Hytale Models plugin installed. Without it the Hytale formats will not appear in Blockbench and the agent cannot pick a format ID.
Source text
SKILL.md · Apache-2.0
---
name: blockbench-hytale
description: Create Hytale models and animations through Blockbench MCP. Use for character/attachment or prop formats, UV density, stretch, quads, shading, attachment pieces, and visibility keyframes. Requires the Hytale Models plugin.
---
# Blockbench Hytale
Use the shared [modeling](../blockbench-modeling/SKILL.md), [texturing](../blockbench-texturing/SKILL.md), and [animation](../blockbench-animation/SKILL.md) workflows where applicable.
## Select the Actual Hytale Format
Call `get_capabilities: include_tools=true` and choose a returned Hytale format ID. Creating a Bedrock project does not activate Hytale.
| Format | Units per world block | Use |
|---|---|---|
| `hytale_character` | 64 | Characters and attachments, including tools, weapons and cosmetics |
| `hytale_prop` | 32 | World props, furniture and blocks |
These numbers describe geometry/texel density, not maximum atlas resolution. Texture width and height may differ and must each be multiples of 32. Match effective UV dimensions to the actual image, and preserve the format's dimension-linked face UVs. The official [Hytale art guide](https://hytale.com/news/2025/12/an-introduction-to-making-models-for-hytale) explains density and atlas sizing.
```
get_capabilities: format_id="hytale_character"
create_project: name="goblin", format="hytale_character"
hytale_get_format_info
# → formatType, blockSize, animationFPS, nodeCount, maxNodes, nodeCountValid, features
```
Use `create_project` only when a new project is intended. Inspect existing projects before replacing content.
For a new static 128×96 Hytale atlas, explicitly match UV and bitmap dimensions (both Hytale formats support per-texture UV sizing):
```
create_texture: name="goblin_atlas", width=128, height=96,
uv_width=128, uv_height=96, fill_color="#808080", layer_name="base"
list_textures
# Confirm uv_size, bitmap_size and frame_size are [128,96]
```
The `uv_width`/`uv_height` pair is available in the current source plugin; confirm the loaded tool schema supports it. Creating this image does not pack the model's UVs; follow the texturing skill's native template workflow when a new layout is needed.
## Geometry and UVs
The format supports cubes/quads, joint-based groups, stretch, optional box UV and per-texture UV dimensions. Use integer base dimensions when following the plugin's default size setting; stretch allows finer visible dimensions while retaining the UV layout. Fractional base dimensions are not categorically impossible, but make UV consistency harder. Exported models have a 255-node limit; exporter folding of a group's main cube affects the actual count. These are format behaviors documented in the [Hytale format source](https://github.com/JannisX11/hytale-blockbench-plugin/blob/main/src/formats.ts).
```
add_group: name="rig_root", origin=[0, 0, 0]
add_group: name="body", parent="rig_root", origin=[0, 24, 0]
place_cube: elements=[{name: "torso_geo", from: [-8, 24, -4], to: [8, 48, 4]}], group="body"
hytale_set_cube_stretch: cube_id="torso_geo", stretch=[1.1, 1, 1]
hytale_get_cube_stretch: cube_id="torso_geo"
hytale_create_quad: name="leaf", position=[0, 16, 0],
normal="+Y", size=[8, 8], double_sided=true
```
Normals may be `+X`, `-X`, `+Y`, `-Y`, `+Z`, or `-Z`. Use double-sided rendering when both sides should appear. Small stretch changes can fix intersections; the art guide recommends roughly 0.7–1.3 per axis for its style, which is a visual recommendation rather than the MCP schema's validity range. Block in colors before painted volume and fine detail, and avoid unintended noisy grain. Soft brushes are appropriate to Hytale's painted style; pixel-perfect drawing is not mandatory. See the [art guide](https://hytale.com/news/2025/12/an-introduction-to-making-models-for-hytale).
`set_cube_uv` preserves Hytale's `autouv=1` and dimension-linked rectangle sizes. Move or mirror a face's UVs while retaining its absolute base geometry width/height (swapped for 90/270-degree UV rotation); changing those extents is rejected before Undo. Stretch changes the visible shape, not that base UV size. For the per-face `torso_geo` above, its unrotated north face is 16×24:
```
get_cube_uv: id="torso_geo"
set_cube_uv: id="torso_geo", faces={north: {uv: [8, 8, 24, 32], rotation: 0}}
```
Hytale quads cannot convert to box UV. Texture selection follows an attachment collection or the project default, even when the format reports `single_texture=false`; non-null per-face texture assignments are rejected. Inspect `effective_texture` and use the native collection/default texture workflow. See [native element behavior](https://github.com/JannisX11/hytale-blockbench-plugin/blob/main/src/element.ts) and [attachment texture resolution](https://github.com/JannisX11/hytale-blockbench-plugin/blob/main/src/attachment_texture.ts).
## Shading
`hytale_set_cube_properties` sets `shading_mode` and `double_sided`; `hytale_get_cube_properties` reads them. Accepted shading names are `standard`, `flat`, `fullbright`, and `reflective`. The exported property is not proof of matching viewport appearance; verify materials in Hytale.
```
hytale_set_cube_properties: cube_id="torso_geo", shading_mode="standard"
hytale_get_cube_properties: cube_id="torso_geo"
```
## Attachments
`hytale_list_attachments` lists existing attachment collections. `hytale_set_attachment_piece` marks an existing group; `hytale_list_attachment_pieces` reads those markers. A piece attaches to a matching base-model bone name, so inspect both assets and preserve the required names.
```
# Existing attachment group whose name matches the intended base bone
hytale_set_attachment_piece: group_name="hand_right", is_piece=true
hytale_list_attachment_pieces
hytale_list_attachments
```
Marking a group does not create a collection, configure the game's item, or export a separate attachment. The current tool family lists collections but does not create them. Use the installed plugin's native collection/attachment workflow when needed. The model compiler expects a live Collection for attachment-specific export; a JSON string in generic `export_model.options` is not that object. Verify the attachment with the base model and inspect the actual exported nodes. See [Hytale plugin features](https://github.com/JannisX11/blockbench-plugins/blob/master/plugins/hytale_plugin/about.md) and [model codec source](https://github.com/JannisX11/hytale-blockbench-plugin/blob/main/src/blockymodel.ts).
## Animation
Hytale animation files use 60 frame units per second. MCP keyframe times are seconds; `time=0.5` represents frame 30 at export. Use the animation UUID returned by `create_animation` and existing group names:
```
draw = create_animation: name="draw", animation_length=1, bones={}
hytale_create_visibility_keyframe: animation_id=draw.uuid,
bone_name="weapon_sheathed", time=0, visible=true
hytale_create_visibility_keyframe: animation_id=draw.uuid,
bone_name="weapon_sheathed", time=0.5, visible=false
hytale_set_animation_loop: animation_id=draw.uuid, loop_mode="hold"
```
The examples use tool-call pseudocode; bind `draw.uuid` to the returned UUID. Visibility changes need initial states as well as transition keys. For swapping two representations, key both at the same time.
Hytale uses quaternion interpolation and wraps looping clips. For full turns use intermediate orientations with less than 180 degrees between keys, and preview the direction and loop seam. Native UV-offset channels exist, but the current MCP family has no dedicated UV-offset-keyframe tool.
The upstream `.blockyanim` exporter writes `holdLastKeyframe`, and maps Catmull-Rom to smooth and other interpolation to linear. The editor's `once`, step or Bezier state therefore does not establish equivalent runtime playback. Verify the actual export and target behavior. These details come from the [animation codec source](https://github.com/JannisX11/hytale-blockbench-plugin/blob/main/src/blockyanim.ts).
## Validation and Export
1. Inspect UV/bitmap dimensions, texture assignments, stretch and geometry in relevant poses.
2. Run `hytale_validate_model`, then inspect its issues and `scope`. The current implementation counts nodes in the installed `blockymodel` compiler's main-model output and checks that both texture dimensions are positive multiples of 32. It reports `main_model_node_count_and_texture_dimensions`; attachments and full engine compatibility need separate checks. Older bundles used heuristic node counts and incorrect density-based texture checks, so discover/reload the current build before relying on this result.
3. Discover `list_export_formats`; use the registered `blockymodel` codec for an intended model export. The texture image is a separate deliverable.
4. Export animations through the installed plugin's native animation workflow. Upstream provides the `export_blockyanim` action; do not invent a `blockyanim` model codec when discovery does not return one. Complete any resulting native save dialog through the authorized UI workflow.
5. Reopen a copy or inspect the runtime asset when available. Report whether texture, attachment, shading, interpolation and loop behavior were actually checked in Hytale.
Resources include `hytale://format`, `hytale://attachments/{id}`, `hytale://pieces/{id}`, and `hytale://cubes/{id}`. Technical references checked 2026-09-13; the running Hytale plugin version remains authoritative for available behavior.
© jasonjgardner · Apache-2.0 · jasonjgardner/blockbench-mcp-project