Remarkable Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Remarkable Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that gives Claude direct access to your reMarkable tablet's notebooks. Search documents, render handwritten pages to PDF, and let Claude transcribe your handwriting or convert hand-drawn diagrams into editable formats — all from your local machine, no API keys required.
The reMarkable desktop app syncs your notebooks to a local cache. This MCP server reads that cache and exposes it as tools that Claude can use directly.
reMarkable tablet
→ reMarkable desktop app (cloud sync)
→ Local cache (~/.../remarkable/desktop)
→ remarkable-mcp (rmc → SVG → cairosvg → PDF)
→ Claude reads the PDF
→ Clean Markdown, Excalidraw diagrams, or whatever you needNo API keys. No cloud access. Everything runs locally. The desktop app handles syncing; this server just reads the files it produces.
brew install cairogit clone https://github.com/sambt94/remarkable-mcp.git
cd remarkable-mcp
uv syncAdd the server to your Claude Code MCP configuration. See mcp.example.json for the full template, or add this to your .mcp.json:
{
"mcpServers": {
"remarkable": {
"type": "stdio",
"command": "/bin/bash",
"args": [
"-c",
"export DYLD_LIBRARY_PATH=/opt/homebrew/lib; exec uv --directory '/path/to/remarkable-mcp' run server.py"
]
}
}
}Replace /path/to/remarkable-mcp with the actual path to your cloned repo.
The DYLD_LIBRARY_PATH is needed so Python can find the Homebrew-installed cairo library on macOS.
The server exposes 6 tools:
| Tool | Description |
|---|---|
remarkable_check_status | Diagnostics — cache exists? rmc available? cairo available? |
remarkable_list_documents | Search/list documents in the cache (optional substring filter) |
remarkable_get_document_info | Detailed metadata for a document (page count, page IDs, format) |
remarkable_render_pages | Render selected pages to a single PDF |
remarkable_render_document | Render all pages of a document to PDF |
remarkable_cleanup_renders | Remove temporary rendered PDFs |
remarkable_render_pages supports flexible page selection:
# Last 5 pages of a document
remarkable_render_pages(doc_id="<uuid>", last_n=5)
# First 3 pages
remarkable_render_pages(doc_id="<uuid>", first_n=3)
# Specific pages (0-indexed)
remarkable_render_pages(doc_id="<uuid>", page_indices=[0, 2, 4])
# All pages (no selection args)
remarkable_render_pages(doc_id="<uuid>")Priority: page_indices > last_n > first_n > all pages.
Once registered, Claude can access your reMarkable notebooks directly:
"Transcribe the last 3 pages of my journal"
"Find my notebook called 'Architecture Notes' and render page 5"
"What documents do I have on my reMarkable?"
The rendered PDFs are saved to /tmp/remarkable-renders/ and can be cleaned up with remarkable_cleanup_renders.
The skills/ directory contains Claude Code skill definitions that wrap the MCP tools into complete workflows:
To use these, copy the skill files into your ~/.claude/skills/ directory (or symlink them).
remarkable-mcp/
├── server.py # MCP server entry point (FastMCP, stdio transport)
├── remarkable_client.py # Client library (cache reading, rendering pipeline)
├── skills/
│ ├── remarkable-transcribe.md # Handwriting → Markdown skill
│ └── remarkable-diagram.md # Diagram → Excalidraw skill
└── tests/
├── conftest.py # Synthetic cache fixtures
├── test_remarkable_client.py # Unit tests
├── test_server.py # Integration tests
└── test_e2e.py # End-to-end stdio testsThe rendering pipeline:
.rm binary format (v6) into SVG# All tests
uv run pytest tests/ -v
# By category
uv run pytest tests/ -m unit # unit tests (synthetic cache)
uv run pytest tests/ -m integration # tool registration and response shapes
uv run pytest tests/ -m e2e # full stdio transportTests use synthetic fixtures — no real reMarkable device or cache required.
MIT — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.