Box MCP server
OFFICIAL SERVERBox's hosted MCP endpoint for searching, reading, editing and analysing files stored in Box
Sends a local file to a KOReader-running Kindle over SSH and opens it on the e-ink screen
By Rune Kaagaard (individual) Python Local · stdio Files and storageProductivity
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs KINDLE_ALLOWED_DIRECTORIES. Replace each <NAME> with your value.
claude mcp add show-on-kindle -e KINDLE_ALLOWED_DIRECTORIES=<KINDLE_ALLOWED_DIRECTORIES> -- uvx --from mcp-show-on-kindle==2026.10.15.202733 --refresh-package mcp-show-on-kindle mcp-show-on-kindle{
"mcpServers": {
"show-on-kindle": {
"command": "uvx",
"args": [
"--from",
"mcp-show-on-kindle==2026.10.15.202733",
"--refresh-package",
"mcp-show-on-kindle",
"mcp-show-on-kindle"
],
"env": {
"KINDLE_ALLOWED_DIRECTORIES": "<KINDLE_ALLOWED_DIRECTORIES>"
}
}
}
}{
"mcpServers": {
"show-on-kindle": {
"command": "uvx",
"args": [
"--from",
"mcp-show-on-kindle==2026.10.15.202733",
"--refresh-package",
"mcp-show-on-kindle",
"mcp-show-on-kindle"
],
"env": {
"KINDLE_ALLOWED_DIRECTORIES": "<KINDLE_ALLOWED_DIRECTORIES>"
}
}
}
}{
"servers": {
"show-on-kindle": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"mcp-show-on-kindle==2026.10.15.202733",
"--refresh-package",
"mcp-show-on-kindle",
"mcp-show-on-kindle"
],
"env": {
"KINDLE_ALLOWED_DIRECTORIES": "<KINDLE_ALLOWED_DIRECTORIES>"
}
}
}
}[mcp_servers.show-on-kindle]
command = "uvx"
args = ["--from", "mcp-show-on-kindle==2026.10.15.202733", "--refresh-package", "mcp-show-on-kindle", "mcp-show-on-kindle"]
[mcp_servers.show-on-kindle.env]
KINDLE_ALLOWED_DIRECTORIES = "<KINDLE_ALLOWED_DIRECTORIES>"gemini mcp add --scope user -e KINDLE_ALLOWED_DIRECTORIES=<KINDLE_ALLOWED_DIRECTORIES> show-on-kindle uvx -- --from mcp-show-on-kindle==2026.10.15.202733 --refresh-package mcp-show-on-kindle mcp-show-on-kindleKINDLE_ALLOWED_DIRECTORIES |
Required: Comma-separated local directories that show may read files from. Without it every call is refused. |
|---|---|
KINDLE_SSH_KEY |
Optional: Path to the private key ssh should use, with IdentitiesOnly. Unset, ssh picks its default identities. |
KINDLE_HOST |
Optional: Kindle IP address. Unset, the server sweeps the local /24 and caches what it finds. |
KINDLE_SSH_PORT |
Optional: Port of KOReader's SSH server plugin. |
KINDLE_HTTP_PORT |
Optional: Port of KOReader's HTTP inspector on the Kindle. |
KINDLE_DIR |
Optional: Folder on the Kindle that files are copied into. |
KINDLE_KNOWN_HOSTS |
Optional: Known-hosts file that holds the pinned Kindle host key. |
mcp-show-on-kindle is a small Python MCP server for people who read on a jailbroken Kindle running KOReader. It has one tool, show, which takes the absolute path of a file on your computer, copies it onto the Kindle and makes KOReader open it right away. That way an assistant can put a document, a draft or a long answer in front of you on e-ink.
It finds the Kindle by scanning your local /24 subnet for an SSH banner that mentions KOReader, unless you set KINDLE_HOST. It caches the address it finds. The file goes over KOReader's SSH server plugin as root. The server then calls KOReader's HTTP inspector plugin through that same SSH session, against the Kindle's loopback address, and polls until KOReader reports the file as open. Only SSH crosses the network.
The code at the released tag has details the README leaves out. KINDLE_ALLOWED_DIRECTORIES takes a comma-separated list. The Kindle's host key is accepted on first contact (StrictHostKeyChecking=accept-new) under the fixed alias "kindle". The found IP is cached in $XDG_CACHE_HOME/mcp-show-on-kindle/host, or ~/.cache if that is unset. Each SSH call times out after 60 seconds. After asking KOReader to open the file, the server checks up to eight times, two seconds apart, before it reports that the copy worked but the file did not open. When KINDLE_SSH_KEY is set, ssh uses only that key (IdentitiesOnly=yes). A code comment explains why: a service started at boot has no ssh agent to unlock a passphrase-protected default key (mcp_show_on_kindle/server.py).
It runs over stdio by default. It can also run as a long-lived service with --transport streamable-http or sse, which listens on 127.0.0.1:7004 unless --host and --port are given.
| Runtime | Python |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
In KOReader, turn on the SSH server plugin (port 2222) and the HTTP inspector plugin (port 8080), both on autostart. Make a passphrase-less key, add its public half to /mnt/us/koreader/settings/SSH/authorized_keys on the Kindle, and point KINDLE_SSH_KEY at the private half. The README also gives an iptables rule to block port 8080 from the network, to be added near the top of /mnt/us/koreader/koreader.sh so it survives a reboot.
There is one tool and it only sends and opens a single file. It cannot list, read back or delete anything on the Kindle. Without KINDLE_ALLOWED_DIRECTORIES every call is refused, and paths must be absolute. Characters in the file name outside [A-Za-z0-9._-] become underscores, and a file with the same cleaned-up name in KINDLE_DIR (default /mnt/us/documents/llm) gets overwritten. Auto-discovery only scans the computer's own IPv4 /24, so on another network layout you need KINDLE_HOST. The first call after changing networks is slow while it sweeps the subnet. The Kindle has to be awake.
It suits people who already run KOReader on a Kindle and want an assistant to push a file onto the reader, on their own home network. It needs a jailbroken device, plugin setup and SSH keys, so it is not for a stock Kindle. It will not deliver to Amazon's Send-to-Kindle service either. Pick something else if you want an assistant to manage a library or read highlights, because this server only sends and opens files.
1 changes things. A ? marks an optional parameter.
show changesfile_path: string