dots-device
Provides an MCP device integration for OpenAI ChatGPT/Dot, enabling the assistant to publish short device summaries and touch questions to an ESP32 companion, read persisted answers, record receipts, inspect device status, and receive signed device.answer events for event-triggered handling in chat.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dots-deviceask me on the device: coffee or tea?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dots-device
A small ESP32 companion for your OpenAI Dot: an animated character, short conversation summaries, and questions you can answer by touch. Keep the main conversation in chat and use the device for a glance or a quick reply.
This experimental, independent project provides firmware, character converters, example configuration, and Dot instructions. It is not official OpenAI hardware or an SDK.
Get started · Communication specification: English / 日本語
On the device
Your own animated character. Tilt the screen to move it left or right; place it flat to bring it back to the left. Tap the character to wave.
Short Japanese summaries in a speech bubble. The bubble uses the opposite side of the screen, hides during movement, and reappears when the character settles. Tap the bubble to hide or show it.
Touch answers with up to four choices, displayed two at a time. The question scrolls on the left; answer buttons stay on the right. One tap returns HOME immediately, with persistence and delivery handled by the background task.
Icon menus, page navigation, and saved light/dark themes. Connection indicators stay small; detailed diagnostics are available over serial.
The target is Waveshare ESP32-C6-Touch-LCD-1.47: a 320×172 landscape touch display, QMI8658 IMU, and 8 MB of flash. It has no microphone; voice input is not implemented. Other boards need changes to drivers, pins, sensor axes, touch coordinates, and memory layout. Manufacturer documentation · Firmware details
Related MCP server: Ask Agent
Two complementary communication paths
The ESP32 connects outward over Wi-Fi and HTTPS. In direct mode, it runs both the project's tunnel client and device MCP implementation, so a Mac relay and a public listener on the device are unnecessary.
Path | Role in this project |
Secure MCP Tunnel | Carries tool calls and their results: publish a summary or question, read a saved answer, record a receipt, and inspect status. Event discovery and subscription methods use this same MCP route. |
MCP Events | Sends a signed |
flowchart LR
Dot[Dot / ordinary chat] -->|MCP requests| Tunnel[Secure MCP Tunnel]
Device[ESP32 / device MCP implementation] -->|Outbound HTTPS polling and results| Tunnel
Tunnel -->|Queued MCP requests in poll response| Device
Tunnel -->|Tool results| Dot
Device -->|Signed device.answer webhook| Events[ChatGPT MCP Events receiver]
Events -->|Subscribed event task| DotMCP Events complements the tunnel: it provides the notification that an answer is ready. The Dot then reads the persisted answer through the tunnel. A webhook's HTTP success means the event was accepted, not that the Dot has replied in chat or recorded a receipt.
The firmware contains a custom ESP32 tunnel client; it does not run the official desktop tunnel-client binary. Review the official Secure MCP Tunnel and MCP Events requirements. Each builder uses their own tunnel and connection. Publishing this source does not distribute a public ChatGPT plugin; the tunnel service is for private connections, including developer-mode testing.
Chat → device → chat
The Dot replies in ordinary chat, then calls
device_publish_summaryfor a short device summary. When a real choice is needed, it callsdevice_publish_questioninstead.The ESP32 receives the tool request through its HTTPS poll and displays the summary or question.
A choice tap returns HOME immediately. The background task saves the answer in NVS before waiting for Wi-Fi or a valid clock, then sends
device.answerwhen delivery is possible.The subscribed Dot receives the event, calls
device_read_answerfor that question, and matches the question, choice, and request IDs to the question it published.The Dot acknowledges the answer in ordinary chat and calls
device_record_receipt. Later conversation summaries can update the device again.
For example, the arguments to device_publish_question are:
{
"question_id": "demo-drink-001",
"text": "今飲むならどっち?",
"choices": [
{"id": "coffee", "label": "コーヒー"},
{"id": "tea", "label": "お茶"}
]
}This JSON belongs in a tool call, not in the chat reply. The device does not parse the ordinary chat transcript. The English specification / 日本語の仕様 includes the sequence diagram, tool and event examples, ID mapping, persistence, retry limits, and receipt semantics.
Build your own
Prepare the board and demo. Follow Getting started for the pinned libraries, bundled procedural character, configuration examples, build, and USB flashing. Start on USB power.
Connect your Dot. Create your own tunnel and runtime key, configure Wi-Fi locally, and connect the device tools in the intended ChatGPT workspace. Platform tunnel permissions and ChatGPT workspace permissions are separate.
Enable answer events. Discover and subscribe to
device.answerin the intended Dot, verify the callback, and retain the subscription. Tool access alone does not enable event-triggered replies; the exampleDIRECT_SUBvalue{}does not create a subscription.Give the Dot both instructions. Use the instruction template for ordinary-chat summaries/questions and event-triggered answer handling. Keep device JSON out of chat. Skip unavailable-device operations quietly while continuing the conversation.
Verify the whole loop. Use the normal-chat acceptance procedure: question display, answer persistence, event delivery, Dot acknowledgement, matching receipt, and a subsequent new summary.
Replace the demo character. Ask your Dot to prepare a sprite sheet and manifest in the supported format, then import them with the converter. Keep private artwork and configuration in ignored local paths; the public demo needs no private character assets.
The schedule and message buttons are query entry points. Calendar and messaging access must be supplied by your Dot's own connected tools and instructions; the device itself does not implement those service integrations.
Status and practical limits
The direct question → persisted answer → MCP Events → Dot chat acknowledgement → matching device receipt route has been exercised on hardware with a serial-injected diagnostic tap. This is separate from physical-touch acceptance on your own board.
Summaries and questions depend on the Dot calling tools. Saved instructions are not a hook that captures every chat reply, and chat delivery and device delivery are separate operations rather than guaranteed parallel execution.
The firmware retains one current question/answer and one subscription/outbox. Retries are bounded; a recorded selection, accepted webhook, and Dot receipt are different states. There is no guaranteed response time or exactly-once conversation processing.
Intermittent Wi-Fi authentication delays remain under investigation. Serial
healthreports startup connection milestones, reconnect counters, sensor initialization, and minimum heap. The connection tracer records their changes without requesting a reset or reconnect.Battery-only Wi-Fi stability remains unresolved. USB operation and battery-side ADC measurements do not prove battery-only stability.
Documentation and licensing
Guide | Use it for |
Protocol roles, diagrams, JSON, subscriptions, and delivery semantics | |
Environment, assets, configuration, build, and flashing | |
Firmware modules, UI, sensors, and networking | |
Conversation summaries, questions, and answer handling | |
Custom sprites and Japanese font generation | |
Device health, Wi-Fi, input, and power diagnosis | |
Accepted events, question provenance, and owner-conversation delivery | |
Dependencies and remaining release work |
Several implementation and setup guides are currently in Japanese. The old Mac relay remains a separate legacy development/recovery path; new setups should start with direct HTTPS.
Original code, documentation, and the procedural demo are MIT-licensed. The Japanese atlas is derived from Noto Sans CJK JP under the OFL. Dependencies retain their own licenses and notices.
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP messaging across owners, tools, and machines, with readable transcripts.
Publish, search, and promote time-sensitive news and messages through a public remote MCP server.
Discover MCP servers and A2A agents; verify, message, post, follow, react, and receive webhooks.
Remote MCP to publish, search, and get information. x402 v2 required.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables Xiaozhi ESP32 voice assistants to connect to a central MCP hub that aggregates local business tools and remote OmniRoute agentic tools, supporting scheduling, alarms, stock quotes, todos, persistent memory, skills, webhooks, and automations via MCP SSE and HTTP JSON-RPC.-
- FlicenseNot gradedqualityCmaintenanceEnables any MCP-compatible AI agent to ask humans questions in real time via a mobile-friendly PWA with push notifications, operating local-first without third-party services.-
- FlicenseNot gradedqualityBmaintenanceEnables pushing text from an AI conversation to a low-cost BLE e-ink shelf label via an MCP tool, with rich-text markup, card-style letter layouts, and real-time SSE delivery to a phone control page. Also lets clients check current screen content, update time, push history, and whether a phone is online.-
- AlicenseNot gradedqualityBmaintenancePublishes experimental MCP Events methods — events/list, events/stream, events/poll, and events/subscribe/events/unsubscribe with verified webhook delivery — so MCP clients can receive pushed notifications alongside a public website. Anonymous visitors appear as floating dots and can ping or send a short message of up to 200 Unicode code points to any chosen name, with no accounts, database, or persistent storage.MIT