Minecraft Server Management Protocol
Minecraft Server Management Protocol is a server management API (JSON-RPC over WebSocket) for dedicated servers.
Access
The API is disabled by default and can be enabled in the server.properties file. Clients must authenticate to access the API by supplying an Authorization bearer token header with a server specific secret configured using management-server-secret.
| server.properties name | Default | Description |
|---|---|---|
management-server-enabled
|
false
|
Set to true to enable the API
|
management-server-host
|
localhost
|
Host of the API endpoint |
management-server-port
|
0
|
Port of the API endpoint. Defaults to 0, assigning a random port on startup. Can be changed to a static port. |
management-server-secret
|
If empty on startup a value is generated and written to server.properties
|
The secret should be exactly 40 alphanumeric characters (A-Z, a-z, 0-9). The secret will be automatically generated if the server property is empty. Unauthorized requests are rejected with 401 Unauthorized. |
management-server-tls-enabled
|
true
|
Can be set to false to disable TLS. Requires a keystore file to be configured, see management-server-tls-keystore
|
management-server-tls-keystore
|
None | The keystore file must be in PKCS12 format |
management-server-tls-keystore-password
|
None | Keystore password can be set in the following ways, in order of priority
|
The API is accessible at ws://<management-server-host>:<management-server-port> when enabled. It uses the WebSocket protocol and adheres to JSON-RPC 2.0 specification.
An example command for creating a compatible keystore: keytool -genkeypair -alias testkey -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore test-keystore.p12 -validity 3650
Methods
Allowlist
Endpoints are accessible at minecraft:allowlist
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get the allowlist | None | allowlist: Array<Player> |
/set
|
Set the allowlist to the provided list of players | players: Array<Player> | allowlist: Array<Player> |
/add
|
Add players to the allowlist | add: Array<Player> | allowlist: Array<Player> |
/remove
|
Remove players from allowlist | remove: Array<Player> | allowlist: Array<Player> |
/clear
|
Clear all players in allowlist | None | allowlist: Array<Player> |
Bans
Endpoints are accessible at minecraft:bans
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get the ban list | None | banlist: Array<User Ban> |
/set
|
Set the banlist | bans: Array<User Ban> | banlist: Array<User Ban> |
/add
|
Add players to the ban list | add: Array<User Ban> | banlist: Array<User Ban> |
/remove
|
Remove players from ban list | remove: Array<Player> | banlist: Array<User Ban> |
/clear
|
Clear all players in ban list | None | banlist: Array<User Ban> |
IP Bans
Endpoints are accessible at minecraft:ip_bans
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get the ip ban list | None | banlist: Array<IP Ban> |
/set
|
Set the ip banlist | banlist: Array<IP Ban> | banlist: Array<IP Ban> |
/add
|
Add ip to ban list | add: Array<Incoming IP Ban> | banlist: Array<IP Ban> |
/remove
|
Remove ip from ban list | ip: Array<string> | banlist: Array<IP Ban> |
/clear
|
Clear all ips in ban list | None | banlist: Array<IP Ban> |
Players
Endpoints are accessible at minecraft:players
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get all connected players | None | players: Array<Player> |
/kick
|
Kick players | kick: Array<Kick Player> | kicked: Array<Player> |
Operators
Endpoints are accessible at minecraft:operators
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get all oped players | None | operators: Array<Operator> |
/set
|
Set all oped players | operators: Array<Operator> | operators: Array<Operator> |
/add
|
Op players | add: Array<Operator> | operators: Array<Operator> |
/remove
|
Deop players | remove: Array<Player> | operators: Array<Operator> |
/clear
|
Deop all players | None | operators: Array<Operator> |
Server
Endpoints are accessible at minecraft:server
| Path | Description | Parameters | Result |
|---|---|---|---|
/status
|
Get server status | None | status: Server State |
/save
|
Save server state | flush: boolean | saving: boolean |
/stop
|
Stop server | None | stopping: boolean |
/system_message
|
Send a system message | message: System Message | sent: boolean |
Server Settings
Endpoints are accessible at minecraft:serversettings
| Path | Description | Parameters | Result |
|---|---|---|---|
/autosave
|
Get whether automatic world saving is enabled on the server | None | enabled: boolean |
/autosave/set
|
Enable or disable automatic world saving on the server | enable: boolean | enabled: boolean |
/difficulty
|
Get the current difficulty level of the server | None | difficulty: string |
/difficulty/set
|
Set the difficulty level of the server | difficulty: string | difficulty: string |
/enforce_allowlist
|
Get whether allowlist enforcement is enabled (kicks players immediately when removed from allowlist) | None | enforced: boolean |
/enforce_allowlist/set
|
Enable or disable allowlist enforcement (when enabled, players are kicked immediately upon removal from allowlist) | enforce: boolean | enforced: boolean |
/use_allowlist
|
Get whether the allowlist is enabled on the server | None | used: boolean |
/use_allowlist/set
|
Enable or disable the allowlist on the server (controls whether only allowlisted players can join) | use: boolean | used: boolean |
/max_players
|
Get the maximum number of players allowed to connect to the server | None | max: integer |
/max_players/set
|
Set the maximum number of players allowed to connect to the server | max: integer | max: integer |
/pause_when_empty_seconds
|
Get the number of seconds before the game is automatically paused when no players are online | None | seconds: integer |
/pause_when_empty_seconds/set
|
Set the number of seconds before the game is automatically paused when no players are online | seconds: integer | seconds: integer |
/player_idle_timeout
|
Get the number of seconds before idle players are automatically kicked from the server | None | seconds: integer |
/player_idle_timeout/set
|
Set the number of seconds before idle players are automatically kicked from the server | seconds: integer | seconds: integer |
/allow_flight
|
Get whether flight is allowed for players in Survival mode | None | allowed: boolean |
/allow_flight/set
|
Set whether flight is allowed for players in Survival mode | allowed: boolean | allowed: boolean |
/motd
|
Get the server's message of the day displayed to players | None | message: string |
/motd/set
|
Set the server's message of the day displayed to players | message: string | message: string |
/spawn_protection_radius
|
Get the spawn protection radius in blocks (only operators can edit within this area) | None | radius: integer |
/spawn_protection_radius/set
|
Set the spawn protection radius in blocks (only operators can edit within this area) | radius: integer | radius: integer |
/force_game_mode
|
Get whether players are forced to use the server's default game mode | None | forced: boolean |
/force_game_mode/set
|
Set whether players are forced to use the server's default game mode | force: boolean | forced: boolean |
/game_mode
|
Get the server's default game mode | None | mode: string |
/game_mode/set
|
Set the server's default game mode | mode: string | mode: string |
/view_distance
|
Get the server's view distance in chunks | None | distance: integer |
/view_distance/set
|
Set the server's view distance in chunks | distance: integer | distance: integer |
/simulation_distance
|
Get the server's simulation distance in chunks | None | distance: integer |
/simulation_distance/set
|
Set the server's simulation distance in chunks | distance: integer | distance: integer |
/accept_transfers
|
Get whether the server accepts player transfers from other servers | None | accepted: boolean |
/accept_transfers/set
|
Set whether the server accepts player transfers from other servers | accept: boolean | accepted: boolean |
/status_heartbeat_interval
|
Get the interval in seconds between server status heartbeats | None | seconds: integer |
/status_heartbeat_interval/set
|
Set the interval in seconds between server status heartbeats | seconds: integer | seconds: integer |
/operator_user_permission_level
|
Get the permission level required for operator commands | None | level: integer |
/operator_user_permission_level/set
|
Set the permission level required for operator commands | level: integer | level: integer |
/hide_online_players
|
Get whether the server hides online player information from status queries | None | hidden: boolean |
/hide_online_players/set
|
Set whether the server hides online player information from status queries | hide: boolean | hidden: boolean |
/status_replies
|
Get whether the server responds to connection status requests | None | enabled: boolean |
/status_replies/set
|
Set whether the server responds to connection status requests | enable: boolean | enabled: boolean |
/entity_broadcast_range
|
Get the entity broadcast range as a percentage | None | percentage_points: integer |
/entity_broadcast_range/set
|
Set the entity broadcast range as a percentage | percentage_points: integer | percentage_points: integer |
Gamerules
Endpoints are accessible at minecraft:gamerules
| Path | Description | Parameters | Result |
|---|---|---|---|
/
|
Get the available game rule keys and their current values | None | gamerules: Array<Typed Game Rule> |
/update
|
Update game rule value | gamerule: Untyped Game Rule | gamerule: Typed Game Rule |
Notifications
Server
Endpoints are accessible at minecraft:notification/server
| Path | Description | Parameters |
|---|---|---|
/started
|
Server started | None |
/stopping
|
Server shutting down | None |
/saving
|
Server save started | None |
/saved
|
Server save completed | None |
/status
|
Server status heartbeat | status: Server State |
/activity
|
Network connection initialized | None |
Players
Endpoints are accessible at minecraft:notification/players
| Path | Description | Parameters |
|---|---|---|
/joined
|
Player joined | player: Player |
/left
|
Player left | player: Player |
Operators
Endpoints are accessible at minecraft:notification/operators
| Path | Description | Parameters |
|---|---|---|
/added
|
Player was oped | player: Operator |
/removed
|
Player was deoped | player: Operator |
Allowlist
Endpoints are accessible at minecraft:notification/allowlist
| Path | Description | Parameters |
|---|---|---|
/added
|
Player was added to the allowlist | player: Player |
/removed
|
Player was removed from allowlist | player: Player |
IP Bans
Endpoints are accessible at minecraft:notification/ip_bans
| Path | Description | Parameters |
|---|---|---|
/added
|
Ip was added to ip ban list | player: IP Ban |
/removed
|
Ip was removed from ip ban list | player: string |
Bans
Endpoints are accessible at minecraft:notification/bans
| Path | Description | Parameters |
|---|---|---|
/added
|
Player was added to the ban list | player: Operator |
/removed
|
Player was removed from the ban list | player: Operator |
Gamerules
Endpoints are accessible at minecraft:notification/gamerules
| Path | Description | Parameters |
|---|---|---|
/updated
|
Gamerule was changed | gamerule: Typed Game Rule |
Schemas
Untyped Game Rule
Properties:
- value: string
- key: string
Incoming IP Ban
Properties:
- reason: string
- expires: string
- ip: string
- source: string
- player: Player
System Message
Properties:
Kick Player
Properties:
IP Ban
Properties:
- reason: string
- expires: string
- ip: string
- source: string
Typed Game Rule
Properties:
- type: string ("integer", "boolean")
- value: string
- key: string
User Ban
Properties:
- reason: string
- expires: string
- source: string
- player: Player
Message
Properties:
- translatable: string
- translatableParams: Array<string>
- literal: string
Version
Properties:
- protocol: integer
- name: string
Server State
Properties:
Operator
Properties:
- permissionLevel: integer
- bypassesPlayerLimit: boolean
- player: Player
Player
Properties:
- name: string
- id: string
History
| Java Edition | |||||||
|---|---|---|---|---|---|---|---|
| 1.21.9 | 25w35a | Added the Minecraft Server Management Protocol. | |||||
| 25w37a | Clients must authenticate to access the API. | ||||||
| TLS is enabled by default. | |||||||
| Pre-Release 1 | Notifications now use minecraft:notification/ prefix instead of notification:. | ||||||
| Upcoming Java Edition | |||||||
| 1.21.11 | 25w41a | Is now 1.1.0. | |||||
| Added a new notification server/activity. | |||||||
| 25w42a | Enable authentication from web browsers. | ||||||
| 25w44a | The version is now 2.0.0. | ||||||
In the typed_game_rule and untyped_game_rule schemas, the type of the value field has been changed from string to take either a boolean or an integer. | |||||||
Issues
Issues relating to "Minecraft Server Management Protocol" are maintained on the bug tracker. Issues should be reported and viewed there.
Trivia
- Supports querying and updating of server state (players, allowlist, operators, settings, game rules).
- Sends notifications on state changes (e.g. player joins, game rule updates).
- Calling
{"jsonrpc":"2.0","method":"rpc.discover","id":1}returns an API schema containing supported methods and notifications of the currently running server. - The Data Generator produces an API schema (
json-rpc-api-schema.json) in the reports output folder mirroring the contents returned by therpc.discovermethod. - The API adheres to the JSON-RPC 2.0 specification.
- Uses namespaced methods and the reserved namespaces are
minecraft(e.g.minecraft:players,minecraft:allowlist/add) and notification (e.g.notification:players/joined).- Extensible via custom namespaces for additional methods and events.
- Core method groups: players, allowlist, operators, server (save, stop), server settings, game rules.
- Example method call:
- Request:
{"method":"minecraft:allowlist/add","id":1,"params":[[{"name":"jeb_"}]]} - Response:
{"jsonrpc":"2.0","id":1,"result":[{"id":"853c80ef-3c37-49fd-aa49-938b674adae6","name":"jeb_"}]}
- Request:
- Example notification:
{"jsonrpc":"2.0","method":"minecraft:notification/players/joined","params":[{"id":"853c80ef-3c37-49fd-aa49-938b674adae6","name":"jeb_"}]}
- Example error:
- Request:
{"method": "minecraft:foo/bar","id": 1} - Response:
{"jsonrpc":"2.0","id":1,"result":{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"Method not found","data":"Method not found: minecraft:foo/bar"}}} - Errors and error codes follow JSON-RPC 2.0 error object format.
- Request:
| |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||