Tool catalog

Every tool grouped by area, with the gates that protect it.

Every tool input is a strict zod schema. Every tool output follows the envelope shape. Reflective dispatchers (*_call_*) apply a readonly verb gate (Get/Has/Is/Does/Can/Will/Network always allowed; others require agent_api_readonly=false).

Core (read)

ToolPurpose
healthLiveness probe + version + uptime
list_resourcesEvery registered resource with state
get_resource_stateOne resource's state + filesystem path
read_fileRead from any resource; offset + length for windowed reads of large files
list_dirList a resource's files/folders; recursive:true returns the file tree (skips node_modules / dot-dirs)
find_filesGlob a resource (server/**/*.lua, **/*.vue) matched against the path relative to its root
search_codeGrep a resource for a substring or regex; returns file/line/text. Scope with path; skips binaries
get_resource_manifestParse fxmanifest.lua into structured metadata (fx_version, game, version, script/files/dependency lists)
tail_consoleRecent lines from the in-memory ring buffer; filterable by since_ts or channel
scan_errorsScan the console for SCRIPT ERRORs / Lua tracebacks / JS exceptions → structured { message, frames: [{resource,file,line}] }; filter by resource / sinceTs
list_exportsA resource's exports (manifest-declared + runtime-enumerable) — discovery for call_export
call_exportInvoke any started resource's server export exports[resource][name](...args); readonly verb gate + agent_api_export_blocked_methods blocklist
server_metricsServer health snapshot: uptime, online players, resource counts by state, agent_api host process memory
list_pluginsLoader snapshot — which plugins enabled, which tools each added

Core (write + lifecycle)

ToolPurposeGated by
write_fileWrite inside a configured write rootreadonly
edit_fileSurgical str-replace in an existing file (unique-match guard, replaceAll) — cheaper/safer than a full rewritereadonly + write root + extension
multi_editApply many edits across several files of a resource in one call; validated in memory first, written all-or-nothingreadonly + write root + extension
delete_fileDelete one file (refuses directories and blocked segments)readonly + write root
move_fileMove/rename a file within a resource (createDirs, overwrite)readonly + write root + extension
wait_for_consoleBlock until a console line matches pattern (or timeoutMs); pair with ensure/restart to catch the banner or an error. matched:false on timeout is not an error
create_resourceScaffold fxmanifest.lua + server.lua + README.mdreadonly
refresh_resourcesExecuteCommand("refresh") + capture windowACE command.refresh
ensure_resourceensure <name>, wait for state started, return logsACE + per-resource lock
start_resource / stop_resource / restart_resourceLifecycle verbsACE + lock + self-target guard
run_commandAllowlisted console command (refresh, players, say <text>, lifecycle verbs)ACE + parsed allowlist
run_shellAllowlisted shell binary inside a resource folder (on Windows it spawns through a shell so .cmd shims — npm/npx/vite — run, and rejects shell metacharacters in args). Bundled rtk is allowlisted; useRtk:true wraps the command as rtk <command> <args> for compressed output. Output keeps the first + last 32 KB per streamreadonly + shell allowlist + sandboxed cwd

Live player testing

The opt-in chat command /agent_test_optin lets a player join the test subject pool. TTL: agent_api_test_session_ttl_seconds. Pool size: agent_api_test_max_subjects.

ToolPurpose
list_playersOpted-in players with TTL countdown + active-subject flag
register_test_subjectMove opted-in player into the active pool
unregister_test_subjectRemove from active pool (opt-in preserved)
get_player_stateRun predefined client probes (entity, ped, meta, optional inventory)
trigger_client_eventFire any net event at one subject
send_chatPush a chat:addMessage line to one subject
wait_for_client_eventBlock until matching net event (optional fromSubject filter)

Dynamic natives

Run any FiveM native by name. Read-only verbs always pass; mutators need readonly=false; some natives are hard-blocked.

ToolPurpose
server_call_nativeInvoke any server-side global function by name; hard-blocks DropPlayer/ExecuteCommand/StopResource/StartResource/BanPlayer/etc
server_list_nativesEnumerate server global function names; filter by substring
client_call_nativeInvoke any client native on one active subject. Special arg tokens $ped, $player, $serverId, $vehicle, $lastVehicle, $coords, $heading are resolved client-side
client_list_nativesEnumerate client global function names on the subject

NUI screenshots

ToolPurpose
screenshot_nuiCapture the FiveM CEF NUI via CDP at http://localhost:13172. mode = isolate | clip | full. With resource + default isolate, hides sibling iframes for a clean capture and restores them after
delete_screenshotRemove a screenshot under dist/screenshots/ (sandboxed)

NUI interaction

Drive the live NUI over the same CDP connection (no Playwright). Pass resource to target that resource's iframe — the tool resolves that frame and evaluates inside an isolated world, so selectors hit the resource's own DOM even though it's a cross-origin iframe of the CEF root page. The NUI must be open.

ToolPurpose
nui_evalRun a JS expression in the NUI and return its value (returnByValue)
nui_clickClick a DOM element by CSS selector; returns { found }
nui_fillSet an input/textarea value and dispatch input/change (Vue/React-safe)
nui_getRead an element's text / value / bounding rect / outerHTML

ESX plugin

Detects es_extended. Always exposes:

ToolPurpose
esx_list_playersAll online ESX players (identifier, money, accounts, job)
esx_get_playerSnapshot one xPlayer by server id
esx_list_shared_methodsDiscover every callable method on the ESX shared object
esx_list_player_methodsDiscover every method on a specific xPlayer (e.g. getInventory)
esx_call_sharedReflective: call ESX.<method>(...args)
esx_call_playerReflective: call xPlayer.<method>(...args)

With readonly=false, also:

ToolPurpose
esx_add_moneyAdd to a money account (cash / bank / black_money)
esx_set_jobAssign job + grade

ox_lib plugin

Detects ox_lib. Uses @overextended/ox_lib/server for typed access.

ToolPurpose
oxlib_notifyPush an ox_lib UI notification to one player
oxlib_trigger_client_callbackRound-trip request/response via lib.callback
oxlib_check_dependencyversionCheck("resource@x.y.z")
oxlib_list_methodsEnumerate exported functions + namespaces
oxlib_callReflective dotted-path invocation (addAce, cache.serverId, etc.)

oxmysql plugin

Detects oxmysql. Uses @overextended/oxmysql for typed access. Defaults to SELECT-only; expand via agent_api_plugin_oxmysql_readonly=false and agent_api_plugin_oxmysql_allow_statements.

ToolPurpose
oxmysql_queryoxmysql.query returning a rows array (auto-trimmed to rowLimit, default 100)
oxmysql_scalaroxmysql.scalar returning the first column of the first row
oxmysql_executeoxmysql.rawExecute for INSERT/UPDATE/DELETE/DDL when allowed
oxmysql_schemaRead-only information_schema introspection: tables → columns (name, type, key, nullable, default). Scope with table
oxmysql_migrateRun a DDL statement (gated like oxmysql_execute) and optionally return the resulting table schema via verifyTable

Workflow / meta

ToolPurpose
scaffold_fivem_resource_workflowMandatory pre-flight for new-resource intent. Returns the full grill workflow text. Engineered description so the agent auto-calls it before create_resource / write_file
list_preferencesThe user's saved development preferences (structure / coding / ui-design) + optional example folder each points at. The grill calls this first; a reminder is auto-injected into create_resource / scaffold_fivem_resource_workflow results. Managed from the dashboard Preferences tab
list_skillsUser-uploaded custom skills with their trigger tools/categories and markdown body. A matching skill is auto-injected into the result of any tool call it's bound to. Managed from the dashboard Skills tab

Work tracking

A per-resource task board the agent publishes for a human to watch, plus a queue of human-issued requests aimed back at the agent. Surfaced in the dashboard Sessions tab. Safe in readonly mode (writes only dashboard state).

ToolPurpose
track_workSet the current task and/or todo list for a resource's session. A session is auto-seeded when create_resource runs
track_getRead one session (by resource) or all sessions — useful to recover the plan after a context reset
get_requestsList pending dashboard requests ({ id, resource, path|null, prompt }; all:true for history). A null path targets the whole resource. Pending count is auto-injected into other tool results so the agent notices them
resolve_requestMark a request done, with an optional note