Access a reMarkable library from MCP clients such as Claude, VS Code Copilot, OpenWebUI, and other compatible tools.
$ npx -y skills add sammorrowdrums/remarkable-mcp --agent claude-code
Access a reMarkable library from MCP clients such as Claude, VS Code Copilot, OpenWebUI, and other compatible tools.
2026-07-28 and every earlier SDK-supported revision from one
stable SDK 2.x MCPServer.uvThe commands below use uvx, which is included with uv.
Page images are rasterized with PyMuPDF; no system Cairo, browser, or graphics
runtime needs to be installed on macOS, Linux, or Windows.
Use the official standalone installer:
curl -LsSf https://astral.sh/uv/install.sh | sh
Or install with Homebrew:
brew install uv
Use the official standalone installer from PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Or install with WinGet:
winget install --id=astral-sh.uv -e
Start with the first mode that fits your setup.
| Order | Mode | Setup | Writes | Use when |
|---|---|---|---|---|
| 1 | USB web | Connect the tablet and enable USB web | Upload; destination chosen by tablet | You want the shortest setup without a subscription or developer mode |
| 2 | Local directory | Install and sign in to the desktop app | No | You want offline, device-free reads from the desktop cache |
| 3 | Cloud | Register once; Connect subscription required | Full document and folder management | You need wireless or remote access |
| 4 | SSH | Enable developer mode and configure SSH | Full management and native authoring | You need direct filesystem access or native ink writes |
Connect via USB and enable the web interface in your tablet's Storage Settings.
Add to .vscode/mcp.json:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--usb"],
"env": {
"GOOGLE_VISION_API_KEY": "your-api-key"
}
}
}
}
http://10.11.99.1Read the official reMarkable desktop app's sync folder from disk. This mode is offline and read-only. The desktop app controls synchronization.
Add to .vscode/mcp.json:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--local-dir"]
}
}
}
With no path, the desktop app's data folder is auto-detected:
~/Library/Containers/com.remarkable.desktop/Data/Library/Application Support/remarkable/desktop~/Library/Application Support/remarkable/desktop%APPDATA%\remarkable\desktop~/.local/share/remarkable/desktopOr point at any xochitl-style directory (e.g. a tablet backup):
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--local-dir", "/path/to/xochitl-data"]
}
}
}
Cloud mode works without a device connection and requires a reMarkable Connect subscription.
It fetches metadata in parallel and caches content-addressed blobs on disk. See Cloud performance and caching for configuration.
Go to my.remarkable.com/device/desktop/connect and generate a code.
uvx remarkable-mcp --register YOUR_CODE
Registration saves the token to ~/.rmapi. When your MCP client runs the server as the same user on the same machine, remarkable-mcp reads that file automatically, so you do not need to put a token in the client configuration. Set REMARKABLE_TOKEN only when ~/.rmapi is unavailable, such as when the server runs under another user or on another machine.
Add this server definition using the MCP configuration UI or wrapper required by your client:
{
"command": "uvx",
"args": ["remarkable-mcp"]
}
No env entry is needed when the server can read the token from ~/.rmapi.
VS Code's .vscode/mcp.json uses a top-level servers object. The saved
~/.rmapi credential means no token input is required:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp"]
}
}
}
Claude Desktop and many other MCP clients use a top-level mcpServers object and literal values in env; they do not use VS Code's inputs array. With the token available in ~/.rmapi, the minimal configuration is:
{
"mcpServers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp"]
}
}
}
If the token file is unavailable, add "env": {"REMARKABLE_TOKEN": "your-token"} to the remarkable server entry. Consult your client's documentation if it uses a different outer key or secret-storage mechanism.
SSH provides direct filesystem access and native notebook authoring. It requires developer mode, which factory-resets the tablet when enabled. Use this mode only when USB web, local directory, or cloud mode does not provide the operation you need.
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--ssh"]
}
}
}
See the SSH setup guide for authentication and device setup.
All modes support reading, rendering, and single-document export. Cloud and SSH support full library management. USB web supports upload but does not accept a destination folder. Local directory mode is read-only.
| Mode | Setup | Subscription | Offline | Tablet required | Raw source | Upload | Folder operations¹ |
|---|---|---|---|---|---|---|---|
| Local directory | Desktop app installed | No² | Yes | No | PDF and EPUB | No | No |
| USB web | Enable in Settings | No | Yes | Yes | Root only | No | |
| Cloud | One-time registration | Connect | No | No | PDF and EPUB | Yes | Yes |
| SSH | Developer mode | No | Yes | Yes | PDF and EPUB | Yes | Yes |
¹ Folder ops = create folder / move / rename / delete. Upload and folder ops are enabled by default; pass --read-only to expose a read-only server. Deletes move items to the trash and prompt for confirmation when your client supports elicitation, and are refused without it unless REMARKABLE_SKIP_CONFIRM=1 is set.
² The desktop app itself signs in to the reMarkable cloud to sync; local directory mode just reads whatever the app has already synced to disk.
If a selected device transport is unavailable and a cloud credential is configured,
the server falls back to cloud mode. A server launched with --local-dir remains
read-only after fallback. remarkable_status reports the effective transport and
sets fell_back_to_cloud.
Pass --no-cloud-fallback (or set REMARKABLE_DISABLE_CLOUD_FALLBACK=1) to disable this and fail instead when the device is unreachable.
The transport is resolved once per server process. Restart the MCP server after connecting a device or starting the desktop app if the process already fell back to cloud.
Detailed setup:
OpenWebUI's native MCP connection uses Streamable HTTP. Start remarkable-mcp on the same machine:
uvx remarkable-mcp --http
Then add http://127.0.0.1:8000/mcp as the MCP server URL in OpenWebUI. The
HTTP transport combines with --usb, --ssh, and --read-only; for example:
uvx remarkable-mcp --usb --http
The bind address and port can also be set with --host / --port or
REMARKABLE_MCP_HOST / REMARKABLE_MCP_PORT.
The server uses MCP Python SDK 2.x's dual-era endpoint. Modern
2026-07-28 requests are sessionless; older clients continue to use the
initialize handshake and legacy MCP sessions on the same /mcp route. The
reMarkable token and selected tablet transport remain process-local CLI/env
configuration and are never inferred from MCP HTTP authorization headers.
[!WARNING] Streamable HTTP has no built-in authentication. It binds to
127.0.0.1by default. Keep that default unless you control the network boundary. Wildcard binds such as0.0.0.0and::are rejected because they cannot provide a strict Host allowlist. A concrete non-loopback address is allowed but exposes
remarkable-mcp is a Claude Code plugin with 1 hand-picked skill, indexed on Flowy in the MCP Servers category. Install it with the command on its page. It includes remarkable-mcp. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it