Custom Commands
Custom commands let you create your own prefix-triggered commands (like?hello or !rank) that respond with dynamic text, embeds, reactions, direct messages and more.
Every response is powered by TagScript — a small, easy-to-learn templating language. A response can be as simple as a line of plain text, or as advanced as a mini program with variables, conditions, randomness and math.
Creating a Command
- Select Custom Commands from the sidebar and click Create Command.
- Fill in the fields:
- Name — the command word typed after the prefix, e.g.
helloruns as?hello. Stored in lowercase. - Aliases — optional alternative names that trigger the same command (e.g.
rank,level,lvl). - Response — the TagScript that runs when the command is used. This is the heart of the command.
- Save. Your command is live instantly.
A name or alias can only belong to one command per server. If you try to reuse a name that another command already owns, saving fails.
AI Command Assistant
The command editor includes an AI assistant powered by Gemini. Describe what the command should do in plain language, then select Generate. The result opens in TagScript mode so you can review and test it before saving. The assistant receives the same variables, functions and examples shown in the TagScript catalogue. MurFFy validates the generated response and rejects unknown or malformed tags before placing it in the editor. Each user can generate one command every seven days. Failed AI requests do not use the weekly generation. If the shared AI quota is unavailable, the editor shows a temporary service-unavailable message and you can try again later.Prefixes
By default, custom commands are triggered with the? prefix, so a command named hello runs as ?hello.
You can change or add prefixes under Custom Commands → Settings. When several prefixes could match, the longest one wins (so !! is matched before !).
Prefixes cannot contain spaces.
How TagScript Works
Anything you type in the response is sent back as-is, except for tags wrapped in curly braces{}. Tags are replaced with real values or perform an action when the command runs.
A tag has up to three parts:
Tags can be nested — the inside is resolved first:
mafi, this outputs MAFI.
The Pipe |
Many tags use the pipe character | to separate several values or “branches”, for example the true/false branches of {if} or the options of {choose}. If you need a literal | in your text, escape it as \|.
Escaping Special Characters
To output a character that TagScript treats specially, put a backslash\ in front of it: \{, \}, \(, \), \|, \:, \\.
Use {user} to mention someone.
Variables
Variables are replaced with information about the user, server, channel or the arguments they typed. Most accept a property in parentheses to pick exactly what you want.
Examples
?boop @friend.
Conditionals & Logic
Make the response react to what the user typed.{if(condition):then|else}
Outputs the first branch when the condition is true, and the branch after | when it is false (the else branch is optional).
Conditions support the comparators ==, !=, >, <, >=, <=. Numbers are compared as numbers; anything else is compared as text. A condition with no comparator is true unless it is empty, false, 0, no or none.
Combining conditions
Utilities
Helpers for text, numbers and randomness.
Examples
Custom Variables
Store a value once and reuse it, which keeps complex commands readable and avoids repeating expensive tags.Variable names are stored in lowercase and only exist for the duration of a single command run.
Embeds
Build a rich embed by setting one property per{embed(...)} tag. All the tags in a response combine into a single embed.
Named colors:
red, green, blue, yellow, orange, purple, blurple, white, black, gold, pink, gray.
Economy
Economy tags connect a custom command to the server’s configured currencies and inventory. They only work while Economy is enabled for the server.Reading balances and items
The
account in {balance} can be wallet, bank or total. Its output format can be:
formatted— exact amount with the configured currency symbol, such as🪙 1,250;decimal— display amount without the symbol, respecting the currency’s decimal places;raw— integer base units stored by the ledger.
user selector can be self, target, a Discord mention or a user ID. target means the first user mentioned in the command arguments.
Currency properties: key, name, plural, symbol, decimals, transferable, tradable, bankable, maxwallet.
Item properties: key, name, description, emoji, rarity, type, usable, tradable, sellable, giftable.
Currency and item operations
Operations returntrue when they succeed and false when they cannot be completed. Put them inside {if} to show the correct response without guessing the result.
currency is optional and defaults to the server’s default currency. A reward cooldown is mandatory and must be between 60 seconds and 7 days. The optional bucket lets several reward tags or commands share the same per-user cooldown.
Actions
Actions change how the response is delivered. They print nothing where you write them, so you can place them anywhere in the response.Restrictions
Restrictions decide who and where a command can be used. If a restriction fails, the command stops. If you provide a reason, it is shown to the user; otherwise the command fails silently.
Roles and channels can be given as a mention (
@Staff, #logs), an ID, or a plain name.
Worked Examples
Simple
Hello — a friendly greeting
Hello — a friendly greeting
Coinflip
Coinflip
Roll — a dice roll
Roll — a dice roll
Boop — mention another user
Boop — mention another user
?boop @friend.Avatar
Avatar
Complex
8-ball with input validation
8-ball with input validation
Reward — math, variables and a cooldown
Reward — math, variables and a cooldown
daily bucket.Staff announcement to another channel
Staff announcement to another channel
#announcements (with pings enabled), and stays silent in the channel where it was typed.Suggestion box with reactions
Suggestion box with reactions
#suggestions, and adds vote reactions.Tier lookup with nested conditions
Tier lookup with nested conditions
{if} tags to pick a tier and a matching color from a number.Good to Know
- Responses are limited to 2000 characters (Discord’s message limit). Longer output is trimmed.
- A single command has an execution budget (a maximum number of tags and nesting depth) to keep things fast — normal commands never come close to it.
- If a tag can’t be resolved, it is shown back as plain text so you can spot the typo.
- Custom commands respect the Allowed / Ignored roles and channels you set on the command itself, in addition to any
{require}/{blacklist}tags in the response.