Install
openclaw skills install @chizumystic/intiface-direct-controlControl 750+ BLE intimate devices via Intiface Central using direct Buttplug v4 WebSocket protocol. No MCP bridges required.
openclaw skills install @chizumystic/intiface-direct-controlControl any Buttplug.io-compatible device — 700+ toys across all major brands — using natural language through your AI agent. This skill connects directly to Intiface Central via WebSocket using the Buttplug v4 protocol, without relying on MCP bridges or third-party connector binaries.
The existing intiface-control skill on ClawHub uses mcporter → buttplug-mcp → Intiface. However:
go-buttplug library which has nil-pointer crashes and unstable WebSocket connections with Intiface v4This skill bypasses both and talks Intiface natively.
AI Agent
→ connector.cjs (Node.js, Buttplug v4 client)
→ Intiface Central (WebSocket ws://host:port)
→ Your device (Bluetooth / USB)
Works on any platform where Intiface Central is running (Windows, macOS, Linux) and the agent can reach it over the network.
Open the app and click Start Server. Leave it running — it listens on ws://localhost:12345 by default.
Click Start Scanning in Intiface Central. Power on your toy. Once it appears in the device list, scanning can be stopped.
| Scenario | URL |
|---|---|
| Same machine | ws://localhost:12345 |
| Different machine on LAN | ws://192.168.0.x:12345 |
| WSL2 → Windows | Use ws://<Windows LAN IP>:12345 or set up localhost port forwarding |
The connector.cjs script provides a command-line interface:
# List connected devices
node connector.cjs list
# Vibrate device 0, feature 0, at 70% (value 70 out of 0-100)
node connector.cjs vibrate 0 0 70
# Stop device 0
node connector.cjs stop 0
INTIFACE_WS_URL — WebSocket URL (default: ws://localhost:12345)The agent can use this skill by writing and running connector scripts that communicate with Intiface. Supported operations:
OutputCmd with Vibrate command at a specified integer valueOutputCmd with Vibrate value 0StopAllDevices messageAll messages are JSON arrays with the message type as the key. Each message object has an Id field inside the message type object.
[{"RequestServerInfo":{"Id":1,"ClientName":"MyAgent","ProtocolVersionMajor":4,"ProtocolVersionMinor":0}}]
[{"RequestDeviceList":{"Id":2}}]
[{"OutputCmd":{"Id":3,"DeviceIndex":0,"FeatureIndex":0,"Command":{"Vibrate":{"Value":70}}}}]
[{"OutputCmd":{"Id":4,"DeviceIndex":0,"FeatureIndex":0,"Command":{"Vibrate":{"Value":0}}}}]
[{"StopAllDevices":{"Id":5}}]
ServerInfo — handshake success, contains ServerName, ProtocolVersionMajor/MinorDeviceList — device list, Devices is a map keyed by device indexOk — command acknowledgedError — error with ErrorMessage fieldDevices are returned as an object/map, not an array:
{
"DeviceList": {
"Id": 2,
"Devices": {
"0": {
"DeviceName": "Satisfyer Strong One",
"DeviceIndex": 0,
"DeviceMessageTimingGap": 100,
"DeviceFeatures": {
"0": {
"FeatureIndex": 0,
"FeatureDescription": "",
"Output": {
"Vibrate": { "Value": [0, 100] }
}
}
}
}
}
}
}
| Feel | Value |
|---|---|
| Off | 0 |
| Gentle | 10-25 |
| Medium | 30-50 |
| Strong | 55-75 |
| Maximum | 80-100 |
Lovense · Kiiroo · We-Vibe · Satisfyer · The Handy · OSR-2/SR-6 · and 700+ more
DeviceIndex: 0 unless the user specifies a different devicews module is unavailable, install it: npm install wsnotify tool| Problem | Fix |
|---|---|
connection refused | Open Intiface Central and click Start Server |
| Device not found | Click Start Scanning in Intiface Central, power cycle the toy |
| Handshake fails | Use ProtocolVersionMajor: 4, ProtocolVersionMinor: 0 (v4 required) |
unknown variant | Wrong message type — use OutputCmd not VibrateCmd |
missing field | Check field names match v4 spec |
| WSL2 can't connect | Use Windows LAN IP, or set up localhost port forwarding via socat/Python |
| No devices in list | Run StartScanning in Intiface and power on the device |
connector.cjs — CLI connector scriptREADME.md — Quick start guideSKILL.md — This documentation