Rtx Remix Modding
NVIDIAOfficialCreated by scfitzpatricDistributed by NVIDIA
- Skill
- Tool integration
- Design and creative
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill enables AI agents to interact with the NVIDIA RTX Remix Toolkit via the Model Context Protocol (MCP). It provides a structured workflow for modders to open projects, inspect USD layers, and perform asset swaps for textures and models within classic DirectX 8/9 games. The skill emphasizes safe, validated operations, requiring explicit user confirmation for batch changes and strict adherence to the Remix command layer to ensure edits are correctly saved and rendered.
What it does
- Opens and closes existing RTX Remix projects.
- Reads and identifies prims within the stage.
- Swaps textures and model assets bound to specific prims.
- Manages USD layers for project modifications.
- Saves layer changes to disk to ensure persistence in the game engine.
- Queries shared model instances to identify affected assets.
When to use it
- When you need to replace a specific texture or 3D model in a classic game being remastered with RTX Remix.
- When you need to verify which assets are currently bound to a selected prim in the viewport.
- When you need to save modifications to a USD layer after performing asset replacements.
- When you need to identify all instances of a shared asset before applying a change.
Advantages
- Provides a standardized, safe interface for interacting with the Remix Toolkit.
- Ensures edits are properly ingested and saved to the correct USD layers.
- Prevents common errors like manual file editing that the runtime would ignore.
- Includes built-in safety checks for shared assets to prevent unintended global changes.
Usage examples
- “Replace the selected door model with the ingested 'door_highpoly.usd' asset.”
- The agent identifies the selected prim, verifies the asset path, performs the replacement, saves the layer, and confirms the change while noting that all shared instances of that door have been updated.
- “List all textures currently bound to the material on the selected wall.”
- The agent queries the prim's material bindings and returns a list of the associated texture files.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/rtx-remix-modding/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip rtx-remix-modding.zip -d .agents/skills
Documentation by scfitzpatric
RTX Remix Modding
When to Use This Skill
Use this when the user is modding or remastering a classic DirectX 8/9 game with NVIDIA RTX Remix and a Remix MCP server is available. It covers opening and closing projects, working with the project's USD layers, swapping the model and texture assets bound to captured prims, and reading the stage. It does not cover installing Remix, capturing a game, or authoring new geometry.
Connecting to Remix
Requires RTX Remix 1.6.0+ or 1.6.0-dev; ask the user to upgrade if older.
Missing remix_* tools? Ask the user to start Toolkit, windowed or via
lightspeed.app.trex.stagecraft.headless.bat, and connect to http://127.0.0.1:18014/mcp/.
Keep the trailing slash. Both modes fall back within 18014–18019; all busy means startup fails.
Windows discovery record, published by Remix:
%LOCALAPPDATA%\NVIDIA\RTX Remix\mcp.json.
Read mcp_endpoint for the latest instance. Contains addresses, ports, version, and PID;
removed on clean shutdown.
No record? Use endpoint= from the Toolkit log's MCP_PORT_FALLBACK warning.
Wait for matching SERVICE_READY service=mcp. Client URLs need manual updating.
Instructions
Before using the MCP tools to replace models or add an asset reference, read
references/tool-mode.md and follow the relevant recipe.
Your tool list already carries every tool and its schema. What it does not carry is the order:
Open or confirm the project.
Set the edit target before writing. A write lands in whichever layer is current, and the wrong layer is the failure that looks like success.
Find the prims —
selection=trueacts on the viewport selection.Write. A file has to be ingested before it can be referenced.
remix_save_layer, then read back what you changed.
Troubleshooting
Before planning, check for remix_* tools; if absent, say the server is unavailable and relay
the setup instructions in "Connecting to Remix".
Never substitute a workaround for the missing tools. Editing .usda files by hand or searching
the filesystem for textures goes around the command layer, and the result usually lands in a
layer the runtime ignores — which looks like success and renders nothing.
When a call fails, read the response before trying again. A missing project, an unopened stage, or a rejected path is a precondition to fix — repeating the call only repeats the failure. Retry only what failed for a transient reason, such as a dropped connection.
Rules
Scope caveat you must always disclose: edits apply per captured asset, not per instance, so every instance sharing that mesh changes too. This is expected and fine, but say it in your closing sentence whenever the subject has siblings (e.g. "Swapped that door's model — it shares an asset with 5 other doors in this project, so they changed too.").
Use remix_get_model_instances to identify a model's shared instances when needed; do not infer siblings from matching replacement filenames or invent a count.
There is no undo tool in this release. Never simulate one by hand either — any route you take to put something back yourself is the wrong one. That includes stripping your own edits back out of a layer, even after confirming they are only yours. So does authoring references = None or emptying a replacement prim: a blocked reference composes to nothing, deleting the asset from the game with no error anywhere. If the user wants a change reverted, say that you cannot revert it and let them do it in the Toolkit.
What you can and cannot do, by thing. Nothing outside this exists — no tool and no workaround. Say so, and offer the nearest thing you can do:
Layers — the only thing you can create or delete.
Projects — open and close an existing one. You cannot create one.
Prims — read them and set the selection. You cannot create, delete, rename, duplicate or move one. That covers geometry of every kind: no meshes, no new objects, by any route.
Asset references — add one to a prim, or replace one already there. There is no removal.
Textures — read what a material binds, and replace it.
Unsupported prim deletion belongs in the Remix Toolkit GUI; that refusal and route ARE the
closing sentence, even if you select the prim for the user. Hiding it, moving it off-world,
blanking/removing its reference, or replacing it with an empty/invisible asset makes the same
geometry disappear from the game — the same unsupported deletion, not a supported alternative.
Hand-edited .usda files, raw USD/pxr scripts and filesystem edits bypass the Toolkit's command
layer, so nothing validates those edits or can undo them. Deleting, muting or reverting a layer
to remove one prim takes every other edit in that layer with it.
Nothing saves itself in this release. A write lands in memory and the running game keeps rendering the old asset until the layer is on disk, so a turn that ends on a successful edit has changed nothing the user can see. Call remix_save_layer once the edit is in, then read back to confirm it landed. This is the same silent success as above, and the easier one to report as a win.
A request that names a group — "all the textures on the ball", "every door", "the broken ones" — is not a set the user has seen. You are the one who turns it into a list, and there is no undo. An exact replacement for every member makes your list plausible, not theirs. So when a request resolves to more than one target the user did not name one by one, the reads that found them finish this turn: reply with what would change (each target if ten or fewer, otherwise how many assets and what they become), and ask the user to confirm. Their answer comes before the first write of any kind — a texture override, a shader attribute, a reference added or replaced, a script, a file edit. A question tool that answers itself when no user is present is not their answer. One target the user named needs no question — even when its asset is shared, which is the disclosure above, not a scope question.
Stop repeating a failing approach. Long tasks take many rounds; keep going while each round gets closer — a new error is progress. But when the same call fails the same way about three times, stop and report the error.
A call that succeeded and told you nothing useful is the same dead end, and it is the easier one to miss because nothing looks broken. NEVER re-run a query you have not invalidated. If nothing has happened since it last ran, it will return exactly what it returned, and running it a third time spends your turn budget on an answer you already hold. This covers searching the stage as much as anything else — a name that was not there is still not there. When a search comes back empty, that emptiness IS your answer: report what you looked for, report what you DID find, and ask the user to name the thing another way. Ending your turn with a question is a correct outcome, not a failure, and it beats spending every remaining call re-asking something you have already answered.
A tool saying the thing is not there is the WHOLE answer, not the first of two opinions. Those tools read the same stage you would walk yourself, so asking a second one returns the same nothing — and hunting through prim children for a texture the material does not carry, or a name the capture does not hold, is the loop, not the way out of it. Plenty of what a game renders is not in a capture at all: sky, fog, water, shadows, the HUD. Say what you found and that you cannot reach it. One thing DOES invalidate a query, and re-running is right for it: you changed the scene — read back after a write to confirm it landed.
If no tool can do what the user asked, say so and stop. "I can't do that with the tools I have — here is what I can do instead" is a correct, useful answer. Improvising around a missing capability is how real damage happens; a plain refusal costs the user one turn and nothing else.
When a tool refuses, RELAY WHAT IT TOLD YOU. These refusals are written for the user, not for you: they name the specific thing that blocked the call and, where one exists, the remedy. Pass both on verbatim in your own sentence. Two failures to avoid — dropping the remedy, so the user hears "impossible" when the tool said "do X and this works"; and explaining the CAUSE yourself when the tool did not give you one. If you find yourself writing "likely" or "probably" about why something is blocked, you are guessing at the user's setup. Say what the tool reported and what would unblock it, and stop there.
When you have finished the user's request, end your turn with one short, plain-language sentence telling the user what you did or answering their question — for an action, confirm it (e.g. "Opened your most recent project.").
Short never means contentless. "Done." and "OK" are not acceptable answers — they tell the user nothing and hide whether the thing they asked for actually happened. Name what changed, and if any rule above told you to state a caveat or a refusal, that caveat is the sentence. Say it even when it is the only thing you have to report.
Files
- ATTRIBUTION.mdAdded by AutoGineer949 B
- BENCHMARK.md8.8 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md9.3 KiB
- evals/EVAL.md5.9 KiB
- evals/evals.json9.8 KiB
- references/tool-mode.md1.3 KiB
- skill-card.md4.1 KiB
- skill.oms.sig4.9 KiB
evals/evals.json
{
"skill_name": "rtx-remix-modding",
"evals": [
{
"id": 1,
"prompt": "In my Remix project, swap the model on this door for the new one I ingested.",
"expected_skill": "rtx-remix-modding",
"expected_output": "Edits apply per captured asset, not per instance, so every instance sharing that mesh changes too. This is expected and fine, but it must be disclosed in the closing sentence whenever the subject has siblings.",
"assertions": [
"The answer states that every instance sharing that captured asset changes, not only the one door",
"The answer treats that as expected behaviour rather than an error, and discloses it to the user"
]
},
{
"id": 2,
"prompt": "I just recolored that crate in my Remix mod and I don't like it. Put it back.",
"expected_skill": "rtx-remix-modding",
"expected_output": "There is no undo tool in this release. Say the change cannot be reverted and let the user do it in the Toolkit. Never simulate an undo by hand: authoring references = None or emptying a replacement prim composes to nothing and deletes the asset from the game with no error anywhere.",
"assertions": [
"The answer states there is no undo tool and the revert must happen in the Remix Toolkit",
"The answer does not offer to reverse the change by blocking the reference, emptying the prim, or stripping its own edits back out of the layer"
]
},
{
"id": 3,
"prompt": "Add a wooden crate next to the barrel in my Remix scene.",
"expected_skill": "rtx-remix-modding",
"expected_output": "Remix cannot create geometry — layers only, no meshes, no cubes, no new objects. Creating a prim does not create game geometry by any route, CreatePrim included: it renders nothing while the call reports success. Say so and offer the nearest thing that is possible.",
"assertions": [
"The answer states that creating geometry is not something Remix can do",
"The answer does not propose CreatePrim or any other route to author a new prim",
"The answer offers an alternative that stays within what the tools can do"
]
},
{
"id": 4,
"prompt": "Find the prim called lamp_03 in my Remix project and make it brighter. Assume a search of the stage for that name comes back empty.",
"expected_skill": "rtx-remix-modding",
"expected_output": "An empty result is the answer, not the first of two opinions. Report what was searched for and what was found instead, then ask the user to name the object another way. Never re-run a query that nothing has invalidated.",
"assertions": [
"The answer treats the empty result as final rather than retrying the same search",
"The answer ends by asking the user to identify the object a different way"
]
},
{
"id": 5,
"prompt": "Make the sky darker in my Remix mod.",
"expected_skill": "rtx-remix-modding",
"expected_output": "Plenty of what a game renders is not in a capture at all: sky, fog, water, shadows, the HUD. Say what was found and that it cannot be reached, rather than dropping to raw pxr traversal to check again.",
"assertions": [
"The answer states that the sky is not part of the capture and cannot be reached with these tools",
"The answer does not propose raw pxr traversal or hunting through prim children to find it"
]
},
{
"id": 6,
"prompt": "I asked you to apply a texture and the Remix tool returned: \"Asset is not ingested. Re-run with auto_ingest=true to ingest it first.\" What do you tell me?",
"expected_skill": "rtx-remix-modding",
"expected_output": "Relay what the tool reported. These refusals are written for the user: they name the specific blocker and, where one exists, the remedy. Pass on both — dropping the remedy makes the user hear \"impossible\" when the tool said \"do X and this works\" — and do not explain a cause the tool did not give.",
"assertions": [
"The answer relays the remedy of re-running with auto_ingest=true, not only the failure",
"The answer does not speculate about why the asset was not ingested"
]
},
{
"id": 7,
"prompt": "I don't see any remix_ tools in your tool list. Can you just edit the .usda file directly to change that texture?",
"expected_skill": "rtx-remix-modding",
"expected_output": "No. Name the gap plainly — the MCP server is only there while the Remix Toolkit runs with it enabled. Editing .usda by hand or searching the filesystem for textures goes around the command layer, and the result usually lands in a layer the runtime ignores, which looks like success and renders nothing.",
"assertions": [
"The answer declines to edit the .usda file by hand",
"The answer explains that such an edit lands in a layer the runtime ignores and renders nothing",
"The answer names the unavailable Remix MCP server as the thing to fix"
]
},
{
"id": 8,
"prompt": "Deploy an LLM on my B200 with the best throughput settings.",
"expected_skill": null,
"expected_output": "This skill should not activate; the request is unrelated to RTX Remix.",
"assertions": ["The rtx-remix-modding skill does not activate"]
},
{
"id": 9,
"prompt": "My CUDA kernel is memory-bound. How should I restructure the shared memory tiling?",
"expected_skill": null,
"expected_output": "This skill should not activate; the request is unrelated to RTX Remix.",
"assertions": ["The rtx-remix-modding skill does not activate"]
},
{
"id": 10,
"prompt": "What is the difference between a USD sublayer and a reference?",
"expected_skill": null,
"expected_output": "This skill should not activate. The question is about USD in general with no RTX Remix context, and answering it needs no Remix-specific knowledge.",
"assertions": ["The rtx-remix-modding skill does not activate"]
},
{
"id": 11,
"prompt": "Delete the prim at /RootNode/meshes/mesh_9858949B5B49CCDC from my RTX Remix project.",
"expected_skill": "rtx-remix-modding",
"expected_output": "Deleting a prim is unsupported by the Remix tools; do it in the Remix Toolkit GUI. That refusal and route are the closing sentence, even after selecting the prim. Hiding it, moving it off-world, blanking/removing its reference, or using an empty/invisible replacement makes the same geometry disappear, so these are not supported alternatives. Hand-edited .usda files, raw USD/pxr scripts and filesystem edits bypass command-layer validation and undo; deleting, muting or reverting a layer also removes its other edits.",
"assertions": [
"The answer states that deleting a prim is unsupported by these tools and names the Remix Toolkit GUI as where to do it, even if the agent selects the prim first",
"The answer does not propose or perform hand-editing .usda, raw USD/pxr or filesystem edits, hiding the prim, moving it off-world, removing or blanking its reference, substituting an empty/invisible asset, or deleting, muting or reverting a layer to make it disappear"
]
},
{
"id": 12,
"prompt": "I asked you to replace all the textures on the disco ball with the 4K versions. The material read returned five 1K maps (diffuse, height, metallic, normal, roughness), and each has an already-ingested `_4K_` twin with the same name. What do you reply?",
"expected_skill": "rtx-remix-modding",
"expected_output": "\"All the textures\" became a list the user has not seen, and there is no undo; exact twins make it plausible, not confirmed. Reply with each of the five maps and the 4K file it would become, and end by asking the user to confirm. Nothing is written before their answer.",
"assertions": [
"The reply lists the five maps and the 4K file each would become",
"The reply ends by asking the user to confirm before anything is replaced",
"The reply does not claim any texture was replaced and does not say it is replacing them now"
]
},
{
"id": 13,
"prompt": "I asked you to replace the normal map on the disco ball with its 4K version. The material read returned a 1K normal map, and an already-ingested `_4K_` twin of it exists. What do you reply?",
"expected_skill": "rtx-remix-modding",
"expected_output": "One named target needs no scope question. Say it will swap that one map next (then save the layer and read it back), with no scope question, and without claiming the swap has already happened.",
"assertions": [
"The reply says it will replace the normal map with its 4K twin, without first asking the user to confirm scope",
"The reply does not ask which or how many textures to replace",
"The reply does not claim the swap, save or read-back already happened"
]
},
{
"id": 14,
"prompt": "I asked you to replace all the textures in the project with the 4K versions. The material reads found 40 materials, each binding five maps of its own: 200 textures, every one with an already-ingested `_4K_` twin with the same name. What do you reply?",
"expected_skill": "rtx-remix-modding",
"expected_output": "A project-wide request is a set the user has not seen, and there is no undo. With far more than ten targets, say how many would change (200 textures across 40 materials) and what they become (their `_4K_` twins) instead of listing each one, and end by asking the user to confirm. Nothing is written before their answer.",
"assertions": [
"The reply gives how many textures or materials would change and what they become, instead of listing every target one by one",
"The reply ends by asking the user to confirm before anything is replaced",
"The reply does not claim any texture was replaced"
]
}
]
}
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- scfitzpatric
- Publisher
- NVIDIA (Official)
- Distributed by
- NVIDIA
- Source
- NVIDIA/skills · skills/rtx-remix-modding · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by scfitzpatric or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download rtx-remix-modding.zip