supernote-mcp
Enables AI agents to interact with Ratta Supernote e-ink tablets over Wi-Fi, allowing live screen capture, reading and rendering of handwriting notes, and file upload.
README
supernote-mcp
An MCP server for the Ratta Supernote e-ink tablet. It lets an AI agent see and work with your Supernote over the local Wi-Fi network:
- Grab the live screen while you sketch or handwrite — "what did I just draw?"
- Browse and read your saved notebooks — recognized handwriting as text, or pages as images.
- Upload files to the device for you to read or annotate.
The idea is collaborative prompting: handwrite on the tablet during a planning session and pull it straight into the conversation, or have the agent read and reason over notes you saved earlier.
Every tool is lazy — it touches the device only when invoked, so a session that never calls one makes no network calls to the tablet.
[!IMPORTANT] Unofficial, community-built project — not affiliated with, authorised by, or endorsed by Ratta / Supernote. "Supernote" and "Ratta" are trademarks of their respective owner, used here only for identification. It relies on reverse-engineered, undocumented LAN interfaces (screen mirror + Browse & Access) that may change or break with firmware updates. Provided as-is under the MIT license — use at your own risk.
Built on supernote-typescript for screen
capture and .note parsing.
Prerequisites
- A Supernote that supports Screen Mirroring (Manta / Nomad / A5X / A6X-class devices).
- The tablet and the machine running this server on the same Wi-Fi network, with no VPN or proxy active — either will break the LAN mirror connection.
- For the
npxinstall path: Node.js ≥ 18. Forbunx: Bun. The standalone binary needs neither.
Enable mirroring and find the IP
- On the Supernote, open the sidebar and turn on Screen Mirroring (a.k.a. "Cast"/"Screencast").
- A popup shows an address like
192.168.1.42. That's the device IP. The mirror serves on port 8080 (http://<ip>:8080/screencast.mjpeg); the server appends:8080for you. - Keep mirroring on while you want the agent to be able to snapshot the canvas.
Set the IP once via the SUPERNOTE_IP environment variable, or pass it per-call as the tool's
ip argument (an explicit argument wins over the env var).
Browse & Access (for the file tools)
supernote_list_files (and the note tools) use a separate device feature from screen mirroring:
Browse & Access, the built-in Wi-Fi file server on port 8089.
- On the Supernote, swipe down from the top of the screen to open the drop-down toolbar and tap Browse & Access.
- A popup shows an address like
http://192.168.1.42:8089and stays open while it's active. The device IP is the same as for mirroring; the tools target port 8089 automatically. - Keep the popup open while you want the agent to read or upload files.
Browse & Access and Screen Mirroring are independent toggles — enable whichever the task needs (or both). Discovery probes each port, so the device can be found with only one of them on.
Coping with a changing IP
The mirror address is a DHCP lease and can change between sessions. Two ways to stay robust:
- Pin it (recommended): add a DHCP reservation on your router so the tablet always gets the
same IP, then
SUPERNOTE_IPnever goes stale. - Automatic fallback: if the configured address is unreachable — or none is set — the server
scans the local network for the mirror, uses the device it finds, and logs the new IP so you
can update
SUPERNOTE_IP. The scan only runs as a fallback (never on the fast path) and probes port 8080 across your subnet for the mirror'smultipartstream. Disable it withSUPERNOTE_DISCOVER=0if you'd rather it fail fast than scan the LAN.
Install & register with Claude Code
Pick whichever distribution suits you — none require this repo to be checked out.
# Recommended: published npm package via Node's npx
claude mcp add supernote --scope user --env SUPERNOTE_IP=192.168.1.42 -- npx -y supernote-mcp
# If you already have Bun
claude mcp add supernote --scope user --env SUPERNOTE_IP=192.168.1.42 -- bunx supernote-mcp
# Standalone binary (no runtime needed) — download the asset for your platform from the
# latest GitHub Release (supernote-mcp-darwin-arm64, -darwin-x64, -linux-x64, -linux-arm64,
# -windows-x64.exe), make it executable, then register its path:
chmod +x ./supernote-mcp-darwin-arm64
claude mcp add supernote --scope user --env SUPERNOTE_IP=192.168.1.42 -- /path/to/supernote-mcp-darwin-arm64
Restart Claude Code, then try: "Snapshot my Supernote and tell me what I drew."
On macOS the downloaded binary is unsigned; the first run may be blocked by Gatekeeper. Right-click → Open once, or run
xattr -d com.apple.quarantine /path/to/supernote-mcp-darwin-arm64.
The tools
All tools accept an optional ip (device IP, optionally :port; defaults to SUPERNOTE_IP, else a
LAN scan) and return a clear, actionable message on failure rather than hanging.
| Tool | Needs | Input | Returns |
|---|---|---|---|
supernote_snapshot |
Screen Mirroring (8080) | ip? |
the live screen as image/png |
supernote_list_files |
Browse & Access (8089) | ip?, path? |
a listing — name, folder?, size, date, and a path to pass on |
supernote_read_note |
Browse & Access (8089) | ip?, path |
a note's recognized handwriting/text per page (or a note that recognition hasn't run) |
supernote_render_note |
Browse & Access (8089) | ip?, path, pages? |
note pages as image/png (all pages, capped at 20, or the pages you pick) |
supernote_upload_file |
Browse & Access (8089) | ip?, path, directory?, filename? |
uploads a local file to the device (the only tool that writes to it) |
Failures point at the usual causes — wrong IP, the relevant feature turned off, or the host/device not sharing a VPN-free Wi-Fi network — and time out fast (10s) rather than hanging.
All tools except supernote_upload_file are read-only. supernote_upload_file writes a file to
the device (it reads a local file the server can access and POSTs it over Browse & Access).
Choosing the right tool
The server also ships this routing as MCP instructions, so a connected agent picks the right tool
on its own. The map:
| You want… | Say something like | Tool |
|---|---|---|
| What's on the screen right now | "what did I just draw?", "look at my screen" | supernote_snapshot |
| To find a saved note | "what notes do I have?", "find my note about X" | supernote_list_files |
| To read a note's words | "read / summarise my meeting notes" | supernote_read_note |
| To see a note's pages | "show me that sketch", "look at page 2" | supernote_render_note |
| To put a file on the tablet | "send this PDF to my Supernote" | supernote_upload_file |
Saved-note flow: supernote_list_files → take the entry's path → supernote_read_note (text,
cheap — prefer for words) or supernote_render_note (images, for drawings or notes without
recognized text). supernote_snapshot is separate — it's the current screen, not a saved file.
Local development
Bun is used only to run, typecheck, and build — it is not required by end users. This repo ships an optional devbox environment that provides Bun reproducibly; you can equally use a system Bun install.
bun install
# Capture-first verification against a real device (writes a PNG you can open):
bun run src/capture.ts --ip 192.168.1.42 --out frame.png
# Browse & Access (port 8089) — list a directory, download a file, upload a file:
bun run src/browse.ts list --ip 192.168.1.42 --path /Note
bun run src/browse.ts get --ip 192.168.1.42 --path /Note/obsidian/x.note --out x.note
bun run src/browse.ts put --ip 192.168.1.42 --path ./doc.pdf --dir /INBOX
# Run the MCP server over stdio:
bun run src/server.ts
# Inspect the tool interactively:
bunx @modelcontextprotocol/inspector bun run src/server.ts
bun run test # unit tests (bun:test)
bun run typecheck # tsc --noEmit
bun run build # node-compatible bundle -> dist/server.js (the npx/bunx entry)
bun run build:binary # self-contained executable -> dist/supernote-mcp
bun build --compile cross-compiles too, e.g.
bun build --compile --target=bun-linux-x64 src/server.ts --outfile dist/supernote-mcp-linux-x64.
How it works
src/capture.ts wraps fetchMirrorFrame(${ip}:8080), which parses the device's
multipart/x-mixed-replace stream, extracts a frame, and decodes it via
image-js. The frame is re-encoded to PNG (sidestepping
PNG-vs-JPEG part-encoding differences across firmwares) and returned as base64. src/browse.ts
is a client for the Browse & Access HTTP file server (port 8089): it lists directories (parsing the
listing page's embedded JSON) and downloads files. src/resolve.ts holds the shared address
resolution + LAN-scan fallback used by both, and src/discover.ts does the subnet scan (probing the
mirror or Browse & Access endpoint to recognise the device). src/server.ts registers the tools on
an McpServer over the stdio transport.
License
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。