Viwoods MCP
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., "@Viwoods MCP read the latest page from my Health notebook"
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.
📓 Viwoods MCP
Unofficial fan project. Not made by, affiliated with, or endorsed by Viwoods. If Viwoods themselves ever wants this taken down, just say so and it will be, no argument.
Viwoods MCP gives Claude a window onto your Viwoods AiPaper notebooks, and only the part of it you choose. It's an MCP server for Claude Desktop or Claude Code that reads the stock Paper app over adb and hides everything outside the folders you've allowed.
Share your Health folder, keep your Journals out of it:
viwoods-mcp allow Health
viwoods-mcp deny Journals
viwoods-mcp policy # what that shares, folder by folder✨ Features
🔒 A folder allow/deny list. One small file decides what Claude can see. Nothing is shared until you add a rule, deny always beats allow, and a notebook you haven't shared doesn't exist as far as Claude can tell.
🪶 No root. It reads the tablet with plain
adb, through the Paper app's own content provider and its page files. If the provider says nothing it falls back to a database snapshot, and that part needsadb root.👀 Claude can read your handwriting. Pages come back as images, so it reads the ink itself rather than a lossy OCR pass.
📜 An audit log. A private record of every notebook and page Claude was shown, what it searched for, and what it asked for that wasn't shared.
viwoods-mcp auditshows the end of it. It never holds page images or text.🔎 Optional handwriting search, if you also run paperd's ink index. Every hit comes with a precise reference (
Journals › 2026-04-07 · p. 3 · changed 2026-04-07) and a count of how many matches there were in all.🖼️ Show me where I wrote it.
viwoods_show_matchcrops the page to the words you asked about, outlined and enlarged, using the word boxes in paperd's index. The crop is also saved on your PC and can be opened in your image viewer.✍️ Optional PDF import, off by default: put a PDF on the tablet as a notebook to write on, into a folder you've shared.
Tool | What it does |
| The folders of shared notebooks with counts (with and without their subfolders), and how many notebooks are not shared (a number only) |
| Shared notebooks: id, title, folder, page count, which pages have writing (as ranges, |
| Pages of a shared notebook as images (up to 8 per call) |
| The text paperd's index read from pages of a shared notebook (up to 20 per call), with no page images sent. Cheaper than |
| Words found in the handwriting of shared notebooks, newest page first, optionally limited by |
| A page zoomed in on where some words are written (up to 3 spots, outlined in red), saved to your PC. Needs paperd's index |
| A PDF from your PC as a new notebook. Off until |
Related MCP server: onenote-mcp
🚀 Quick Start
Install (Python 3.11 or newer, with
adbon your PATH and USB debugging on the tablet):git clone https://github.com/desyncc/viwoods-mcp.git cd viwoods-mcp uv venv && uv pip install -e .No
uv?python -m venv .venv && .venv/bin/pip install -e .does the same.Connect the tablet, over USB or over Wi-Fi with
adb connect <tablet-ip>:5555.Share something. Nothing is shared by default:
.venv/bin/viwoods-mcp allow Health .venv/bin/viwoods-mcp deny JournalsCheck what that exposes:
.venv/bin/viwoods-mcp policyIt lists every top-level folder and how many of its notebooks would be shared.
Add it to Claude.
Claude Desktop, in
claude_desktop_config.json:{"mcpServers": {"viwoods": {"command": "/path/to/viwoods-mcp/.venv/bin/viwoods-mcp", "args": ["--serial", "192.168.1.50:5555"]}}}Claude Code:
claude mcp add viwoods -- /path/to/viwoods-mcp/.venv/bin/viwoods-mcp--serial(or$VIWOODS_MCP_SERIAL) is only needed with more than one device, or for Wi-Fi adb.
⚙️ Configuration
Everything lives in one file, ~/.config/viwoods-mcp/policy.json (or wherever $VIWOODS_MCP_POLICY points):
{
"allow": ["Health", "Reference/Recipes"],
"deny": ["Health/Private"],
"write": false
}Key | Meaning |
| Folder paths Claude may see |
| Folder paths it may not. Deny always wins over allow |
| Lets |
How a rule matches:
A rule is a folder path, case-insensitive, ignoring spaces at the ends of a name.
*is the only wildcard and matches within a name (Ref*);[,]and?are ordinary characters.It covers that folder, every folder under it, and every notebook in them.
The last part can be a notebook's title, so
Health/Medsshares just that one."*"allows everything. Pair it withdenyrules for what you keep back.A notebook that no rule allows is not shared, and with no file at all nothing is. The same goes for a file that can't be read, or whose
denyisn't a list.writeis on only for a literaltrue;"true",1and the like leave it off.Edits apply to the next call. There's nothing to restart.
Environment variable | |
| Path to the policy file |
| adb serial, or |
| Path to paperd's |
| Where the audit log goes (default |
|
|
| How wide a |
| Where those crops are saved (default |
🕐 Time filters
viwoods_list_notebooks and viwoods_search_handwriting take since and until, so "what did I write this week" or "anxiety in September" doesn't mean reading everything. They go by when each page last changed (the notebook's time if the app gave none). A value is any of:
Value | Means |
| that whole day (as |
| that moment, in this PC's time zone unless it names an offset |
| those days |
| that long ago ( |
💻 Usage & Commands
viwoods-mcp # run the server over stdio (what Claude launches)
viwoods-mcp allow Health # add an allow rule
viwoods-mcp deny Journals # add a deny rule
viwoods-mcp remove Journals # drop a rule from either list
viwoods-mcp policy # show the policy and what it shares
viwoods-mcp audit -n 30 # the last 30 things Claude was shown
viwoods-mcp write on # let viwoods_add_pdf_notebook put PDFs on the tablet
viwoods-mcp write offRules can be edited by hand in the policy file too.
🛠️ Architecture & Under the Hood
The notebook tree comes from the Paper app's own content provider (
FileInfoProvider), which the ordinary adbshelluser can query. The pages are read from the app's folder under/sdcard/Android/data, which that user can read as well. That's why it needs no root.If the provider answers nothing, it snapshots the app's Room database instead. That path needs
adb root.Hidden notebooks stay hidden. Encrypted, recycle-bin, deleted and PDF-template notebooks never reach the tools.
Not probe-able. Asking for a notebook that isn't shared gets the same "no shared notebook called…" answer as asking for one that was never there, in
viwoods_read_pagesand in search.viwoods_add_pdf_notebookuses the app's own PDF import: the PDF is pushed to/sdcard/Documents/viwoods-mcp/and has to stay there, because the app keeps its path rather than a copy.viwoods_show_matchfinds the words in the word boxes paperd's index stores ([word, x0, y0, x1, y1], in the page image's own pixels), groups them into spots, and crops each with the lines it sits on, as far along as they are written (up to a width limit, so the enlargement stays readable). Whether the chat window displays the image depends on the Claude app, which is why it's also saved to disk and can be opened for you.viwoods_search_handwritingreads the text paperd's ink index recognised from your pages (theink_pagestable in itsindex.db). Without that file it simply returns nothing.
Checked on an AiPaper (SE03) with firmware 3.15.x and Paper app 1.8.9. A different firmware may move things around; the provider authority and the page-file layout are the two places to look.
Read-only hints
The read tools are marked read-only to clients, so an app can run them without asking each time and still stop to ask before viwoods_add_pdf_notebook. viwoods_show_match is marked as not read-only, because it saves a crop file on your PC.
What it won't do
Crops saved by viwoods_show_match are pieces of your pages kept in a folder only you can read; delete the folder whenever you like.
It doesn't rename, delete, tag or move notebooks (the app offers no safe route for any of that), and it never touches the notebook lock or the app's other controls. Reading a page sends that page's image to whichever Claude you connected, so what you allow is what it can see. Allow carefully.
Good to know about the stock app
While building this I found that the Paper app's FileInfoProvider is exported with no permission, and it exposes the notebook lock password plus two updates that clear every notebook's encrypted state and delete that password, to any app installed on the tablet. This project doesn't use any of that and never will. It's mentioned so you know the lock isn't a barrier against other apps on the device.
🧪 Tests
uv pip install -e ".[dev]"
.venv/bin/python -m pytestThe suite runs against fakes, so it needs neither a tablet nor adb.
MIT licensed.
Available Tools
6 toolsviwoods_add_pdf_notebookA
Put a PDF from this PC on the Viwoods tablet as a new Paper notebook to write on, into a shared top
level folder (or the top level). Only when the user has switched writing on.
Inputs: title (required), pdf_path (required), folder. Returns: result
viwoods_list_foldersARead-onlyIdempotent
The folders of shared notebooks in the Viwoods tablet's Paper app (not Nextcloud folders).
notebooks counts a folder and everything under it, directly_inside only its own; also
the shared notebooks at the top level, and how many notebooks are not shared (a count only).
Inputs: no named parameters. Returns: result
viwoods_list_notebooksARead-onlyIdempotent
Shared notebooks in the Viwoods tablet's Paper app, newest first: id, title, folder, page
count, which pages have writing (e.g. "1-3, 5") and when anything in it last changed. folder limits
it to a folder and the folders under it. query keeps to notebooks whose title or folder holds
every word of it (e.g. "recipes"), with no need for the handwriting index. since / until keep to notebooks with writing
that changed in that time, and add pages_changed (which pages) to each; they take a date
(2026-10-01, whole day), a date and time, today, yesterday, or how long ago (7d, 2w, 12h, 3m).
Inputs: query, since, until, folder. Returns: result
viwoods_read_pagesARead-onlyIdempotent
Pages of a shared Viwoods Paper notebook as images, to read the handwriting. notebook is
its title or id; pages are positions (1 = first), at most 8 per call. Pages with nothing
written are not sent; the first line says which.
Inputs: pages (required), notebook (required).
viwoods_search_handwritingARead-onlyIdempotent
Find words in the handwriting of shared Viwoods Paper notebooks: the text paperd's index read
from the pages (it needs paperd's index file, VIWOODS_MCP_INDEX, and only covers pages it has
read). Returns newest page first, each hit with a reference (Folder › Title · p. N · changed
date), the page and a snippet, plus total_matches in all. since / until keep to pages that
changed in that time (a date, date and time, today, yesterday, or how long ago: 7d, 2w, 12h, 3m).
Cite the reference rather than retelling the page; to show the user the spot, use
viwoods_show_match.
Inputs: query (required), limit, since, until. Returns: result
viwoods_show_matchA
Show the user where something is written: the page of a shared notebook zoomed in on words
(outlined in red, up to 3 spots), also saved to a folder on their PC and, if they've turned it
on, opened there. Use it when they ask to see or be shown where they wrote something; take
notebook and page from viwoods_search_handwriting. Needs paperd's index for where words sit.
Inputs: page (required), words (required), notebook (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a distinct verb+object and purpose: listing folders vs notebooks, reading page images, searching handwriting, showing a match, and importing a PDF. The descriptions clearly delineate boundaries, and no two tools appear to do the same thing.
All tools use the viwoods_ prefix followed by snake_case verb_noun phrasing, even for multiword objects like add_pdf_notebook. The pattern is predictable and consistent throughout.
Six tools cover the core workflows—listing folders and notebooks, reading pages, searching handwriting, showing matches, and importing PDFs—without redundancy. This is a well-scoped set for the server's purpose.
The surface covers read/list/search/show and one create operation (PDF import), but lacks update/delete/rename/move operations for notebooks and folders. These are minor gaps for a primarily read-oriented assistant, workable since users can manage such changes on the tablet.
Maintenance
Related MCP Connectors
Read and search your handwritten Boox notes from Claude or ChatGPT. Needs a Margen account.
Give Claude only the Google Drive files you choose. Every action logged.
Notes and actions in one app. Let Claude or ChatGPT read and update them.
Notes and memory assistant: one Markdown vault that Claude, ChatGPT and any MCP client can share.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables Claude to read and write to local Microsoft OneNote notebooks by parsing backup files and utilizing the OneNote COM API. It allows for searching notes, creating pages, and appending content without requiring Azure registration or API keys.104-
- AlicenseNot gradedqualityCmaintenanceEnables Claude to read local OneNote notebooks via the Windows desktop COM API, including text from pasted screenshots, while keeping all data on the machine.MIT
- AlicenseNot gradedqualityBmaintenanceGives Claude direct access to local Microsoft OneNote notebooks, enabling reading from backups and live via COM automation, plus writing sections and pages without a Microsoft account or API key.MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to query a locally imported collection of PDF, TXT, and MD files via SQLite FTS5 full-text search (including Chinese), and to browse notebooks, source files, and individual passages. Every search result carries traceable citations such as filename, page number, line number, or timestamp.MIT