---
title: "Minecraft Op Permission Levels: 0 to 4 Explained"
description: "Minecraft op permission levels 0-4 explained: what each level unlocks, how op-permission-level and ops.json set it, and how to op moderators safely."
url: "https://www.gameserverkings.com/knowledge-base/minecraft/op-permission-levels/"
category: "Minecraft"
category_url: "https://www.gameserverkings.com/knowledge-base/minecraft/"
published: "2026-08-19T04:37:24.551Z"
updated: "2026-08-19T06:09:37.106Z"
source_format: "markdown"
site: "GameServerKings"
---

# Minecraft Op Permission Levels: 0 to 4 Explained

A Minecraft operator is not simply "an admin or not". Java Edition grades operators on a numeric **permission level from 0 to 4**, and that number decides which commands a player can run. This guide covers what each level unlocks, how `op-permission-level` in `server.properties` differs from the `level` field in `ops.json`, how `/op` and `/deop` interact with both, and why handing everyone level 4 is the most common way server owners lose a world.

For what the commands themselves do, see [Minecraft Server Commands](/knowledge-base/minecraft/admin-commands/). This page is about who is allowed to run them.

## The Five Levels at a Glance

| Level | Name | What it adds |
|---|---|---|
| 0 | Operator | Operator status with no extra commands |
| 1 | Moderator | Bypass spawn protection |
| 2 | Gamemaster | Most gameplay commands, command blocks, creative operator items |
| 3 | Admin | Player moderation — bans, kicks, `/op`, `/whitelist` |
| 4 | Owner | Everything, including `/stop` and the save commands |

Levels are **incremental**: level *n* allows everything any lower level allows. And in Java Edition the level only means anything if the player is an operator in the first place — a non-op is treated as level 0 no matter what any file says.

> [!NOTE] There are five levels, not four
> Most guides say "four op levels" because 1 to 4 are the ones you would deliberately assign. Level 0 is real, is the value every non-op has, and can be set explicitly.

## What Each Level Unlocks

### Level 0 — Operator

Flagged as an operator, but with no commands beyond those every player already has. What they do gain:

- The **TPS graph** in the debug screen
- **Command block output** in chat, if that game rule is enabled
- Command output from other operators and from the server console, when `broadcast-console-to-ops=true` (it is `true` by default)

Useful for a trusted watcher who should see what staff are doing without being able to do any of it.

### Level 1 — Moderator

Adds exactly one thing: **the ability to bypass spawn protection**. No Java Edition command requires level 1 — not one. If a player only needs to build inside the protected spawn radius, this is the correct level, and it is far safer than the level 2 most people reach for.

### Level 2 — Gamemaster

This is where commands start. Level 2 unlocks the bulk of the command set — around sixty commands, everything from `/gamemode` to `/execute` — plus several client-side operator abilities:

- Placing and using **command blocks**
- The **Operator Utilities** tab in the creative inventory, when the "Operator Items Tab" option is on
- Copying NBT with **F3 + I**, the **F3 + F4** game mode switcher and the **F3 + N** spectator toggle
- Changing or locking **difficulty** from the Options screen
- Using **target selectors** (`@a`, `@e`, …) in commands such as `/tell` and in raw JSON text

The commands cover essentially all world and gameplay manipulation — `/gamemode`, `/give`, `/tp`, `/effect`, `/gamerule`, `/time`, `/weather`, `/summon`, `/kill`, `/fill`, `/setblock`, `/clone`, `/worldborder`, `/scoreboard`, `/execute`, `/function`, `/datapack` and the rest of that family.

> [!WARNING] Level 2 is not a safe "builder" level
> `/gamemode creative` and `/give` are both level 2, so anyone at this level can hand themselves any item in the game. Level 2 is a *creative* permission, not a moderation one.

### Level 3 — Admin

Level 3 adds thirteen commands, and they are all about controlling other players:

`/ban`, `/ban-ip`, `/banlist`, `/pardon`, `/pardon-ip`, `/kick`, `/op`, `/deop`, `/whitelist`, `/setidletimeout`, `/transfer`, `/tick`, `/debug`

This is the level for real moderators. Note that `/op` and `/deop` live here, so a level 3 operator can promote anybody — including themselves — to whatever `op-permission-level` is currently set to.

### Level 4 — Owner

Level 4 adds the eight commands that affect the server process rather than the world:

`/stop`, `/save-all`, `/save-off`, `/save-on`, `/jfr`, `/perf`, plus the singleplayer-only `/publish` and `/unpublish`

Six commands need no operator status at all and are available to everyone at level 0: `/help`, `/list`, `/me`, `/msg` (aliases `/tell` and `/w`), `/teammsg` (`/tm`) and `/trigger`. Two more are conditional — `/seed` is level 0 in singleplayer but level 2 on a server, and `/random` is level 0 unless you use its `sequence` argument, which needs level 2.

## `op-permission-level` in server.properties

```properties title="server.properties"
op-permission-level=4
```

`op-permission-level` accepts **0–4** and defaults to **4**. It is the level stamped onto a player *at the moment you run `/op`* — a default for newly created operators, not a server-wide ceiling. Changing it later does nothing to anyone who is already an operator; they keep whatever level was written for them.

Lower it to `3` before opping your moderators and they get everything except the ability to stop the server or disable saves.

## `function-permission-level`

```properties title="server.properties"
function-permission-level=2
```

A separate setting for a separate executor. `function-permission-level` accepts **1–4**, defaults to **2**, and sets the level that **datapack functions** run at — it has nothing to do with players. A function calling `/give` or `/tp` works at the default; one that needs `/ban` or `/kick` silently fails until this is raised to `3`. Raise it only where genuinely needed, because every function on that server then runs at the higher level.

## `ops.json` — the file that actually decides

Every operator lives in `ops.json` in the server root. `/op` writes to it, `/deop` removes from it, and it survives restarts.

```json title="ops.json"
[
  {
    "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5",
    "name": "Notch",
    "level": 4,
    "bypassesPlayerLimit": false
  }
]
```

| Field | Meaning |
|---|---|
| `uuid` | The player's UUID, in hyphenated hexadecimal form |
| `name` | The player's username — informational; the UUID is what is matched |
| `level` | This operator's permission level. Set from `op-permission-level` when written by `/op` |
| `bypassesPlayerLimit` | If `true`, this player can join even when the server is at `max-players` |

Operators are keyed on UUID, so **a player who changes their Minecraft username keeps their op status** — except on offline-mode servers, where the UUID is derived from the username and a rename breaks the entry.

`level` is per player: edit one entry to `2` and only that operator drops to level 2. This is how you build a real staff hierarchy without any plugin.

> [!IMPORTANT] `bypassesPlayerLimit` does not free up a slot
> A player with `bypassesPlayerLimit: true` is exempt from the *join* restriction, but they still count toward `max-players` once they are on. Set it on a whole staff team on a 20-slot server and a "full" server can end up holding more than 20 players.

> [!TIP] Editing ops.json by hand
> Hand edits work, but the affected player has to **rejoin** for the change to apply to them in-game. Because a running server holds the operator list in memory and rewrites the file whenever `/op` or `/deop` is used, the safest sequence is: stop the server, edit `ops.json`, start it again.

### Listing your operators

There is no vanilla command that prints operator status or permission levels. `/list` shows only the names of currently-connected players and `/list uuids` adds their UUIDs — neither reveals who is an op. `ops.json` is the list: open it in your panel's File Manager to see every operator and their `level` at once.

## How `/op` and `/deop` Interact With the Level

- `op <player>` from the **server console** always works — the console runs at level 4 — and writes the entry at whatever `op-permission-level` currently is.
- `/op` and `/deop` **in chat** both require level 3, so an operator can only promote or demote others if they are already admin-tier themselves. A level 3 operator can de-op anyone, including you.
- `/deop` removes the entry from `ops.json` entirely rather than setting the level to 0. Re-opping that player later gives them the *current* `op-permission-level`, not their old level.

To give one person a level that differs from the default: `/op` them, edit their `level` in `ops.json`, then have them rejoin.

## Why Giving Everyone Level 4 Is a Bad Idea

`op-permission-level=4` is the default, so a plain `/op Steve` hands out full control unless you change the setting first. That is worth taking literally. A level 4 operator can:

- `/stop` the server, in the middle of anything
- `/save-off` and then leave it off, so hours of play never reach disk
- `/deop` you, locking the owner out of their own server
- `/gamemode creative` and `/give` themselves any item, ending any survival economy
- `/fill` across huge regions — griefing with a bigger radius

None of this requires malice — a moderator experimenting with `/save-off`, or one mistyped `/fill`, does the same damage as an attacker.

The practical setup for a small server:

```properties title="server.properties — set this before opping your staff"
op-permission-level=3
spawn-protection=16
white-list=true
enforce-whitelist=true
```

Set `op-permission-level=3`, op your moderators, then op yourself and edit **your** entry in `ops.json` to `"level": 4`. Your staff can ban, kick and whitelist; only you can stop the server.

For anything more granular than five levels — "can use `/tp` but not `/give`", per-world rules, or ranks with prefixes — vanilla has no answer, and a permissions plugin such as LuckPerms is the right tool. See [How to Set Up LuckPerms Permissions for Minecraft](/knowledge-base/minecraft/luckperms-permissions/).

## Related Settings Worth Knowing

| Setting | Default | Why it matters here |
|---|---|---|
| `spawn-protection` | `16` | The radius level 1+ operators bypass. Set to `0` to disable. **If the server has no ops at all, spawn protection disables itself automatically** |
| `broadcast-console-to-ops` | `true` | Sends console command output to every online operator, including level 0 ones |
| `max-players` | `20` | The limit `bypassesPlayerLimit` exempts a player from joining past |

> [!NOTE] Bedrock uses `permissions.json`, not `ops.json`
> Bedrock has permission levels too — it just never lets you name one by number. `permissions.json` pairs a player's **XUID** with one of three named roles (`visitor`, `member`, `operator`), and the game resolves the role to a level from context: on a dedicated server, `operator` is **level 1** and `member` is level 0. There is no `op-permission-level` equivalent and no per-player `level` field, so a Bedrock server has exactly one admin tier — the graded ladder on this page is Java-only, and `/stop` sits at level 4, reachable only from the server console. `default-player-permission-level` in `server.properties` picks the role new players get, `member` by default. Full walkthrough in [Minecraft Bedrock allowlist and permissions](/knowledge-base/minecraft/bedrock-allowlist-and-permissions/).

## Common Issues

- **"You do not have permission to use this command"** — the player is either not in `ops.json` at all, or their `level` is below what that command needs. Check their entry in the file rather than assuming `op-permission-level` applies to them.
- **Changing `op-permission-level` did nothing, and a moderator can still `/stop`** — the setting only applies to operators created *after* the change, and that moderator was opped while it was still `4`. Lower the setting *and* edit their existing `level` field in `ops.json`.
- **Spawn protection is not working** — there are no operators on the server, which disables it automatically. Op at least one player.
- **A datapack function's command is ignored** — the command needs a level above `function-permission-level`. Raise that setting rather than opping anyone.
- **Op status vanished after a rename** — only happens in offline mode, where UUIDs are generated from usernames. Online-mode servers are unaffected.

## What to Read Next

- [Minecraft Server Commands](/knowledge-base/minecraft/admin-commands/) — what every command actually does, and where to type it
- [Getting started with your Minecraft server](/knowledge-base/minecraft/java-getting-started/) — first boot, EULA, and opping yourself
- [How to Set Up LuckPerms Permissions for Minecraft](/knowledge-base/minecraft/luckperms-permissions/) — the permissions layer that replaces op levels
- [How to install plugins for Minecraft Java Edition](/knowledge-base/minecraft/java-plugins/) — getting LuckPerms and the rest of the stack onto the server
- [Managing your Minecraft server](/knowledge-base/minecraft/performance-and-backups/) — backups, so a level 4 mistake stays recoverable

---

Made with 💜 by GameServerKings
