Cmdibuzz Commands
How to write custom commands with JSON configuration
Updated August 12, 2026
Command File Structure
Each command is a separate .json file in the commands/ directory. The filename (minus .json) becomes the command ID if not specified in the file.
config/cmdibuzz/commands/
├── discord.json
├── heal.json
└── welcome.json
Minimal Example
{
"id": "discord",
"command": "discord",
"type": "text",
"runcmd": ["text: <blue>Join our Discord: <aqua>discord.gg/example"]
}
This creates /discord that sends a message to the executor.
Full Command Definition
{
"id": "heal",
"command": "heal",
"type": "text",
"aliases": ["healme", "health"],
"register": true,
"override": false,
"permission": "cmdibuzz.heal",
"error-message": "<red>You cannot use this command right now.",
"cooldown-message": "<yellow>Please wait {remaining}s before using this command again.",
"cost_money": 10.0,
"cost_items": [
{ "material": "minecraft:emerald", "amount": 2 }
],
"cooldown_seconds": 60,
"trigger": "",
"arguments": [
{ "name": "player", "type": "player", "optional": false }
],
"runcmd": [
"text: <green>Healing $arg1...",
"delay: 40",
"run_command: /effect give $arg1 minecraft:regeneration 5 2",
"run_console: /say $player_name healed $arg1!"
]
}
Fields Reference
| Field | Required | Description |
|---|---|---|
id | Yes | Unique identifier for cooldown tracking and logs |
command | Yes | The command name (what players type after /) |
type | No | Fallback action type when no runcmd is provided; defaults to text |
aliases | No | Alternative command names |
register | No | Whether to register this command (default true) |
override | No | Replace an existing command with the same name (default false) |
permission | No | Required permission node (empty = default allowed) |
error-message | No | Message for blocked one-time-use, money-cost, or item-cost attempts |
cooldown-message | No | Message shown during cooldown; supports {remaining} seconds |
cost_money | No | Money cost to use the command |
cost_items | No | Array of item costs |
cooldown_seconds | No | Per-player cooldown in seconds |
trigger | No | Bind to an event (see Event Triggers) |
arguments | No | Argument definitions for the command |
roulette_commands | No | Array of weighted commands for the roulette action |
onetime_use | No | If true, each player can only use this once (default false) |
runcmd | See note | Array of action strings to execute in order |
Splitting Commands Across Files
You can split commands across multiple files and subfolders. Each file should contain a single command object (not an array). The filename becomes the command ID if no id field is set.
Command Names and Arguments
Literal words in command are separated by spaces. Placeholders in angle brackets become Brigadier arguments, and their names must match the entries in arguments:
{
"id": "random_pokeball",
"command": "random_pokeball <target>",
"arguments": [{ "name": "target", "type": "player" }],
"runcmd": ["roulette:"]
}
Use $arg1, $arg2, or $<name> in actions. Set optional: true to allow an argument to be omitted. An argument-level permission restricts only that argument path.