Catalyst MCP for FiveM
Provides tools for building GTA V particle effects (.ypt) for FiveM, including searching and indexing vanilla effects, merging and editing effects, packing and validating .ypt files, and installing them into a FiveM resource's stream folder with Lua usage instructions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Catalyst MCP for FiveM Make me red and gold confetti particle effects for a halftime show"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Catalyst MCP for FiveM
An MCP server that lets Claude, or any MCP client, build GTA V particle effects (.ypt) for FiveM.
You describe the effect, it finds a vanilla one to start from, edits it and gives you a dictionary you can stream.
No editor window, no running game.
Unofficial. Not affiliated with Rockstar Games or Cfx.re. See NOTICE.md.
Contents: What a session looks like · Quick start · Tools · How it works · Troubleshooting · License
What a session looks like
"Make me confetti in red and gold for a halftime show."
The assistant searches the effects in your own GTA V install:
ptfx_vanilla_search query: "confetti"
5 hits
scr_man_col scr_man_col_confetti 2 emitters
scr_man_col scr_man_col_confetti_gold 2 emitters
scr_sb_col scr_sb_col_confetti 1 emitter
scr_sb_col scr_sb_col_confetti_gold 1 emitter
scr_xs_celebration scr_xs_confetti_burst 1 emitterpicks one, copies it into a new dictionary and makes a second colour from it:
ptfx_merge scr_xs_celebration / scr_xs_confetti_burst -> my_fx / my_confetti_red
ptfx_edit duplicated effect my_confetti_red -> my_confetti_gold
tint my_confetti_red min [200,20,30]
tint my_confetti_gold min [255,190,40]then builds the file and reads it back to check it:
ptfx_pack my_fx.ypt 2,384 bytes read back: identical, 0 differences
ptfx_install resources/my_halftime/stream/my_fx.yptand you play it in game:
RequestNamedPtfxAsset("my_fx")
while not HasNamedPtfxAssetLoaded("my_fx") do Wait(0) end
UseParticleFxAssetNextCall("my_fx")
StartParticleFxNonLoopedAtCoord("my_confetti_gold", x, y, z, 0.0, 0.0, 0.0, 1.0, false, false, false)These are real results from a run against a Legacy install, shortened for reading.
Related MCP server: Expose
Quick start
You need Windows, GTA V Legacy (Steam, Epic or Rockstar Games Launcher), Node.js 20+ and the .NET 8 SDK.
git clone --recurse-submodules https://github.com/Geckomacabre/Catalyst-MCP-Server-for-FiveM.git
cd Catalyst-MCP-Server-for-FiveM
npm install
npm run build
npm run build:helperAdd it to Claude Code:
claude mcp add catalyst-fivem -s user -- node C:/path/to/Catalyst-MCP-Server-for-FiveM/dist/index.jsThen ask for an effect. The first time, the assistant runs ptfx_vanilla_index. This takes a few minutes:
it reads the effects out of your game files and caches them locally.
Add this to the client's MCP config:
{
"mcpServers": {
"catalyst-fivem": {
"command": "node",
"args": ["C:/path/to/Catalyst-MCP-Server-for-FiveM/dist/index.js"]
}
}
}The GTA V folder is found automatically (from the registry and the usual install folders). If it isn't, set
GTAV_PATH, or pass game to ptfx_vanilla_index.
Tools
Tool | What it does |
| Indexes every vanilla effect in your install, once |
| Finds effects by name, asset or texture |
| Gives the path to a cached vanilla |
| Lists a dictionary's effects, emitters, particles, textures and models |
| Builds a new dictionary from effects in other dictionaries |
| Changes values, keyframes, colours, names and textures |
| Builds the |
| Turns a |
| Copies the |
| Opens a |
ptfx_vanilla_index: takes a few minutes, once. When an effect exists in several archives it keeps the newest copy (DLC, then patch, then base;ptfx_hifirst).ptfx_info: duration, loops and emitter/particle pairs per effect; spawn rate, life and domains per emitter; shader, behaviours, textures and colour keys per particle. Withdetailit lists every keyframed property.ptfx_merge: everything the chosen effects use comes with them: emitters, particles, chained effects, textures and models. Effects can be renamed on the way in.ptfx_editoperations:set: a single valuekeys: replace a keyframed property's keysscale: multiply a value or keysrename,duplicate,deletetint: an effect's colour tinttexture: your own.dds, or one of the game'scoretexturesdict_name: rename the dictionary
ptfx_pack: the built file is turned back into XML and compared rule by rule, so you know it is what you asked for.catalyst_open: the same as double-clicking the file. Use it to preview; Catalyst is also the way to export for GTA V Enhanced.
How it works
The server is TypeScript (src/). A small .NET helper (helper/) built on
CodeWalker.Core converts .ypt files to and from XML and reads the game's
archives. All editing happens on that XML, and the server writes it out byte for byte the way CodeWalker does.
The archive keys come from your own
GTA5.exe, as CodeWalker does it. Nothing is written into the game folder, and no game files are included in this repo.Builds are Legacy (gen8), the format FiveM streams. For Enhanced (gen9), open the result in Catalyst and export from there.
Dictionary entries are stored sorted by name hash, so builds are compared by rule name, not position.
RefCountis 1 + the number of references, matching Rockstar's files.KeyframeTime.yis 1 / (t − t_prev).Floats are float32.
Textures with
ExternalReference=1come from the game'scoreeffects, by name.
Variable | Default | |
| found automatically | your GTA V folder |
|
| the vanilla index and its cached files |
|
| the CodeWalker helper |
|
| Catalyst, for |
Troubleshooting
GTA V (Legacy) folder not found: setGTAV_PATHto the folder that containsGTA5.exe.that is GTA V Enhanced: the index reads Legacy, which is what FiveM runs. Point it at a Legacy install.ptfx-helper not found: runnpm run build:helper. It needs the .NET 8 SDK, not only the runtime.no vanilla index yet: runptfx_vanilla_indexonce. The assistant usually does this on its own.not a FiveM resource folder:ptfx_installwants the resource's own folder, the one withfxmanifest.luain it.An empty
vendor/codewalkerfolder: you cloned without submodules. Rungit submodule update --init.The effect doesn't show in game: the name in
RequestNamedPtfxAssetmust match the.yptfile name, and the resource must be started.
Tests
npm testThe test needs one vanilla .ypt: build the index first, or point PTFX_TEST_YPT at one. It checks the XML round
trip, a vanilla rebuild, merge, edit, pack and the MCP protocol.
License
Available Tools
10 toolscatalyst_openA
Open a .ypt in Catalyst (Cfx.re's particle editor), if it is installed, to preview it - the same as double-clicking it. Uses Catalyst's own file association (--import). Catalyst opens in front of other windows.
Inputs: ypt (required).
ptfx_editA
Edit a .ypt.xml (in place or to out). ops, applied in order: {op:'set', kind, name, path:'DurationMax' | 'CreationDomainObj/DomainType' | 'AllBehaviours/Colour/RGBAMaxEnable' | 'EventEmitters/0/StartRatio', value}; {op:'keys', kind, name, prop:'ptxu_Colour:m_rgbaMinKFP', keys:[[t,x,y,z,w],...]} (t 0..1 over life/duration); {op:'scale', kind, name, prop:'ptxEmitterRule:m_spawnRateOverTimeKFP', factor: f | [fx,fy,fz,fw]}; {op:'rename'|'duplicate'|'delete', kind, name, to}; {op:'tint', name: effect, min:[r,g,b,a], max:[r,g,b,a]}; {op:'texture', name: particle, texture, var:'diffusetex2', external: bool, dds: path to your own .dds}; {op:'dict_name', to}. kind defaults to particle. ptfx_info detail=true lists the prop names.
Inputs: ops (required), xml (required), out.
ptfx_infoARead-only
Summarise a particle dictionary (.ypt or .ypt.xml): effects (duration, loops, emitter/particle pairs), emitter rules (domains, spawn rate, life), particle rules (shader, draw type, behaviours, textures embedded or from core, colour keys, chained effects), textures, drawables. detail=true adds every keyframed property and its keys.
Inputs: path (required), detail.
ptfx_installA
Copy a built .ypt into a FiveM resource's stream/ folder and return the Lua that plays an effect from it.
Inputs: ypt (required), resource_dir (required), effect.
ptfx_mergeA
Make a NEW dictionary from effects in other dictionaries (vanilla ones from ptfx_vanilla_search, or yours), copying each effect's emitter rules, particle rules, chained effects, embedded textures and model drawables. Core textures stay references. Clashing rule names get a numeric suffix. Writes .ypt.xml (+ textures): then ptfx_edit and ptfx_pack it.
Inputs: name (required), sources (required), out_xml.
ptfx_packA
Build a Legacy (gen8, resource v68) .ypt from a .ypt.xml and the .dds files in its sibling / folder. verify (default true) converts the result back and compares it rule by rule.
Inputs: xml (required), out, verify.
ptfx_unpackA
Convert a .ypt to CodeWalker XML: <out_dir>/.ypt.xml plus its embedded textures in <out_dir>//*.dds.
Inputs: ypt (required), out_dir.
ptfx_vanilla_getCRead-only
The cached .ypt (and its XML) of a vanilla asset, e.g. 'scr_xs_celebration'.
Inputs: asset (required).
ptfx_vanilla_indexA
Build (once; a few minutes) the index of every vanilla effect in your own GTA V Legacy install: reads the game's archives (keys come from your GTA5.exe; nothing is written to the game folder) and caches the best copy of each .ypt (DLC > patch > base, ptfx_hi preferred). game: the folder with GTA5.exe (auto-detected if omitted). refresh rebuilds.
Inputs: game, refresh.
ptfx_vanilla_searchARead-only
Find vanilla effects by words in the effect, asset or texture names, e.g. 'confetti', 'firework burst', 'spark', 'flame'. Returns asset, effect, loops, textures and the cached .ypt.
Inputs: query (required), limit.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool maps to a distinct step of the particle-dictionary pipeline (unpack/pack/edit/merge/info/install), so pairwise confusion is low. The only soft overlap is ptfx_vanilla_search, which already returns the cached .ypt that ptfx_vanilla_get also returns, plus ptfx_info vs ptfx_unpack both surfacing dictionary contents.
Nine of ten tools use a consistent ptfx_ snake_case verb-or-noun suffix pattern. catalyst_open breaks the prefix convention and inverts to noun_verb, a minor but visible deviation.
Ten tools is well within the sweet spot and every one earns its place: the vanilla index/search/get trio, the unpack/merge/edit/pack authoring chain, install, and preview. No filler or redundant wrappers.
The surface covers the full lifecycle from vanilla discovery through merge, edit, pack with verify, install to a resource, and preview. Minor gaps: no tool to list or remove already-installed .ypt files from a resource, and no standalone validation/report tool outside ptfx_pack's verify flag.
Maintenance
Related MCP Connectors
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Build, run, schedule, and publish AI video pipelines to YouTube and TikTok from any MCP client.
Build, run and publish 3D games in the Zero engine from Claude Code, Cursor or Codex, over MCP.
Related MCP Servers
- AlicenseCqualityBmaintenanceEnables AI-powered control of Blender through natural language, allowing users to create, manipulate, and automate 3D scenes, objects, materials, animations, and more via Claude or other MCP clients.7165MIT
- AlicenseNot gradedqualityCmaintenanceEasily build MCP tools for Claude desktop app.132 npm21MIT
- FlicenseNot gradedqualityDmaintenanceA local MCP server that gives Claude Desktop full video editing capabilities via FFmpeg, Whisper, and yt-dlp.-
- AlicenseBqualityDmaintenanceAn MCP server that lets Claude read and edit CapCut desktop draft projects, enabling manipulation of video clips, text, audio, and images with atomic saves and validation.1719MIT