Skip to main content
Glama

NestJS Xiaozhi MCP Server

CI/CD Docker Image

A high-performance Model Context Protocol (MCP) Hub & Gateway built with NestJS (v12) for the Xiaozhi ESP32 AI assistant ecosystem.


🌟 Overview

NestJS Xiaozhi MCP Server acts as a unified central bridge between the Xiaozhi AI voice assistant (ESP32) and external capabilities. It aggregates:

  1. 7 Local Business Tools: Daily schedule, alarm/reminders, real-time stock quotes (FTS, SSI, VND, AAPL, TSLA), and task/todo management.

  2. 37 Dynamic OmniRoute Agentic Tools: Persistent Long-Term Memory, AgentSkills, OmniSkills sandbox execution, webhooks, and advanced automations retrieved dynamically via SSE from OmniRoute (https://ai.tuanphongoto.com/api/mcp/sse).

  3. Dual Protocol Transports: Full support for standard MCP SSE Transport (recommended for Xiaozhi) and legacy single-turn HTTP JSON-RPC.

  4. Production-Ready Docker Setup: Multi-stage build on Alpine, non-root execution, strictly bounded resource consumption (512MB RAM / 1.0 CPU), V8 GC tuning, log rotation, and native healthchecks.


Related MCP server: iot-mcp-bridge

🏗️ System Architecture

graph TD
    subgraph Edge Layer [Hardware & Voice]
        ESP32[📻 ESP32 XiaoZhi Robot / Speaker]
    end

    subgraph Core AI Server [XiaoZhi Core]
        XiaozhiBackend[🖥️ XiaoZhi Backend Server<br/>STT / TTS / WebSocket Protocol]
        LLM[🤖 LLM via OmniProxy / OpenAI]
    end

    subgraph MCP Hub [NestJS Xiaozhi MCP Server - Port 3000]
        HealthCtrl[💓 /health Monitoring]
        McpCtrl[🔌 McpController<br/>GET /mcp/sse & POST /mcp/messages]
        McpEngine[⚙️ McpServer Engine<br/>Factory Pattern Sessions]
        Business[💼 Business Services<br/>Schedule / Finance / Todo]
        OmniBridge[⚡ OmniRouteClientService<br/>Auto-reconnect & Sync]
    end

    subgraph Remote Cloud [AI Gateway]
        OmniRoute[🌐 OmniRoute MCP Server<br/>37 Agentic Tools / Memory / Skills]
    end

    ESP32 <-->|Opus Frames / WebSocket| XiaozhiBackend
    XiaozhiBackend <-->|Prompt & Tools List| LLM
    XiaozhiBackend <-->|MCP SSE Transport| McpCtrl
    McpCtrl --> McpEngine
    McpEngine --> Business
    McpEngine <-->|Dynamic Remote Tools| OmniBridge
    OmniBridge <-->|SSE Client Transport| OmniRoute

🛠️ Tech Stack

  • Framework: NestJS (v12)

  • Protocol: Model Context Protocol via @modelcontextprotocol/sdk (v1.30+)

  • Runtime: Node.js 22 LTS (ESM syntax)

  • Package Manager: pnpm

  • Language: TypeScript (Strict Mode)

  • Testing: Vitest

  • Linting: Oxlint & Prettier

  • Containerization: Docker & Docker Compose (Multi-stage Alpine, non-root user node)


🧰 Available MCP Tools (Total: 44 Tools)

1. Local Business Tools (7 Tools)

Tool Name

Description

get_daily_plan

Lấy danh sách lịch trình, kế hoạch công việc và cuộc hẹn trong ngày của người dùng.

add_schedule_item

Thêm cuộc hẹn, sự kiện hoặc công việc mới vào lịch trình.

set_alarm_schedule

Đặt báo thức hoặc nhắc nhở vào khung giờ cụ thể.

get_stock_info

Tra cứu giá và thông tin thị trường cổ phiếu thực tế (FTS, SSI, VND, AAPL, TSLA).

get_todo_list

Lấy danh sách việc cần làm (Todo List) theo trạng thái (all, pending, completed).

add_todo

Thêm việc cần làm mới với các mức ưu tiên (low, medium, high).

complete_todo

Đánh dấu việc cần làm đã hoàn thành theo ID hoặc nội dung.

2. OmniRoute Agentic Tools (37 Dynamic Tools)

When OMNIROUTE_ENABLED=true, the server connects to OmniRoute and dynamically surfaces 37 agentic tools across 13 scopes, including:

  • Persistent Agent Memory: memory_set, memory_get, memory_search (Allows XiaoZhi to remember user preferences across sessions).

  • AgentSkills & OmniSkills: Dynamic skill registry and sandbox execution.

  • Chaos Mode & A2A: Multi-model parallel execution and agent-to-agent protocol triggers.

  • System Webhooks & Utilities: Remote execution and automation integrations.


📡 Protocol & Endpoints

Endpoint

Method

Transport

Description

/mcp/sse

GET

MCP SSE

Khởi tạo phiên kết nối SSE (Server-Sent Events) cho Xiaozhi.

/mcp/messages

POST

MCP SSE

Gửi các thông điệp JSON-RPC theo session id (?sessionId=...).

/mcp/message

POST

HTTP RPC

Endpoint JSON-RPC đơn lượt truyền thống (Backward compatible).

/ota

GET/POST

HTTP JSON

Cấp cấu hình WebSocket (ws://...) và thời gian hệ thống cho ESP32.

/health

GET

HTTP

Kiểm tra trạng thái hoạt động (uptime, status) cho Docker/Kubernetes.


⚙️ Environment Variables

Create a .env file in the root directory (see .env.example):

Variable

Type

Default

Description

PORT

Number

3000

Port máy chủ NestJS lắng nghe

MCP_SERVER_NAME

String

nestjs-xiaozhi-mcp

Tên định danh của MCP Server

MCP_SERVER_VERSION

String

0.0.1

Phiên bản của MCP Server

MCP_API_KEY

String

(optional)

Khóa bảo vệ endpoint (Header Authorization: Bearer <key> hoặc X-API-Key)

OMNIROUTE_ENABLED

Boolean

true

Bật/tắt kết nối đến OmniRoute MCP Server

OMNIROUTE_SSE_URL

String

https://ai.tuanphongoto.com/api/mcp/sse

URL SSE endpoint của OmniRoute

OMNIROUTE_API_KEY

String

(optional)

Bearer API Key xác thực với OmniRoute

XIAOZHI_WEBSOCKET_URL

String

ws://192.168.1.170:8000/ws

Địa chỉ WebSocket server cấp cho ESP32 khi gọi /ota

XIAOZHI_WEBSOCKET_TOKEN

String

(optional)

Token xác thực WebSocket (nếu có)


🚀 Deployment & Running

Option 1: Production Deployment with Docker Compose (docker-compose.prod.yml)

The production Compose configuration (docker-compose.prod.yml) pulls the pre-built, multi-architecture image directly from GitHub Container Registry (GHCR). On production servers, no source code or build dependencies are needed—only .env and docker-compose.prod.yml:

# 1. Pull the latest production image
docker compose -f docker-compose.prod.yml pull

# 2. Start container in detached mode
docker compose -f docker-compose.prod.yml up -d

# 3. Check health and real-time logs
docker compose -f docker-compose.prod.yml ps
docker compose -f docker-compose.prod.yml logs -f

# 4. Graceful stop
docker compose -f docker-compose.prod.yml down
TIP

You can pin a specific image version by settingIMAGE_TAG=v1.0.0 in your .env or shell environment before running docker compose -f docker-compose.prod.yml up -d.

Option 2: Run Directly with Docker CLI

# Pull and run directly from GHCR
docker pull ghcr.io/shirotamada/nestjs-xiaozhi-mcp-server:latest

docker run -d \
  --name nestjs-xiaozhi-mcp-prod \
  -p 3000:3000 \
  --env-file .env \
  --restart always \
  ghcr.io/shirotamada/nestjs-xiaozhi-mcp-server:latest

Option 3: Local Build & Development with Docker Compose (docker-compose.yml)

The included Dockerfile and docker-compose.yml feature:

  • Strict Resource Boundaries: Maximum 512MB RAM and 1.0 CPU core limit to safeguard host resources.

  • Node.js Memory Tuning: NODE_OPTIONS="--max-old-space-size=384" triggers V8 Garbage Collection proactively before hitting the 512MB container ceiling.

  • Security: Runs under unprivileged user node (non-root).

  • Log Rotation: Capped at 3 files $\times$ 20MB to prevent disk exhaustion.

  • Automated Healthcheck: Pings GET /health every 30s.

# 1. Pull & run (or build locally if needed)
docker compose up -d

# 2. Inspect container status and health
docker compose ps

# 3. View real-time logs
docker compose logs -f

# 4. Check health endpoint
curl http://localhost:3000/health

# 5. Stop container
docker compose down

Option 4: Local Development (Without Docker)

# Install dependencies
pnpm install

# Run in watch mode (development)
pnpm run start:dev

# Run in production mode
pnpm run build
pnpm run start:prod

📻 Integration with XiaoZhi ESP32 Server

  1. Open your XiaoZhi backend server configuration (config.yaml or data/.config.yaml).

  2. Add nestjs-xiaozhi-hub under mcp.global.servers:

mcp:
  global:
    enabled: true
    servers:
      - name: "nestjs-xiaozhi-hub"
        sse_url: "http://<SERVER_IP>:3000/mcp/sse"
        enabled: true
        reconnect_interval: 5
        max_reconnect_attempts: 10
        # headers:
        #   Authorization: "Bearer your-secret-api-key" # Uncomment if MCP_API_KEY is configured

A ready-to-use template is available at templates/xiaozhi-config.yaml.

  1. Restart the XiaoZhi server. XiaoZhi will discover all 44 tools automatically!


🧪 Testing & Code Quality

# Run unit tests
pnpm run test

# Run tests with coverage
pnpm run test:cov

# Run fast code linter (Oxlint)
pnpm run lint

# Format codebase (Prettier)
pnpm run format

📄 License

UNLICENSED

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/ShiroTamada/nestjs-xiaozhi-mcp-server'

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