Slash commands
Commands are handled by the Gateway. Most commands must be sent as a standalone message that starts with /.
The host-only bash chat command uses ! <cmd> (with /bash <cmd> as an alias).There are two related systems:
-
Commands: standalone
/...messages. -
Directives:
/think,/verbose,/reasoning,/elevated,/exec,/model,/queue.- Directives are stripped from the message before the model sees it.
- In normal chat messages (not directive-only), they are treated as “inline hints” and do not persist session settings.
- In directive-only messages (the message contains only directives), they persist to the session and reply with an acknowledgement.
- Directives are only applied for authorized senders (channel allowlists/pairing plus
commands.useAccessGroups). Unauthorized senders see directives treated as plain text.
There are also a few inline shortcuts (allowlisted/authorized senders only): /help, /commands, /status, /whoami (/id).
They run immediately, are stripped before the model sees the message, and the remaining text continues through the normal flow.
Config
{
commands: {
native: "auto",
nativeSkills: "auto",
text: true,
bash: false,
bashForegroundMs: 2000,
config: false,
debug: false,
restart: false,
useAccessGroups: true
}
}-
commands.text(defaulttrue) enables parsing/...in chat messages.- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/MS Teams), text commands still work even if you set this to
false.
- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/MS Teams), text commands still work even if you set this to
-
commands.native(default"auto") registers native commands.- Auto: on for Discord/Telegram; off for Slack (until you add slash commands); ignored for providers without native support.
- Set
channels.discord.commands.native,channels.telegram.commands.native, orchannels.slack.commands.nativeto override per provider (bool or"auto"). falseclears previously registered commands on Discord/Telegram at startup. Slack commands are managed in the Slack app and are not removed automatically.
-
commands.nativeSkills(default"auto") registers skill commands natively when supported.- Auto: on for Discord/Telegram; off for Slack (Slack requires creating a slash command per skill).
- Set
channels.discord.commands.nativeSkills,channels.telegram.commands.nativeSkills, orchannels.slack.commands.nativeSkillsto override per provider (bool or"auto").
-
commands.bash(defaultfalse) enables! <cmd>to run host shell commands (/bash <cmd>is an alias; requirestools.elevatedallowlists). -
commands.bashForegroundMs(default2000) controls how long bash waits before switching to background mode (0backgrounds immediately). -
commands.config(defaultfalse) enables/config(reads/writesmoltbot.json). -
commands.debug(defaultfalse) enables/debug(runtime-only overrides). -
commands.useAccessGroups(defaulttrue) enforces allowlists/policies for commands.
Command list
Text + native (when enabled):
-
/help -
/commands -
/skill <name> [input](run a skill by name) -
/status(show current status; includes provider usage/quota for the current model provider when available) -
/allowlist(list/add/remove allowlist entries) -
/approve <id> allow-once|allow-always|deny(resolve exec approval prompts) -
/context [list|detail|json](explain “context”;detailshows per-file + per-tool + per-skill + system prompt size) -
/whoami(show your sender id; alias:/id) -
/subagents list|stop|log|info|send(inspect, stop, log, or message sub-agent runs for the current session) -
/config show|get|set|unset(persist config to disk, owner-only; requirescommands.config: true) -
/debug show|set|unset|reset(runtime overrides, owner-only; requirescommands.debug: true) -
/usage off|tokens|full|cost(per-response usage footer or local cost summary) -
/tts off|always|inbound|tagged|status|provider|limit|summary|audio(control TTS; see /tts)- Discord: native command is
/voice(Discord reserves/tts); text/ttsstill works.
- Discord: native command is
-
/stop -
/restart -
/dock-telegram(alias:/dock_telegram) (switch replies to Telegram) -
/dock-discord(alias:/dock_discord) (switch replies to Discord) -
/dock-slack(alias:/dock_slack) (switch replies to Slack) -
/activation mention|always(groups only) -
/send on|off|inherit(owner-only) -
/resetor/new [model](optional model hint; remainder is passed through) -
/think <off|minimal|low|medium|high|xhigh>(dynamic choices by model/provider; aliases:/thinking,/t) -
/verbose on|full|off(alias:/v) -
/reasoning on|off|stream(alias:/reason; when on, sends a separate message prefixedReasoning:;stream= Telegram draft only) -
/elevated on|off|ask|full(alias:/elev;fullskips exec approvals) -
/exec host=<sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>(send/execto show current) -
/model <name>(alias:/models; or/<alias>fromagents.defaults.models.*.alias) -
/queue <mode>(plus options likedebounce:2s cap:25 drop:summarize; send/queueto see current settings) -
/bash <command>(host-only; alias for! <command>; requirescommands.bash: true+tools.elevatedallowlists)
Text-only:
/compact [instructions](see /concepts/compaction)! <command>(host-only; one at a time; use!poll+!stopfor long-running jobs)!poll(check output / status; accepts optionalsessionId;/bash pollalso works)!stop(stop the running bash job; accepts optionalsessionId;/bash stopalso works)
Notes:
-
Commands accept an optional
:between the command and args (e.g./think: high,/send: on,/help:). -
/new <model>accepts a model alias,provider/model, or a provider name (fuzzy match); if no match, the text is treated as the message body. -
For full provider usage breakdown, use
moltbot status --usage. -
/allowlist add|removerequirescommands.config=trueand honors channelconfigWrites. -
/usagecontrols the per-response usage footer;/usage costprints a local cost summary from Moltbot session logs. -
/restartis disabled by default; setcommands.restart: trueto enable it. -
/verboseis meant for debugging and extra visibility; keep it off in normal use. -
/reasoning(and/verbose) are risky in group settings: they may reveal internal reasoning or tool output you did not intend to expose. Prefer leaving them off, especially in group chats. -
Fast path: command-only messages from allowlisted senders are handled immediately (bypass queue + model).
-
Group mention gating: command-only messages from allowlisted senders bypass mention requirements.
-
**Inline shortcuts (allowlisted senders only):**certain commands also work when embedded in a normal message and are stripped before the model sees the remaining text.
- Example:
hey /statustriggers a status reply, and the remaining text continues through the normal flow.
- Example:
-
Currently:
/help,/commands,/status,/whoami(/id). -
Unauthorized command-only messages are silently ignored, and inline
/...tokens are treated as plain text. -
Skill commands:
user-invocableskills are exposed as slash commands. Names are sanitized toa-z0-9_(max 32 chars); collisions get numeric suffixes (e.g._2)./skill <name> [input]runs a skill by name (useful when native command limits prevent per-skill commands).- By default, skill commands are forwarded to the model as a normal request.
- Skills may optionally declare
command-dispatch: toolto route the command directly to a tool (deterministic, no model). - Example:
/prose(OpenProse plugin) — see OpenProse.
-
Native command arguments: Discord uses autocomplete for dynamic options (and button menus when you omit required args). Telegram and Slack show a button menu when a command supports choices and you omit the arg.
Usage surfaces (what shows where)
- Provider usage/quota (example: “Claude 80% left”) shows up in
/statusfor the current model provider when usage tracking is enabled. - Per-response tokens/cost is controlled by
/usage off|tokens|full(appended to normal replies). /model statusis about models/auth/endpoints, not usage.
Model selection (/model)
/model is implemented as a directive.Examples:
/model
/model list
/model 3
/model openai/gpt-5.2
/model opus@anthropic:default
/model statusNotes:
/modeland/model listshow a compact, numbered picker (model family + available providers)./model <#>selects from that picker (and prefers the current provider when possible)./model statusshows the detailed view, including configured provider endpoint (baseUrl) and API mode (api) when available.
Debug overrides
/debug lets you set runtime-only config overrides (memory, not disk). Owner-only. Disabled by default; enable with commands.debug: true.Examples:
/debug show
/debug set messages.responsePrefix="[moltbot]"
/debug set channels.whatsapp.allowFrom=["+1555","+4477"]
/debug unset messages.responsePrefix
/debug resetNotes:
- Overrides apply immediately to new config reads, but do not write to
moltbot.json. - Use
/debug resetto clear all overrides and return to the on-disk config.
Config updates
/config writes to your on-disk config (moltbot.json). Owner-only. Disabled by default; enable with commands.config: true.Examples:
/config show
/config show messages.responsePrefix
/config get messages.responsePrefix
/config set messages.responsePrefix="[moltbot]"
/config unset messages.responsePrefixNotes:
- Config is validated before write; invalid changes are rejected.
/configupdates persist across restarts.
Surface notes
-
Text commands run in the normal chat session (DMs share
main, groups have their own session). -
Native commandsuse isolated sessions:
- Discord:
agent:<agentId>:discord:slash:<userId> - Slack:
agent:<agentId>:slack:slash:<userId>(prefix configurable viachannels.slack.slashCommand.sessionPrefix) - Telegram:
telegram:slash:<userId>(targets the chat session viaCommandTargetSessionKey)
- Discord:
-
/stoptargets the active chat session so it can abort the current run. -
Slack:
channels.slack.slashCommandis still supported for a single/clawd-style command. If you enablecommands.native, you must create one Slack slash command per built-in command (same names as/help). Command argument menus for Slack are delivered as ephemeral Block Kit buttons.