Minecraft Server Management Protocol
Minecraft Server Management Protocol is a server management API (JSON-RPC over WebSocket) for dedicated servers.
Access
[edit | edit source]The API is disabled by default and can be enabled in the server.properties file. A server-specific secret can be configured using the management-server-secret property. Clients must authenticate to access the API by providing this secret in one of two ways:
- In the
Authorizationheader as a bearer token containing the secret (ex.Authorization: Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmo) - In the
Sec-WebSocket-Protocolheader following the stringminecraft-v1,(ex.Sec-WebSocket-Protocol: minecraft-v1,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmo). This enables use via the web as this header is populated by the JavaScript WebSocket constructor.
| server.properties name | Default | Description |
|---|---|---|
management-server-allowed-origins
|
None | Comma separated list of the origins allowed to connect to the server. Requests will be rejected with a 401 Unauthorized error if they do not contain an Origin HTTP header with a value in this list. If left empty, no clients will be able to connect. The origins provided do not have to be valid URLs/domains.
|
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
[edit | edit source]Allowlist
[edit | edit source]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
[edit | edit source]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
[edit | edit source]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
[edit | edit source]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
[edit | edit source]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
[edit | edit source]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
[edit | edit source]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 ("peaceful", "easy", "normal", "hard") |
/difficulty/set
|
Set the difficulty level of the server | difficulty: string ("peaceful", "easy", "normal", "hard") | difficulty: string ("peaceful", "easy", "normal", "hard") |
/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 ("creative", "survival", "speactator", "adventure") |
/game_mode/set
|
Set the server's default game mode | mode: string ("creative", "survival", "speactator", "adventure") | mode: string ("creative", "survival", "speactator", "adventure") |
/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
[edit | edit source]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
[edit | edit source]Server
[edit | edit source]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
[edit | edit source]Endpoints are accessible at minecraft:notification/players
| Path | Description | Parameters |
|---|---|---|
/joined
|
Player joined | player: Player |
/left
|
Player left | player: Player |
Operators
[edit | edit source]Endpoints are accessible at minecraft:notification/operators
| Path | Description | Parameters |
|---|---|---|
/added
|
Player was oped | player: Operator |
/removed
|
Player was deoped | player: Operator |
Allowlist
[edit | edit source]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
[edit | edit source]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
[edit | edit source]Endpoints are accessible at minecraft:notification/bans
| Path | Description | Parameters |
|---|---|---|
/added
|
Player was added to the ban list | player: User Ban |
/removed
|
Player was removed from the ban list | player: Player |
Gamerules
[edit | edit source]Endpoints are accessible at minecraft:notification/gamerules
| Path | Description | Parameters |
|---|---|---|
/updated
|
Gamerule was changed | gamerule: Typed Game Rule |
Schemas
[edit | edit source]Untyped Game Rule
[edit | edit source]Properties:
- value: string
- key: string
Incoming IP Ban
[edit | edit source]Properties:
- reason: string
- expires: string (ISO-Instant)
- ip: string
- source: string
- player: Player
System Message
[edit | edit source]Properties:
Kick Player
[edit | edit source]Properties:
IP Ban
[edit | edit source]Properties:
- reason: string
- expires: string (ISO-Instant)
- ip: string
- source: string
Typed Game Rule
[edit | edit source]Properties:
- type: string ("integer", "boolean")
- value: string
- key: string
User Ban
[edit | edit source]Properties:
- reason: string
- expires: string (ISO-Instant)
- source: string
- player: Player
Message
[edit | edit source]Properties:
- translatable: string
- translatableParams: Array<string>
- literal: string
Version
[edit | edit source]Properties:
- protocol: integer
- name: string
Server State
[edit | edit source]Properties:
Operator
[edit | edit source]Properties:
- permissionLevel: integer
- bypassesPlayerLimit: boolean
- player: Player
Player
[edit | edit source]Properties:
- name: string
- id: string (UUID)
History
[edit | edit source]| 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:. | ||||||
| 1.21.11 | 25w41a | Is now 1.1.0. | |||||
| Added a new notification server/activity. | |||||||
| 25w42a | Enable authentication from web browsers. | ||||||
Added the management-server-allowed-origins field to server.properties. | |||||||
| 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
[edit | edit source]Issues relating to "Minecraft Server Management Protocol" are maintained on the bug tracker. Issues should be reported and viewed there.
Notes
[edit | edit source]- 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:
Example implementations
[edit | edit source]- https://github.com/Aliorpse/mcutils (client, Kotlin Multiplatform)
- https://github.com/TechnoBro03/MC-SMP (client, Python)