dragon-touch-mcp
v0.5.0
Published
MCP server to control a Dragon Touch Android tablet over ADB via Wi-Fi
Maintainers
Readme
dragon-touch-mcp
Control a Dragon Touch Android tablet from Claude over ADB via network.
Developed on the 27" TM27 model — should work on other Dragon Touch sizes (21", 32", etc.) since tab switching is based on Android resource IDs, not hardcoded coordinates.

Requirements
- Node.js 18+
adbin PATH — Android SDK Platform Tools (macOS:brew install android-platform-tools)- Tablet reachable over the network with ADB enabled (
adb tcpip 5555)
Add to Claude
claude mcp add dragon-touch -e DRAGON_TOUCH_IP=192.168.178.132 -- npx dragon-touch-mcpReplace 192.168.178.132 with your tablet's IP address.
| Variable | Default | Description |
|---|---|---|
| DRAGON_TOUCH_IP | — | Tablet IP address (required) |
| DRAGON_TOUCH_PORT | 5555 | ADB port |
Tools
| Tool | Description |
|---|---|
| get_status | Check adb, device connectivity, and app installation |
| get_device_info | Read screen state (brightness, rotation, awake), audio volumes, battery, and device model |
| get_app_settings | Read app configuration from SharedPreferences (language, weather, sleep schedule, UI settings) |
| set_brightness | Set screen brightness (0–255) and disable auto-brightness |
| set_volume | Set media volume (0–15) |
| get_active_tab | Return the currently active tab/view |
| capture_screen | Take a screenshot of the tablet |
| calendar_get_schedule | Read all visible events from the current calendar view (day, week, or month) |
| calendar_set_view | Switch the calendar to day, week, month, or schedule view |
| calendar_navigate | Navigate the calendar forward or backward (1–30 steps, unit = active view) |
| calendar_set_filter | Show or hide family member profiles in the calendar filter |
| open_url | Open a URL fullscreen in the kiosk browser (optional: downloadDir) |
| close_browser | Close the kiosk browser |
| show_calendar | Switch to Calendar tab |
| show_tasks | Switch to Tasks tab |
| show_day | Switch to Day tab |
| show_meals | Switch to Meals tab |
| show_photos | Switch to Photos tab |
| show_lists | Switch to Lists tab |
| show_sleep | Switch to Sleep tab |
| show_goal | Switch to Goal tab |
Tab switching uses Android resource IDs — works regardless of screen rotation or app language.
Kiosk Browser
The Dragon Touch is primarily a family calendar and home dashboard device. The kiosk browser extends this by letting you display any web app on the tablet — fullscreen, no browser chrome, no address bar. This makes it possible to build custom web UIs (e.g. a React calendar, a home automation dashboard, or a digital photo frame) and push them to the tablet via MCP tools, without replacing or interfering with the native Dragon Touch app when not in use.
open_url opens a URL fullscreen; close_browser returns the tablet to whatever was running before. Both are controllable by Claude like any other tool.
open_url and close_browser require the Dragon Touch Kiosk Browser APK to be installed on the tablet.
Before building and installing: Review the source code in
android/yourself. The APK is built from source — no pre-built binary is distributed. Installing it modifies the tablet's running environment. There is no guarantee the Dragon Touch will continue to function correctly afterwards, as this interferes with the system.
Build and install once you are comfortable with the source:
make kiosk-installRequirements: Java, Gradle, and the Android SDK command line tools.
# macOS
brew install openjdk gradle --cask android-commandlinetools
# Ubuntu/Debian
apt install default-jdk gradle
# Android SDK: https://developer.android.com/studio#command-toolsSet ANDROID_HOME and JAVA_HOME if they differ from the defaults (see Makefile).
Kiosk Makefile Targets
| Target | Description |
|---|---|
| make kiosk-install | Build the APK from source and install it on the tablet |
| make kiosk-open | Open the URL defined by KIOSK_URL in the kiosk browser |
| make kiosk-close | Stop the kiosk browser |
| make kiosk-provision KIOSK_APP_SRC=./dist | Copy a local web app to the tablet and open it |
| make kiosk-demo | Push and open the built-in demo app (see demo/kiosk/) |
| make kiosk-screenshot | Take a screenshot and open it locally |
| make kiosk-list-files | List files in the kiosk app directory on the tablet |
| make kiosk-pull-downloads | Pull downloaded files from the tablet to ./downloads/ |
The kiosk-provision target copies the contents of KIOSK_APP_SRC to /sdcard/kiosk-app/ on the tablet and opens index.html. Override the destination with KIOSK_APP_DEST.
| Variable | Default | Description |
|---|---|---|
| KIOSK_APP_SRC | — | Local path to the web app directory (required for kiosk-provision) |
| KIOSK_APP_DEST | /sdcard/kiosk-app | Destination directory on the tablet |
| KIOSK_DOWNLOAD_DIR | /sdcard/kiosk-downloads | Directory on the tablet where downloads are saved |
| KIOSK_URL | https://sven.eisenschmidt.website | URL to open with kiosk-open |
Foreground Behavior
When the kiosk browser is open, it runs a background service that listens for screen-on events. When the tablet wakes up (e.g. after the nightly sleep timer turns the screen off), the kiosk browser automatically returns to the foreground — no interaction required.
The service is started automatically when open_url is called and runs until close_browser stops the app.
Downloads
The kiosk browser supports file downloads. Files are saved to KIOSK_DOWNLOAD_DIR on the tablet (default: /sdcard/kiosk-downloads). Pull them to your local machine with:
make kiosk-pull-downloadsFiles are saved to ./downloads/ (git-ignored). Override the source directory:
make kiosk-pull-downloads KIOSK_DOWNLOAD_DIR=/sdcard/my-downloadsKiosk Demo
demo/kiosk/ contains a minimal static web app that verifies the kiosk browser environment:
- CSS — flexbox layout, colors
- JavaScript — arrow functions, array methods
- localStorage — read/write
- Local file access — XHR fetch of a local JSON file
make kiosk-demoNote:
fetch()is unreliable forfile://URLs in the tablet's WebView (version 74). UseXMLHttpRequestinstead when loading local files. Remote HTTP requests work normally.
CLI Usage
Every tool is also available as a CLI command — useful for scripting and automation without an MCP client.
# No payload needed
DRAGON_TOUCH_IP=192.168.178.132 npx dragon-touch-mcp show_calendar
DRAGON_TOUCH_IP=192.168.178.132 npx dragon-touch-mcp get_status
# With --ip flag
npx dragon-touch-mcp --ip 192.168.178.132 show_tasks
# capture_screen saves a PNG file (default: ./dragon-touch-capture.png)
DRAGON_TOUCH_IP=192.168.178.132 npx dragon-touch-mcp capture_screen
DRAGON_TOUCH_IP=192.168.178.132 npx dragon-touch-mcp capture_screen '{"output": "/tmp/shot.png"}'All commands output JSON to stdout and errors to stderr. Exit code 0 on success, 1 on error.
Development
git clone https://github.com/sveneisenschmidt/dragon-touch-mcp.git
cd dragon-touch-mcp
npm install
npm run build # compile TypeScript
npm test # run unit tests
npm run inspect # MCP Inspector at http://localhost:5173
npm run dev # watch modeOn macOS/Linux a Makefile is also available with the same targets plus make clean.
Contributing
See AGENTS.md for architecture and conventions.
License
MIT
