Skip to main content
Glama

OXII Smart Home MCP Server

Modern documentation for the device-control MCP stack that pairs with the FastAPI chatbot. Use this guide the same way you would the chatbot docs: it covers setup, commands, tooling, and troubleshooting for standalone MCP development.

🔎 Overview

Purpose

Expose OXII smart home controls (device info, switching, AC, cronjobs, one-touch, room scenarios) via the Model Context Protocol (MCP).

Transport

Server Sent Events (SSE) on port 9031.

Runtime

Python 3.10+, mcp.server.FastMCP with LangChain MCP adapters.

Consumers

The FastAPI chatbot (chatbot/) or any MCP-compatible client.

mcp/oxii-server/ ├── main.py # Boots the FastMCP process and registers tools ├── tools/ # Tool implementations (auth, device control, cronjobs…) ├── client.py # Quick demo client for manual testing ├── docker-compose.yml # Containerized runtime (exposes :9031) └── .env.example # Sample environment for OXII credentials

✅ Prerequisites

  • Python 3.10 or newer (Poetry will manage dependencies), or Docker Engine 20.10+

  • OXII account credentials with device access (phone, password, country)

  • Network access to the OXII staging/prod API defined in OXII_BASE_URL

⚙️ Environment configuration

Create a working copy of the environment file and fill in the secrets:

cp .env.example .env

Variable

Description

OXII_BASE_URL

Root URL for the OXII API (staging provided by default).

OXII_PHONE / OXII_PASSWORD / OXII_COUNTRY

Login used to obtain access tokens.

PORT / HOST

Optional overrides for where the MCP server listens (default 0.0.0.0:9031).

DEBUG

Toggle verbose logging (true/false).

🚀 Running the server

Option 1 – Local Poetry workflow

poetry install poetry run python main.py

This starts the server at http://localhost:9031/sse.

Option 2 – Docker Compose

cp .env.example .env # if you have not already docker compose up --build -d

The compose stack exposes port 9031 on the host. Combine this with the chatbot by pointing OXII_MCP_SERVER_URL to http://host.docker.internal:9031/sse inside the chatbot container.

✅ Verifying the service

1. Use the bundled client

poetry run python client.py

Select a tool from the prompt and provide the required parameters to confirm end-to-end connectivity.

2. Visit the built-in docs UI

  • Human friendly docs: http://host.docker.internal:9031/docx

  • Machine readable catalogue: http://host.docker.internal:9031/docs.json

3. Curl the SSE handshake

curl -N http://localhost:9031/sse

You should see an initial JSON payload describing the MCP capabilities.

🧰 Tool catalogue

Below is a quick reference for each registered MCP tool. All payloads are JSON structures passed through the MCP protocol.

Tool

Purpose

Key parameters

get_device_list

List homes, rooms, devices, and remote buttons.

token

switch_device_control

Toggle SH1/SH2 relay devices.

token, house_id, device_id, button_code, command (ON/OFF)

control_air_conditioner

Full AC control (mode, temp, fan).

token, serial_number, mode, fan_speed, temperature, etc.

create_device_cronjob

Add/update/remove cronjobs for switches or AC.

token, device_id or button_id, action, cron_expression, command

one_touch_control_all_devices

Execute a house-wide preset (e.g., “turn everything off”).

token, house_id, status

one_touch_control_by_type

Toggle devices by type (LIGHT, CONDITIONER, …).

token, house_id, device_type, status

room_one_touch_control

Run a single-room preset.

token, room_id, status

ℹ️ Detailed schemas live in tools/ next to each function. Review those modules for argument validation and API payload shapes.

🔄 Working with the chatbot

  1. Start the MCP server (local or Docker) and ensure port 9031 is reachable from the chatbot environment.

  2. In chatbot/.env, set OXII_MCP_SERVER_URL=http://host.docker.internal:9031/sse when running the chatbot in Docker.

  3. Restart the chatbot container (docker compose restart app) to apply env changes.

  4. Use the chatbot endpoint POST /ai/agent-oxii with a valid OXII token—the agent will automatically call the MCP tools.

🧪 Testing & diagnostics

  • Unit checks – Run poetry run pytest if you add tests (seed file test_tools.py is available as a template).

  • Token validation – Use chatbot/test_folders/testing_api.py to fetch a fresh token before invoking tools.

  • Logs – With DEBUG=true, the server prints detailed traces for each MCP call. In Docker, view them with docker compose logs -f oxii-server.

🛠 Troubleshooting

Symptom

Suggested fix

httpx.ConnectError: All connection attempts failed

The consumer is pointing to localhost from inside Docker. Use host.docker.internal or run both services on the same Compose network.

Authentication failures

Double-check OXII_PHONE, OXII_PASSWORD, and OXII_COUNTRY. Tokens expire—fetch a new one if requests start returning 401.

Cronjob payload rejected

Ensure the cron expression has 6 fields (second minute hour day month weekday) and matches the device type (SH1/SH2 vs SH4).

AC commands ignored

Some devices require numeric mode/fan values. See constants in tools/ac_control.py for valid ranges.

Docker rebuilds are slow

Use docker compose build oxii-server --no-cache after dependency changes, otherwise rely on cached layers.

📚 Further reading

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/BaoBao112233/Mockup-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server