ServerProperties.json
Main server config file: config/ServerProperties.json.
This file is created after the first server start and becomes the persistent source of truth for the server. Stop the server before editing it unless your process manager is designed to reload configuration safely.
VoiceCraft 1.7.0 keeps the familiar transport sections, but adds NAT port mapping fields and changes how effect customization is represented internally.
Edit workflow
- Stop
VoiceCraft.Server. - Back up
config/ServerProperties.json. - Edit the relevant section.
- Validate JSON syntax.
- Start the server again.
- Watch logs for config parsing, listener, NAT mapping, or auth errors.
- Reconnect the client and Minecraft transport.
The most important first edits are the transport login tokens and host bindings.
Full example
{
"TelemetryEnabled": true,
"TelemetryToken": "replace-with-stable-random-token",
"VoiceCraftConfig": {
"Language": "en-US",
"Port": 9050,
"ExternalPort": 0,
"PortMappingLifetimeMinutes": 60,
"PortMappingTimeoutSeconds": 5,
"MaxClients": 100,
"Motd": "VoiceCraft Proximity Chat!",
"PositioningType": 0,
"EnableVisibilityDisplay": true,
"AutoOpenPort": false
},
"McWssConfig": {
"Enabled": false,
"LoginToken": "replace-with-secure-guid",
"Hostname": "ws://127.0.0.1:9051/",
"ExternalPort": 0,
"PortMappingLifetimeMinutes": 60,
"PortMappingTimeoutSeconds": 5,
"MaxClients": 1,
"MaxTimeoutMs": 10000,
"DataTunnelCommand": "voicecraft:data_tunnel",
"CommandsPerTick": 3,
"MaxByteLengthPerCommand": 300,
"DisabledPacketTypes": [],
"AutoOpenPort": false
},
"McHttpConfig": {
"Enabled": true,
"LoginToken": "replace-with-secure-guid",
"Hostname": "http://127.0.0.1:9050/",
"ExternalPort": 0,
"PortMappingLifetimeMinutes": 60,
"PortMappingTimeoutSeconds": 5,
"MaxClients": 1,
"MaxTimeoutMs": 10000,
"DisabledPacketTypes": [],
"AutoOpenPort": false
},
"McTcpConfig": {
"Enabled": false,
"LoginToken": "replace-with-secure-guid",
"Hostname": "127.0.0.1",
"Port": 9050,
"ExternalPort": 0,
"PortMappingLifetimeMinutes": 60,
"PortMappingTimeoutSeconds": 5,
"MaxClients": 1,
"MaxTimeoutMs": 10000,
"DisabledPacketTypes": [],
"AutoOpenPort": false
},
"DefaultAudioEffectsConfig": {
"1": { "EffectType": 1 },
"2": { "WetDry": 1, "MinRange": 0, "MaxRange": 30, "EffectType": 2 },
"4": { "WetDry": 1, "Delay": 0.5, "Range": 30, "EffectType": 4 },
"8": { "WetDry": 1, "EffectType": 6 }
}
}
Telemetry
TelemetryEnabled: enables anonymous startup, heartbeat, and crash diagnostics fromVoiceCraft.Server.TelemetryToken: stable pseudonymous fingerprint used to group telemetry events from one server installation.
Telemetry helps maintainers understand runtime health and version adoption. It should not be used as your own monitoring replacement.
VoiceCraftConfig
Language: server log language.Port: UDP port for the core VoiceCraft server.ExternalPort: external UDP port requested when automatic port mapping is enabled.0means usePort.PortMappingLifetimeMinutes: requested NAT mapping lifetime.PortMappingTimeoutSeconds: timeout for the port mapping attempt.MaxClients: maximum VoiceCraft client connections.Motd: text returned by ping / info responses.PositioningType: positioning mode:0 = Server1 = Client
EnableVisibilityDisplay: whether visibility indicators are sent to clients.AutoOpenPort: whether VoiceCraft should try to open the UDP voice port through NAT mapping.
Port is the endpoint that player clients add in the VoiceCraft client UI. It is not automatically the same thing as every Minecraft transport endpoint, even if defaults reuse 9050.
NAT port mapping fields
1.7.0 adds these fields to VoiceCraftConfig, McHttpConfig, McTcpConfig, and McWssConfig:
AutoOpenPortExternalPortPortMappingLifetimeMinutesPortMappingTimeoutSeconds
When AutoOpenPort is true, VoiceCraft attempts to create a temporary router mapping with OpenPort.Net.
Use it only for networks where automatic router mapping is expected. Leave it off for VPS, Docker, game panels, reverse proxies, tunnels, and manually managed firewalls.
For URI-based transports (McHttp and McWss), VoiceCraft derives the internal port from Hostname. It skips loopback-bound transports because 127.0.0.1 and localhost are not intended to be public.
McWssConfig
Used for websocket / command-tunnel Bedrock flows.
EnabledLoginTokenHostnameExternalPortPortMappingLifetimeMinutesPortMappingTimeoutSecondsMaxClientsMaxTimeoutMsDataTunnelCommandCommandsPerTickMaxByteLengthPerCommandDisabledPacketTypesAutoOpenPort
Use McWss for local worlds and testing. The command tunnel depends on DataTunnelCommand; changing it on only one side breaks the transport.
McHttpConfig
Used for Bedrock Dedicated Server and HTTP-based integrations.
EnabledLoginTokenHostnameExternalPortPortMappingLifetimeMinutesPortMappingTimeoutSecondsMaxClientsMaxTimeoutMsDisabledPacketTypesAutoOpenPort
Typical BDS binding:
{
"Enabled": true,
"LoginToken": "replace-with-token",
"Hostname": "http://0.0.0.0:9050/",
"AutoOpenPort": false
}
Use McHttp when BDS can reach the VoiceCraft HTTP endpoint. If BDS and VoiceCraft run on different machines, 127.0.0.1 will point to the wrong host from BDS's perspective.
McTcpConfig
Used by Java-side bridges, especially VoiceCraft.Java.
EnabledLoginTokenHostnamePortExternalPortPortMappingLifetimeMinutesPortMappingTimeoutSecondsMaxClientsMaxTimeoutMsDisabledPacketTypesAutoOpenPort
Important differences compared to McHttp / McWss:
Hostnameis a plain host, not a URIPortis a separate field- this is the transport most relevant to
VoiceCraft.Java
DefaultAudioEffectsConfig
Dictionary key is a ushort bitmask, value is an effect JSON object.
Default matrix:
1:Visibility2:Proximity4:ProximityEcho8:ProximityMuffle
In 1.7.0, loaded default effects keep their bitmask internally. Effects now create per-entity processors, and custom entity properties can override supported effect fields. This is the replacement path for older cave/muffle factor customization.
Change these only when you understand the effect pipeline. For most deployments, verify basic bind and proximity behavior before changing default effects.
DisabledPacketTypes
Each transport supports DisabledPacketTypes.
Use this carefully:
- it is intended for debugging, compatibility experiments, or emergency mitigation
- disabling core packets can break login, event delivery, entity sync, or audio delivery
- do not change this in production unless you understand the packet flow
If a transport works only after disabling packet types, treat that as a compatibility workaround and document why it is needed.
Practical production patterns
Bedrock Dedicated Server
McHttpConfig.Enabled = trueMcWssConfig.Enabled = falseMcTcpConfig.Enabled = falseunless you also run Java-side bridgesAutoOpenPort = falseunless this is a LAN/home-router deployment
Local world / singleplayer
McWssConfig.Enabled = trueMcHttpConfig.Enabled = falseor optional- keep
McWssConfig.Hostnameloopback-bound unless remote access is intentional
VoiceCraft.Java / Java bridge
McTcpConfig.Enabled = trueMcHttpConfig.Enabled = falseor optionalMcWssConfig.Enabled = falseunless also needed elsewhere
Important notes
- always replace generated
LoginTokenvalues - with
Hostname: http://0.0.0.0:9050/, the HTTP listener binds to a wildcard address - with
McTcpConfig.Hostname = 0.0.0.0, the TCP bridge becomes remotely reachable - keep
PositioningTypealigned with the client configuration - keep a copy of the last known-good config before upgrades
- use runtime overrides only when your process manager will pass them consistently
See also: