# Virtual Screen & Speakers MCP Companion This directory implements a python-based Model Context Protocol (MCP) server that hosts a premium, futuristic web dashboard. You can open this web interface on **any local network device** (like a phone, tablet, or secondary monitor) to act as a virtual screen and speakers for the LLM. ``` ┌─────────────────────────────────┐ │ Local LLM Client / Cursor │ └────────────────┬────────────────┘ │ (JSON-RPC over Stdio) ▼ ┌─────────────────────────────────┐ │ server.py │ <── (Maintains PIL canvas state in memory) └────────────────┬────────────────┘ │ (JSON-RPC over WebSockets) ▼ ┌─────────────────────────────────┐ │ Browser Web Client │ (Render canvas, play Audio API tones/WAV, │ (index.html UI) │ capture mic and upload WAV) └─────────────────────────────────┘ ``` --- ## 1. Prerequisites Ensure you have Python 3.10+ installed along with the required libraries: ```bash pip install pillow tornado ``` --- ## 2. Launching the Server Start the companion server from this folder: ```bash python3 server.py --port 8080 ``` Upon launching, it will print out the connection URLs, such as: ```text -------------------------------------------------- Virtual Screen & Speaker MCP Server Initialized. Connect local devices in your browser to: ==> http://192.168.1.15:8080/ ==> http://localhost:8080/ -------------------------------------------------- ``` Open either URL on your laptop or enter the local IP version (`http://192.168.1.15:8080/`) into the browser of your phone or tablet. --- ## 3. Claude Desktop Integration To register this server in Claude Desktop, open your configuration file: * **macOS**: `/Users//Library/Application Support/Claude/claude_desktop_config.json` * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` Add the server to the list: ```json { "mcpServers": { "virtual-companion": { "command": "python3", "args": [ "/Users/adolforeyna/Projects/MicroPython/test1/Screen/virtual_screen_mcp/server.py", "--port", "8080" ] } } } ``` Restart Claude Desktop to load the companion tools. --- ## 4. Features & Tools The server exposes the following MCP tools to the LLM: | Tool Name | Parameters | Description | |---|---|---| | `clear_screen` | `color` (optional CSS color, e.g., `#1e1e2e` or legacy 0/1) | Clears the web canvas. | | `draw_text` | `text`, `x`, `y`, `size`, `color` | Draws text with custom fonts and colors on the display. | | `draw_shape` | `shape` (rect/circle/line), `x`, `y`, `width`, `height`, `color`, `fill` | Draws vector shapes on the canvas. | | `draw_image` | `image_base64`, `x`, `y`, `width`, `height` | Draws base64 encoded images. | | `get_screenshot` | *(None)* | Captures the virtual display buffer as a PNG image for the LLM. | | `set_led` | `r`, `g`, `b`, `mode` (static/breath/rainbow/off) | Controls the CSS WS2812 NeoPixel ring. | | `get_sensors` | *(None)* | Reads telemetry values adjusted by the dashboard sliders. | | `play_tone` | `frequency`, `duration_ms`, `volume` | Synthesizes pure tones on the browser speakers. | | `play_audio` | `audio_base64_or_url`, `volume` | Plays an audio track on the browser speakers. | | `record_voice` | `duration_sec` | Captures microphone input from the browser, encodes it as a mono 16-bit WAV, and saves it. | --- ## 5. Web Client Telemetry The dashboard provides interactive elements: * **Virtual Sensor Sliders**: Move the sliders for Temperature, Humidity, and Light to feed custom telemetry data to the LLM. When the LLM calls `get_sensors`, it receives these live values. * **Microphone Recorder**: Shows active microphone status, handles media constraints, and encodes 16-bit WAV files locally on the browser side. * **LED NeoPixel ring**: Visualizes breath, rainbow, and static LED modes in full glowing CSS.