reMarkable MCP Server
Enables use of reMarkable content within Obsidian for second brain workflows and knowledge management.
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., "@reMarkable MCP Server search my meeting notes for action items"
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.
reMarkable MCP Server
Unlock the full potential of your reMarkable tablet as a second brain for AI assistants. This MCP server lets Claude, VS Code Copilot, and other AI tools read, search, and traverse your entire reMarkable library — including handwritten notes via OCR.
Why remarkable-mcp?
Your reMarkable tablet is a powerful tool for thinking, note-taking, and research. But that knowledge stays trapped on the device. This MCP server changes that:
Full library access — Browse folders, search documents, read any file
Typed text extraction — Native support for Type Folio and typed annotations
Handwriting OCR — Convert handwritten notes to searchable text
PDF & EPUB support — Extract text from documents, plus your annotations
Robust page rendering — Renders pages locally and automatically falls back to a source PDF when the local stroke renderer can't (USB/SSH use the tablet's own PDF export; cloud uses the original source PDF), so images work across firmware versions and even without system graphics libraries installed
Smart search — Find content across your entire library
Second brain integration — Use with Obsidian, note-taking apps, or any AI workflow
Whether you're researching, writing, or developing ideas, remarkable-mcp lets you leverage everything on your reMarkable through AI.
Related MCP server: remark-mcp
Quick Install
🔌 USB Web Interface (Recommended)
Connect via USB and enable the web interface in your tablet's Storage Settings.
Setup:
Connect your reMarkable via USB
On your tablet: Settings → Storage → Enable "USB web interface"
Install via the button above
Why USB Web?
✅ Fast offline access over USB
✅ No subscription required
✅ Simple — just enable in Storage Settings
Add to .vscode/mcp.json:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--usb"],
"env": {
"GOOGLE_VISION_API_KEY": "your-api-key"
}
}
}
}Troubleshooting:
Make sure your reMarkable is connected via USB and unlocked
Verify USB web interface is enabled in Settings → Storage
The tablet should be accessible at
http://10.11.99.1
⚡ SSH Mode (Advanced)
For power users who need direct filesystem access. Faster than USB Web but requires developer mode (factory reset).
Requirements: Developer mode enabled + USB connection to your reMarkable
Add to .vscode/mcp.json:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--ssh"],
"env": {
"GOOGLE_VISION_API_KEY": "your-api-key"
}
}
}
}See SSH Setup Guide for detailed instructions.
☁️ Cloud Mode (Wireless)
Wireless access with no device connection required — your reMarkable syncs to the cloud and the MCP reads from there, so it works from anywhere. Requires a reMarkable Connect subscription.
Cloud mode fetches your whole library in parallel and caches content-addressed blobs on disk, so after the first run startups and document reads are near-instant (a 388-document library lists in ~4s cold, ~0.5s warm). See Cloud Performance & Caching to tune it.
1. Get a One-Time Code
Go to my.remarkable.com/device/desktop/connect and generate a code.
2. Convert to Token
uvx remarkable-mcp --register YOUR_CODE3. Install
Or configure manually in .vscode/mcp.json:
{
"inputs": [
{
"type": "promptString",
"id": "remarkable-token",
"description": "reMarkable API Token",
"password": true
},
{
"type": "promptString",
"id": "google-vision-key",
"description": "Google Vision API Key",
"password": true
}
],
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp"],
"env": {
"REMARKABLE_TOKEN": "${input:remarkable-token}",
"GOOGLE_VISION_API_KEY": "${input:google-vision-key}"
}
}
}
}Connection Modes
All three modes share the same read, render, and upload tools. Cloud and SSH additionally support full library management — create folders, move, rename, and delete (all enabled by default) — so capability is near-identical and you can genuinely pick whichever matches how your tablet is connected:
☁️ Cloud — device-free, works from anywhere. Reads your library straight from reMarkable's cloud over Wi‑Fi with a Connect subscription — no cable, no developer mode. Full read/render plus full write (upload, create folder, move, rename, delete → trash). Parallel fetching and an on-disk blob cache make it fast after the first sync. Best for remote/headless setups or when you don't want to plug in.
🔌 USB Web Interface — best when the tablet is plugged in. Enable the web interface in Storage Settings — no subscription, no developer mode. Full read/render plus upload (to your root folder). The tablet's USB web firmware exposes no folder/move/rename/delete endpoints, so for those over a cable use SSH.
⚡ SSH — for power users who want filesystem-level access. Requires developer mode over USB. Full read/render plus full write including folder create/move/rename/delete, straight from the tablet filesystem.
Mode | Setup | Subscription | Offline | Read + render | Raw PDF/EPUB | Upload | Folder ops¹ |
☁️ Cloud | One-time code | Connect | ❌ | ✅ | ✅ PDF/EPUB | ✅ | ✅ |
🔌 USB Web | Enable in Settings | Not required | ✅ | ✅ | ✅ (to root) | ❌ | |
⚡ SSH | Developer mode | Not required | ✅ | ✅ | ✅ PDF/EPUB | ✅ | ✅ |
¹ 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.
Automatic cloud fallback
If you select a device transport (--usb or --ssh) but the tablet isn't reachable at startup and a cloud token is configured (REMARKABLE_TOKEN or ~/.rmapi), the server automatically falls back to cloud mode and logs a warning. This means a single configuration works whether or not the tablet is plugged in — plug in for fast local access, unplug to keep working over the cloud. remarkable_status reports the effective transport and a fell_back_to_cloud flag when this happens.
Pass --no-cloud-fallback (or set REMARKABLE_DISABLE_CLOUD_FALLBACK=1) to disable this and fail instead when the device is unreachable.
📖 Detailed Setup Guides:
USB Web Interface Setup — recommended — simple setup, full feature support
SSH Setup Guide — for advanced users who need filesystem access
Cloud setup is documented in the Quick Install section above; tuning in Cloud Performance & Caching
OpenClaw Integration
remarkable-mcp works as an OpenClaw skill. Add to your openclaw.json:
{
"mcpServers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--usb"]
}
}
}Install from ClawHub:
clawhub install remarkable-mcpOr copy the SKILL.md from this repository into your ~/.openclaw/skills/remarkable-mcp/ directory.
Tools
Tool | Description |
| Read and extract text from documents (with pagination and search) |
| Navigate folders, search by document name, or filter by tags |
| Search content across multiple documents (with tag filtering) |
| Get recently modified documents |
| Check connection status and the per-transport capability matrix |
| Get PNG/SVG images of pages (supports OCR via sampling) |
These six tools are read-only and return structured JSON with hints for next actions. Write tools (remarkable_upload, remarkable_mkdir, remarkable_move, remarkable_rename, remarkable_delete, and remarkable_author for native ink/notebooks) are enabled by default — pass --read-only to disable them — see Write Tools. An interactive canvas app (remarkable_canvas) is also registered automatically for clients that support MCP Apps.
Smart Features
Auto-redirect — Browsing a document path returns its content automatically
Auto-OCR — Notebooks with no typed text automatically enable OCR
Batch search — Search across multiple documents in one call
Vision support — Get page images for visual context (diagrams, mockups, sketches)
Sampling OCR — Use client's AI for OCR on images (no API key needed)
Tag support — Filter and organize documents by tags
Example Usage
# Read a document
remarkable_read("Meeting Notes")
# Search for keywords
remarkable_read("Project Plan", grep="deadline")
# Enable OCR for handwritten notes
remarkable_read("Journal", include_ocr=True)
# Browse your library
remarkable_browse("/Work/Projects")
# Filter by tags
remarkable_browse("/", tags=["important"])
remarkable_browse("/Work", tags=["project", "active"])
# Search across documents
remarkable_search("meeting", grep="action items")
# Search with tag filter
remarkable_search("project", tags=["work"])
# Get recent documents
remarkable_recent(limit=10)
# Get a page image (for visual content like UI mockups or diagrams)
remarkable_image("UI Mockup", page=1)
# Get SVG for editing in design tools
remarkable_image("Wireframe", output_format="svg")
# Get image with OCR text extraction (uses sampling if configured)
remarkable_image("Handwritten Notes", include_ocr=True)
# Transparent background for compositing
remarkable_image("Logo Sketch", background="#00000000")
# Compatibility mode: return resource URI instead of embedded resource
remarkable_image("Diagram", compatibility=True)Note: PNG rendering automatically falls back to a source PDF when the local stroke renderer can't produce an image (empty pages, newer
.rmformats, or a machine withoutlibcairo). USB and SSH modes use the tablet's native PDF export; cloud mode uses the document's original source PDF. This keepsremarkable_imageworking across firmware versions and platforms. Cloud mode has no native export, so it relies on the local renderer.
Resources
Documents are automatically registered as MCP resources:
URI Scheme | Description |
| Extracted text content |
| Original PDF file (SSH only) |
| Original EPUB file (SSH only) |
| PNG image of page N (notebooks only) |
| SVG vector image of page N (notebooks only) |
📖 Full Resources Documentation
OCR for Handwriting
For handwritten content, remarkable-mcp offers several OCR backends. Choose based on your setup and requirements:
Backend | Setup | Quality | Offline | Best For |
Sampling | No API key | Depends on client model | ✅ | Users with capable AI clients |
Google Vision | API key | Excellent | ❌ | Best handwriting accuracy |
Tesseract | System install | Poor for handwriting | ✅ | Printed text, offline fallback |
Quick Setup
Set REMARKABLE_OCR_BACKEND in your MCP config:
{
"env": {
"REMARKABLE_OCR_BACKEND": "sampling"
}
}Options: sampling, google, tesseract, auto
Uses your MCP client's AI model for OCR. Works with clients that support MCP sampling (VS Code + Copilot, Claude Desktop, etc.).
Pros:
No additional API keys needed
Quality depends on your client's model (GPT-4, Claude, etc.)
Private — handwriting stays local to your client
Cons:
Only available with sampling-capable clients
Falls back to Google Vision (if API key configured) or Tesseract if sampling unavailable
Provides consistently excellent handwriting recognition.
Setup:
Enable Cloud Vision API
Create an API key
Add to config:
"GOOGLE_VISION_API_KEY": "your-key"
Cost: 1,000 free requests/month, then ~$1.50 per 1,000.
📖 Full Google Vision Setup Guide
Open-source OCR designed for printed text. Poor results with handwriting, but useful as an offline fallback.
# Install Tesseract
# macOS
brew install tesseract
# Ubuntu/Debian
sudo apt install tesseract-ocr
# Windows
choco install tesseractDefault Behavior (auto)
When REMARKABLE_OCR_BACKEND=auto (default):
Google Vision (if
GOOGLE_VISION_API_KEYis set)Tesseract (fallback)
SSH vs USB Web vs Cloud Comparison
Feature | SSH Mode | USB Web | Cloud API |
Speed | ⚡ 10-100x faster | ⚡ Fast | ⚡ Fast (parallel + cached) |
Offline | ✅ Yes | ✅ Yes | ❌ No |
Subscription | ✅ Not required | ✅ Not required | ❌ Connect required |
Raw files | ✅ PDFs, EPUBs | ✅ PDFs | ✅ PDFs, EPUBs |
Upload | ✅ (default) | ✅ (default) | ✅ (default) |
mkdir/move/rename/delete | ✅ (default) | ❌ | ✅ (default) |
Setup | Developer mode | Enable in Settings | One-time code |
Write Tools (Cloud, SSH & USB Web)
Write tools let you upload, organize, and manage documents on your reMarkable. Enabled by default. Cloud and SSH modes support the full set; USB web supports upload only (its firmware exposes no folder operations). Pass --read-only to expose a read-only server.
Feature | Cloud Mode | SSH Mode | USB Web Mode |
Upload | ✅ | ✅ | ✅ (to root) |
Mkdir | ✅ | ✅ | ❌ |
Move | ✅ | ✅ | ❌ |
Rename | ✅ | ✅ | ❌ |
Delete | ✅ (→ trash) | ✅ | ❌ |
Disabling Write Tools (read-only mode)
Write tools are on by default in every mode. To run a read-only server, add the --read-only flag:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--read-only"]
}
}
}It combines with any transport flag (--ssh, --usb):
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--ssh", "--read-only"]
}
}
}Or set the environment variable:
{
"env": {
"REMARKABLE_READ_ONLY": "1"
}
}The legacy
--writeflag andREMARKABLE_ENABLE_WRITEvariable are still accepted for backward compatibility but are now no-ops (write is the default).--writeand--read-onlyare mutually exclusive.
Available Write Tools
Tool | Description |
| Upload a PDF or EPUB file (all modes; USB web ignores folder/name and uploads to root) |
| Create a new folder (cloud and SSH) |
| Move a document or folder (cloud and SSH) |
| Rename a document or folder (cloud and SSH) |
| Delete a document or folder — destructive (cloud and SSH) |
| Author native ink and notebooks — |
Safety
Upload registers in all modes — cloud, SSH, and USB web.
mkdir, move, rename, delete register in cloud and SSH modes only — they are not exposed on USB web (the tablet's USB web firmware has no folder/move/rename/delete endpoints), keeping the tool list scoped to what the active transport actually supports.
Delete prompts for confirmation when possible — if the client supports MCP elicitation,
remarkable_deleteasks the user to confirm before deleting. If the client can't show a prompt, the delete is refused (not performed) unlessREMARKABLE_SKIP_CONFIRM=1is set — so write-on-by-default can't silently delete from clients that lack elicitation. In cloud mode delete moves the item to the trash (recoverable from your device); setREMARKABLE_SKIP_CONFIRM=1to allow deletes without a prompt in automated setups. All write tools carryToolAnnotations(readOnlyHint=False)(anddestructiveHint=Truefor delete) so an agent harness can gate writes at the MCP layer.After each write operation in SSH mode, the tablet UI restarts automatically to reflect changes.
Examples
# Upload a PDF
remarkable_upload("paper.pdf", parent_folder="/Research")
# Create a folder
remarkable_mkdir("2024 Archive", parent="/Archive")
# Move a document
remarkable_move("Meeting Notes", "/Archive/2024 Archive")
# Rename a document
remarkable_rename("Untitled", "Q4 Planning Notes")
# Delete (destructive — confirms via elicitation when supported)
remarkable_delete("Old Draft")
# Author native ink and notebooks (SSH only)
# Append pen/highlighter strokes to a page (coordinates normalized [0,1] from
# the page's top-left). The interactive canvas Save button calls this too.
remarkable_author(
method="draw", document="Ideas", page=1,
strokes=[{"points": [[0.1, 0.2], [0.8, 0.2]], "tool": "highlighter", "color": "yellow"}],
)
# Append a blank, drawable page to the end of a notebook
remarkable_author(method="add_page", document="Ideas")
# Create a new (blank) notebook — the common case
remarkable_author(method="create_document", name="Sketches")
# Only seed typed text when the user explicitly requested it.
remarkable_author(method="create_document", name="Meeting notes", text="Agenda\nFollow-ups")Interactive Canvas App (MCP Apps)
An interactive page viewer built on the MCP Apps extension (SEP-1865). Clients that support MCP Apps (such as ChatGPT, Claude, VS Code, and the MCP Inspector) render a canvas in a side panel where you can view a document page and navigate through it.
There is no flag to enable it — the remarkable_canvas tool and its ui://remarkable/canvas resource are always registered, and the capability is negotiated automatically at the MCP initialize handshake. App-capable clients open the interactive canvas; every other client simply receives the rendered page as an image, so the tool is safe and useful everywhere.
This registers one tool:
Tool | Description |
| Open a page in the interactive canvas viewer |
How it behaves:
App-capable clients open the canvas (declared at
ui://remarkable/canvas, MIMEtext/html;profile=mcp-app) and can page through the document via the MCP Apps postMessage bridge — the server delivers each rendered page in the tool result'sstructuredContent.Other clients still get the rendered page back as an embedded PNG image, so the tool is useful everywhere; it just won't open the interactive panel. The
_meta.ui/ui://metadata is inert to clients that don't advertise the MCP Apps UI extension.
Drawing and authoring from the canvas
When write mode is on (the default) and the active transport is SSH, the canvas becomes a write surface:
Draw — pick a pen or highlighter and colour, draw over the page, and Save writes the strokes back to the device as native
.rmink. Strokes are buffered locally per page (with Undo and Cancel) and only touch the device on Save.+ Page (native notebooks only) — queues a new blank page locally that you can navigate to and draw on immediately. Save materializes the queued page(s) on the device first, then writes any cached strokes.
One source of truth: the canvas calls the same
remarkable_authortool a model would call (method="draw"on Save,method="add_page"for +Page), so the human path and the model path produce byte-identical results.
The Save / Draw / +Page controls are hidden when the page isn't writable (read-only mode, or a non-SSH transport), and the canvas falls back to a plain image viewer. The iframe bridge follows the MCP Apps spec but is best validated against your specific client.
Advanced Configuration
Root Path Filtering
Limit the MCP server to a specific folder on your reMarkable. All operations will be scoped to this folder:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--ssh"],
"env": {
"REMARKABLE_ROOT_PATH": "/Work",
"GOOGLE_VISION_API_KEY": "your-api-key"
}
}
}
}With this configuration:
remarkable_browse("/")shows contents of/Workremarkable_browse("/Projects")shows/Work/ProjectsDocuments outside
/Workare not accessible
Useful for:
Focusing on work documents during office hours
Separating personal and professional notes
Limiting scope for specific AI workflows
Custom Background Color
Set the default background color for image rendering:
{
"servers": {
"remarkable": {
"command": "uvx",
"args": ["remarkable-mcp", "--ssh"],
"env": {
"REMARKABLE_BACKGROUND_COLOR": "#FFFFFF"
}
}
}
}Supported formats:
#RRGGBB— RGB hex (e.g.,#FFFFFFfor white)#RRGGBBAA— RGBA hex (e.g.,#00000000for transparent)
Default is #FBFBFB (reMarkable paper color). This affects both the remarkable_image tool and image resources.
Retry Configuration
Cloud API requests automatically retry on transient failures (HTTP 429, 500, 502, 503, 504) and network errors with exponential backoff and jitter. You can tune this via environment variables:
Variable | Default | Description |
|
| Maximum number of request attempts (minimum 1) |
|
| Base delay in seconds for exponential backoff |
The retry logic honours the Retry-After header from rate-limited responses — both the numeric (seconds) form and the HTTP-date form (which Cloudflare, fronting the reMarkable cloud, often sends) — capped at 20 seconds. Auth failures (401) are not retried — they trigger automatic token renewal instead.
Cloud Performance & Caching
Cloud mode is built to make a device-free workflow fast:
Parallel traversal — document metadata is fetched concurrently instead of one document at a time, turning a multi-minute first load into a few seconds.
Connection pooling — HTTP connections are reused (keep-alive), avoiding a fresh TLS handshake per request.
Content-addressed blob cache — reMarkable's cloud is an immutable, hash-addressed store (like Git), so a blob's bytes can never change for a given hash. Downloaded blobs are cached on disk and reused on later runs; changed documents get new hashes and are re-fetched automatically. This makes warm startups and repeat document reads near-instant, and it is invalidation-safe by construction.
You normally don't need to configure any of this, but these environment variables let you tune it:
Variable | Default | Description |
|
| Parallel workers for cloud fetches (clamped to |
| unset | Set to |
|
| Where cached blobs are stored. |
|
| Blobs larger than this are streamed through but not cached. |
The cache is purely a local accelerator: deleting REMARKABLE_CACHE_DIR only forces the next read to re-download. The mutable cloud root hash is always fetched fresh, so you never see a stale library.
Use Cases
Research & Writing
Use remarkable-mcp while working in an Obsidian vault or similar to transfer knowledge from your handwritten notes into structured documents. AI can read your research notes and help develop your ideas.
Daily Review
Ask your AI assistant to summarize your recent notes, find action items, or identify patterns across your journal entries.
Document Search
Find that half-remembered note by searching across your entire library — including handwritten content.
Knowledge Management
Treat your reMarkable as a second brain that AI can access. Combined with tools like Obsidian, you can build a powerful personal knowledge system.
Documentation
Guide | Description |
Enable developer mode and configure SSH | |
Set up handwriting OCR | |
Detailed tool documentation | |
MCP resources documentation | |
MCP protocol capabilities | |
Contributing and development setup | |
Roadmap and planned features |
Development
git clone https://github.com/SamMorrowDrums/remarkable-mcp.git
cd remarkable-mcp
uv sync --all-extras
uv run pytest test_server.py -vMulti-transport smoke test
When something looks broken, run the deterministic, no-AI smoke test first. It drives the real server over MCP and exercises every available tool in every reachable transport (cloud → usb-web → ssh):
uv run python smoke/run_smoke.py # all available modes
uv run python smoke/run_smoke.py --read-only # connectivity + reads only📖 smoke/README.md — what PASS / N/A / SKIP / FAIL mean and per-mode expectations.
License
MIT
Built with rmscene, PyMuPDF, and inspiration from ddvk/rmapi.
Available Tools
12 toolsremarkable_browseARead-onlyIdempotent
Browse your reMarkable library or search for documents. Three modes:
Browse mode (default): List contents of a folder
Use path="/" for root folder
Use path="/FolderName" to navigate into folders
Search mode: Find documents by name
Set query="search term" to search across all documents
Filter by tags: Find documents with specific tags
Set tags=["tag1", "tag2"] to filter by tags
Works in both browse and search modes
Results include document names, types, modification dates, and tags.
Note: If REMARKABLE_ROOT_PATH is configured, only documents within that folder are accessible. Paths are relative to the root path.
path: Folder path to browse (default: "/" for root)
query: Search term to find documents by name (optional, triggers search mode)
tags: List of tags to filter documents (optional, case-insensitive)
remarkable_browse() # List root folder
remarkable_browse("/Work") # List Work folder
remarkable_browse(query="meeting") # Search for "meeting"
remarkable_browse(tags=["important"]) # Show documents with "important" tag
remarkable_browse(query="project", tags=["work"]) # Search with tag filter
Inputs: path, query, tags. Returns: result
remarkable_canvasARead-only
Open a reMarkable page in an interactive canvas viewer. Renders a notebook or document page and, in clients that support MCP Apps interactive UI, opens a canvas viewer that lets the user page through the document. This is the entry point for the interactive viewer.
The canvas is currently a read-only viewer (render + page navigation). For plain image extraction without the interactive surface, use remarkable_image instead.
Clients that do not support MCP Apps still get the rendered page back as an embedded PNG image, so this tool is useful everywhere; it just won't open the interactive panel.
document: Document name or path (use remarkable_browse to find documents)
page: Page number to open (default: 1, 1-indexed)
remarkable_canvas("Meeting Notes")
remarkable_canvas("/Work/Sketches/Wireframe", page=3)
Inputs: document (required), page.
remarkable_deleteADestructive
Delete a document or folder on the reMarkable tablet. DESTRUCTIVE operation. In cloud mode the item is moved to the trash (recoverable from the device's Trash). In SSH mode it is marked deleted in its metadata and disappears from the tablet UI after restart.
Works in cloud and SSH modes (default; --read-only disables). Not available over the USB web interface.
If the client supports elicitation, this tool asks the user to confirm before deleting. If the client cannot show a confirmation prompt, the delete is refused unless REMARKABLE_SKIP_CONFIRM=1 is set (for headless automation).
document: Name or path of the document/folder to delete
remarkable_delete("Old Notes")
remarkable_delete("/Books/Archive/Old Draft")
Inputs: document (required). Returns: result
remarkable_imageARead-onlyIdempotent
Get an image of a specific page from a reMarkable document. Renders a notebook or document page as an image (PNG or SVG). This is useful for:
Viewing hand-drawn diagrams, sketches, or UI mockups
Getting visual context that text extraction might miss
Implementing designs based on hand-drawn wireframes
SVG format for scalable vector graphics that can be edited
Merged PDF + Annotation Rendering
Set render_merged=True to composite the PDF page with the annotation layer into a single image. This is ideal for annotated PDFs where the annotation-only render is hard to interpret without the printed page context. Only works with PNG format and documents that have a PDF underlay.
Response Formats
By default, images are returned as embedded resources (EmbeddedResource) which include the full image data inline:
PNG: Returned as BlobResourceContents with base64-encoded data
SVG: Returned as TextResourceContents with SVG markup
If your client doesn't support embedded resources in tool responses, set compatibility=True to receive a JSON response with just the resource URI. The client can then fetch the resource separately.
Optionally, enable include_ocr=True to extract text from the image using OCR. When REMARKABLE_OCR_BACKEND=sampling is set and the client supports sampling, the client's own LLM will be used for OCR (no API keys needed).
Note: This works best with notebooks and handwritten content. For PDFs/EPUBs, the annotations layer is rendered (not the underlying PDF content) unless render_merged=True is set.
document: Document name or path (use remarkable_browse to find documents)
page: Page number (default: 1, 1-indexed)
background: Background color as hex code. Supports RGB (#RRGGBB) or RGBA (#RRGGBBAA). Default is "#FBFBFB" (reMarkable paper color), or set REMARKABLE_BACKGROUND_COLOR env var to override. Use "#00000000" for transparent.
output_format: Output format - "png" (default) or "svg" for vector graphics
compatibility: If True, return resource URI in JSON instead of embedded resource. Use this if your client doesn't support embedded resources in tool responses.
include_ocr: Enable OCR text extraction from the image (default: False). When REMARKABLE_OCR_BACKEND=sampling, uses the client's LLM via MCP sampling.
render_merged: Composite PDF page + annotation layer into one image (default: False). Only works with PNG format and documents that have a PDF underlay.
remarkable_image("UI Mockup") # Get first page as embedded PNG resource
remarkable_image("Meeting Notes", page=2) # Get second page
remarkable_image("/Work/Designs/Wireframe", background="#FFFFFF") # White background
remarkable_image("Sketch", background="#00000000") # Transparent background
remarkable_image("Diagram", output_format="svg") # Get as embedded SVG resource
remarkable_image("Notes", compatibility=True) # Return resource URI for retry
remarkable_image("Notes", include_ocr=True) # Get image with OCR text extraction
remarkable_image("Annotated PDF", render_merged=True) # PDF + annotations composited
Inputs: document (required), page, background, output_format, +3 more.
remarkable_mkdirA
Create a new folder on the reMarkable tablet. Creates a folder in the tablet's document hierarchy. In SSH mode the folder appears after xochitl restarts; in cloud mode it syncs to all your devices.
Works in cloud and SSH modes (default; --read-only disables). Not available over the USB web interface (the firmware exposes no folder-create endpoint).
folder_name: Name of the new folder
parent: Parent folder path (default: root "/")
remarkable_mkdir("Projects")
remarkable_mkdir("2024", parent="/Archive")
Inputs: folder_name (required), parent. Returns: result
remarkable_moveA
Move a document or folder to a different location. Moves a document or folder by updating its parent reference in the metadata. Find the document name with remarkable_browse() first.
Works in cloud and SSH modes (default; --read-only disables). Not available over the USB web interface.
document: Name or path of the document/folder to move
dest_folder: Destination folder path (use "/" for root)
remarkable_move("Meeting Notes", "/Archive")
remarkable_move("Old Project", "/Archive/2023")
Inputs: document (required), dest_folder (required). Returns: result
remarkable_readARead-onlyIdempotent
Read and extract text content from a reMarkable document. Extracts content from a document with pagination to preserve context window.
Content types:
"text" (default): Full extracted text (PDF/EPUB content + annotations)
"raw": Original PDF/EPUB text only (no annotations). Works in every transport, as long as the source file is present (very large PDFs/EPUBs may not be synced to the cloud).
"annotations": Only annotations, highlights, and handwritten notes
Use pagination to read large documents without overwhelming context:
Start with page=1 (default)
Check "more" field - if true, there's more content
Use "next_page" value to get the next page
Use grep to search for specific content on the current page.
When REMARKABLE_OCR_BACKEND=sampling is set and the client supports sampling, OCR will use the client's LLM for handwriting recognition (no API keys needed).
document: Document name or path (use remarkable_browse to find documents)
content_type: "text" (full), "raw" (PDF/EPUB only), "annotations" (notes only)
page: Page number (default: 1). For notebooks, this is the notebook page.
grep: Optional regex pattern to filter content (searches current page)
include_ocr: Enable handwriting OCR for annotations (default: False)
remarkable_read("Meeting Notes") # Get first page of text
remarkable_read("Book.pdf", content_type="raw") # Get raw PDF text
remarkable_read("Notes", content_type="annotations") # Only annotations
remarkable_read("Report", page=2) # Get second page
remarkable_read("Manual", grep="installation") # Search for keyword
Inputs: document (required), content_type, page, grep, +1 more. Returns: result
remarkable_recentARead-onlyIdempotent
Get your most recently modified documents. Returns documents sorted by modification date (newest first). Optionally includes a text preview of each document's content.
Use this to quickly find what you were working on recently.
Note: If REMARKABLE_ROOT_PATH is configured, only documents within that folder are included.
limit: Maximum documents to return (default: 10, max: 50 without preview, 10 with preview)
include_preview: Include first ~200 chars of text content (default: False)
remarkable_recent() # Last 10 documents
remarkable_recent(limit=5, include_preview=True) # With content preview
Inputs: limit, include_preview. Returns: result
remarkable_renameA
Rename a document or folder on the reMarkable tablet. Changes the display name of a document or folder by updating its metadata. Find the document name with remarkable_browse() first.
Works in cloud and SSH modes (default; --read-only disables). Not available over the USB web interface.
document: Current name or path of the document/folder
new_name: New display name
remarkable_rename("Untitled", "Meeting Notes 2024-01-15")
remarkable_rename("/Work/Draft", "Final Report")
Inputs: document (required), new_name (required). Returns: result
remarkable_searchARead-onlyIdempotent
Search across multiple documents and return matching content. Searches document names for the query, then optionally searches content with grep. Can filter by tags to narrow results. Returns summaries from multiple documents in a single call.
This is efficient for finding information across your library without making many individual tool calls.
Limits:
Max 5 documents per search (to keep response size manageable)
Returns first page (~8000 chars) of each matching document
Use grep to filter to relevant sections
query: Search term for document names
grep: Optional pattern to search within document content
limit: Max documents to return (default: 5, max: 5)
include_ocr: Enable OCR for handwritten content (default: False)
tags: List of tags to filter documents (optional, case-insensitive)
remarkable_search("meeting") # Find docs with "meeting" in name
remarkable_search("journal", grep="project") # Find "project" in journals
remarkable_search("notes", include_ocr=True) # Search with OCR enabled
remarkable_search("project", tags=["work"]) # Find work-tagged projects
Inputs: query (required), grep, limit, include_ocr, +1 more. Returns: result
remarkable_statusARead-onlyIdempotent
Check connection status, active transport, and write capabilities. Returns authentication status, the active transport (cloud, ssh, or usb-web), the document count, and a capability matrix describing what each transport can do. Use this to verify your connection, choose a transport, or troubleshoot.
Capability notes:
Cloud (default): full read/render/upload/mkdir/move/rename/delete — no device needed, works from anywhere your token is valid.
SSH: full capabilities over a local/USB connection to the tablet.
USB web: read, render, and upload (to root) only — the tablet's USB web interface firmware exposes no folder/move/rename/delete endpoints. For full write parity over a USB cable, use SSH mode pointed at the USB IP. Write tools (upload/mkdir/move/rename/delete) are enabled by default; run with --read-only (or REMARKABLE_READ_ONLY=1) to expose a read-only server.
remarkable_status()
Inputs: no named parameters. Returns: result
remarkable_uploadA
Upload a PDF or EPUB file to the reMarkable tablet. Uploads a local file to the tablet. Only PDF and EPUB formats are supported. Works in all three transports:
Cloud: uploaded via the sync protocol; supports parent_folder + document_name
SSH: transferred over SSH, metadata created; supports parent_folder + document_name
USB web: uploaded via POST /upload; lands at the root (the firmware's upload endpoint has no folder or rename field)
Requires write mode (the default; disabled with --read-only).
file_path: Absolute path to the local PDF or EPUB file
parent_folder: Destination folder path on tablet (default: root "/"). Honored in cloud and SSH modes; ignored by the USB web interface.
document_name: Display name on tablet (default: filename without extension). Honored in cloud and SSH modes; ignored by the USB web interface.
remarkable_upload("/tmp/paper.pdf")
remarkable_upload("/tmp/book.epub", parent_folder="/Books")
remarkable_upload("/tmp/report.pdf", document_name="Q4 Report")
Inputs: file_path (required), parent_folder, document_name. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Tools are mostly distinct, but remarkable_browse and remarkable_search overlap in searching by name and tags. remarkable_canvas and remarkable_image both render pages, though they serve different interactive vs static purposes. Overall boundaries are clear.
All tools follow the 'remarkable_<word>' pattern in snake_case, but the words mix verbs (browse, delete, move, read, rename, search, upload) and nouns (image, canvas, status, recent, mkdir). The pattern is predictable but not strictly verb_noun.
12 tools cover the core operations for a reMarkable tablet: browsing, reading, viewing, searching, organizing (create folder, move, rename, delete), uploading, and status. The count is well-scoped without redundancy.
Core CRUD-like operations are present, but missing download, explicit tag management, and update existing document. Browsing and search cover metadata and tags. Minor gaps that agents can work around.
Maintenance
Related MCP Connectors
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Personal context for every AI: search, read, and write back to your private Markdown library.
AI assistant integration for Leaf — track books, log reading sessions, and manage your library.
Read and search your handwritten Boox notes from Claude or ChatGPT. Needs a Margen account.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to browse and read documents from a reMarkable tablet connected via USB, rendering PDF pages as images for the AI to see.Apache 2.0
- AlicenseAqualityDmaintenanceEnables reading and searching handwritten notes from GoodNotes on macOS, providing OCR text, search, and notebook management tools for AI assistants.61MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching and exploring handwritten reMarkable notebooks through a natural conversation with Claude Desktop, with full-text search, classification, and source citations.16MIT