npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dragon-touch-mcp

v0.5.0

Published

MCP server to control a Dragon Touch Android tablet over ADB via Wi-Fi

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.

MCP Inspector showing all tools connected and get_status returning READY

Requirements

  • Node.js 18+
  • adb in 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-mcp

Replace 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-install

Requirements: 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-tools

Set 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-downloads

Files are saved to ./downloads/ (git-ignored). Override the source directory:

make kiosk-pull-downloads KIOSK_DOWNLOAD_DIR=/sdcard/my-downloads

Kiosk 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-demo

Note: fetch() is unreliable for file:// URLs in the tablet's WebView (version 74). Use XMLHttpRequest instead 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 mode

On macOS/Linux a Makefile is also available with the same targets plus make clean.

Contributing

See AGENTS.md for architecture and conventions.

License

MIT