Minecraft Bedrock Dedicated Server (BDS) lets you fine‑tune who can run which commands by editing a file named commands.json inside the server's config/ folder. This guide shows how to (a) loosen access for trusted players, (b) lock sensitive commands to higher roles, or (c) effectively disable all commands — even /stop — with one setting.
Important
This only applies to self‑hosted Bedrock Dedicated Servers. You cannot upload or use config/commands.json on Realms.
Inside your BDS directory:
config/default/permissions.json
config/commands.json
bedrock_server.exe
server.properties
...other files
If config/commands.json does not exist yet, you can create it manually (UTF-8, plain text).
Each command can be assigned a minimum role required to execute it.
| Level | Meaning / Scope | Typical Use |
|---|---|---|
any | Anyone (all connected players) | Allow benign utility commands (list, maybe me) |
admin | Players listed in permissions.json with role admin OR higher | Standard moderation (kick, tp, gamemode) |
host | Single local host player (used in some LAN/editor contexts) plus owner | Reserve for high-impact world state changes |
owner | Top server operator(s) only (role owner in permissions.json) | Critical operations (stop, op, structure or debug commands) |
internal | No one. Command is effectively disabled (hidden / blocked for all senders and console) | Disables a command for the world session. |
Note
Setting a command (or the global default) to internal blocks everyone, including owners, from using it via chat or console. Use with caution, or keep a backup to revert.
commands.json supports two top-level properties:
{
"default_permission_level": "admin",
"permission_levels": {
"gamemode": "any"
}
}
Explanation:
default_permission_level: Fallback applied to every command not explicitly listed.permission_levels: Object mapping individual command names (no leading slash) to a specific minimum level.Anything not overridden inherits the default.
If you want a sane, moderately locked server:
{
"default_permission_level": "admin",
"permission_levels": {
"list": "any",
"me": "any",
"say": "admin",
"tell": "any",
"op": "owner",
"deop": "owner",
"stop": "owner"
}
}
You can progressively lock only the most dangerous ones while leaving utility commands open:
{
"default_permission_level": "any",
"permission_levels": {
"gamemode": "admin",
"give": "admin",
"tp": "admin",
"op": "owner",
"deop": "owner",
"stop": "owner"
}
}
Just mark a command as internal:
{
"default_permission_level": "admin",
"permission_levels": {
"kick": "internal",
"whitelist": "owner"
}
}
Here kick becomes unusable for everyone; whitelist stays restricted to owners.
Set the default to internal and then whitelist only the few you still want to function:
{
"default_permission_level": "internal",
"permission_levels": {
"list": "any",
"tell": "any"
}
}
This permits only /list and /tell. Everything else (including /stop) is blocked.
If you want a "no commands at all" world (e.g., adventure map environment):
{
"default_permission_level": "internal"
}
Important
With this in place you cannot execute /stop from in‑game. You must terminate the server process from the host OS (e.g., closing the console window or killing the process) or restore a previous commands.json.
/stop or close the console if still available).config/commands.json in Visual Studio Code.