6.0 KiB
Javis Slave MCP
MCP (Model Context Protocol) server for controlling local Javis Slave devices. Slaves can run on Windows tablets or Linux boards (Raspberry Pi, see javis-slave/RASPBERRY_PI.md); the control endpoints are identical on both.
Features
- Status Monitoring: Check device status, audio state, mic level, muted state
- Device Info: Get device configuration (sample rate, audio devices, wake word model)
- Network Discovery: Query the master for the IP of any slave, or list all connected slaves
- Microphone Control: Mute/unmute/toggle microphone on slave devices
- Audio Engine Recovery: Restart audio engine (stop + start) when needed
- Volume Control: Get/set/increase/decrease master volume, mute/unmute output
- Brightness Control: Get/set/increase/decrease display brightness
- Power Control: Sleep / shutdown / restart / cancel shutdown
Configuration
Authentication
The slave's control API requires authentication (it can shut the machine down):
- Same machine (
127.0.0.1/::1): nothing to configure — this server always sends theX-Javis-Control: 1header, which the slave accepts from loopback callers only. - Other machines: send the slave's control token as
Authorization: Bearer …. Print it on the slave withjavis-slave --show-control-token(or open Einstellungen in the slave GUI), then set it here viaJAVIS_SLAVE_TOKEN(default for all devices),id=TOKEN@host:portinJAVIS_SLAVE_DEVICES, or"token"in the config file.
Environment Variables
# Comma-separated list of device_id=host:port (or device_id=TOKEN@host:port)
export JAVIS_SLAVE_DEVICES="device1=192.168.1.100:8766,device2=192.168.1.101:8766"
# Default control token for devices without their own
export JAVIS_SLAVE_TOKEN="…"
A malformed entry is skipped with a warning; the remaining entries still load.
Config File
Create ~/.javis/slave_mcp_config.json (or point JAVIS_SLAVE_MCP_CONFIG at it):
{
"slaves": {
"bedroom": {
"host": "192.168.1.100",
"port": 8766,
"token": "<output of javis-slave --show-control-token>"
},
"kitchen": {
"host": "192.168.1.101",
"port": 8766
}
}
}
The file contains secrets — keep it readable only by your user.
Default
If no configuration is provided, the server defaults to localhost:8766 (for local development).
Installation
pip install -e .
Usage
Run the server:
python -m javis_slave_mcp
Or with a custom config:
export JAVIS_SLAVE_DEVICES="my_device=192.168.1.100:8766"
python -m javis_slave_mcp
MCP Tools
All tools take device_id (default "localhost") unless noted otherwise.
Failures (unknown device, slave unreachable, 401, …) are returned as MCP tool
errors (isError: true). Every tool carries MCP annotations
(readOnlyHint / destructiveHint / idempotentHint); the power tools are
marked destructive so clients can ask for confirmation.
Status & discovery
slave_list_devices()— List all configured slave devicesslave_get_status(device_id)— Get current device status (incl.muted)slave_get_info(device_id)— Get device informationslave_get_ip_address(device_id)— IP of the slave as last reported by the masterslave_get_connected_devices(device_id)— All slaves known to the master, with IPs
Microphone
slave_mute_mic(device_id)— Mute the microphoneslave_unmute_mic(device_id)— Unmute the microphoneslave_toggle_mic(device_id)— Toggle microphone stateslave_restart_audio(device_id)— Restart the audio engine (stop + start)
Volume & output
slave_get_volume(device_id)— Current master volume (0.0–1.0)slave_set_volume(device_id, level)— Set master volumeslave_increase_volume(device_id, amount=0.05)— Increase volumeslave_decrease_volume(device_id, amount=0.05)— Decrease volumeslave_mute_output(device_id)— Mute outputslave_unmute_output(device_id)— Unmute output
Brightness
slave_get_brightness(device_id)— Current display brightness (0–100)slave_set_brightness(device_id, level)— Set brightnessslave_increase_brightness(device_id, amount=5)— Increase brightnessslave_decrease_brightness(device_id, amount=5)— Decrease brightness
Power
slave_sleep(device_id)— Suspendslave_shutdown(device_id, delay=0)— Power off (delay in seconds, 0–3600)slave_restart_system(device_id, delay=0)— Reboot the OS (delay 0–3600)slave_cancel_shutdown(device_id)— Cancel a pending shutdown/restart
Master-Derived Tools
slave_get_ip_address and slave_get_connected_devices route through the
slave's authenticated pass-through endpoints
(GET /mcp/v1/master/slaves, GET /mcp/v1/master/slaves/{id}/ip). The slave
calls the master with its own X-Device-Id / Bearer credentials, so this
works on LAN deployments where the MCP host and the slave host differ.
slave_get_ip_address first reads the slave's real device_id from its
/mcp/v1/status, so it also works when you address the slave by an alias
such as localhost.
Integration with Javis
Add to mcp_servers.json:
{
"servers": {
"javis-slave": {
"command": "python",
"args": ["-m", "javis_slave_mcp"],
"env": {
"JAVIS_SLAVE_DEVICES": "device1=192.168.1.100:8766",
"JAVIS_SLAVE_TOKEN": "<slave control token>"
},
"transport": "stdio",
"approval": "allow"
}
}
}
Now Javis can use tools like javis_slave__slave_mute_mic to control slave devices.
Implementation Details
The slave app runs an HTTP server on port 8766 alongside the GUI and audio engine. This MCP server connects to slave instances via their HTTP APIs and exposes control tools.
See:
- Slave HTTP Server — Endpoints and models
- Slave App Integration — HTTP server lifecycle