mcp-show-on-kindle

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

0 popularity score ★ 0

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs KINDLE_ALLOWED_DIRECTORIES. Replace each <NAME> with your value.

Claude CodeTerminal
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
Claude Desktopclaude_desktop_config.json
{
  "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>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "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>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "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>"
      }
    }
  }
}
Codex~/.codex/config.toml
[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 CLITerminal
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-kindle

Settings 7

KINDLE_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. Default 2222.
KINDLE_HTTP_PORT Optional: Port of KOReader's HTTP inspector on the Kindle. Default 8080.
KINDLE_DIR Optional: Folder on the Kindle that files are copied into. Default /mnt/us/documents/llm.
KINDLE_KNOWN_HOSTS Optional: Known-hosts file that holds the pinned Kindle host key. Default ~/.config/mcp-show-on-kindle/known_hosts.

What it does

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.

What it needs

RuntimePython
Runs onmacOS, Windows, Linux
Also
  • uv, for the uvx launch command
  • OpenSSH ssh client on PATH
  • Jailbroken Kindle running KOReader with the SSH server and HTTP inspector plugins
  • Kindle and computer on the same Wi-Fi network

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.

Limits

  • Not covered One tool that sends and opens a single file. It cannot list, read back or delete anything on the Kindle.
  • Not covered Every call is refused until KINDLE_ALLOWED_DIRECTORIES is set, and the path given must be absolute.
  • Limit File names are reduced to [A-Za-z0-9._-], and a file with the same cleaned name in KINDLE_DIR is overwritten.
  • Not covered Auto-discovery only sweeps the computer's own IPv4 /24 on KINDLE_SSH_PORT. Other layouts need KINDLE_HOST.
  • Limit The first call after changing networks is slow: the subnet sweep runs twice to wake the Kindle's Wi-Fi.
  • Platform Needs a jailbroken Kindle running KOReader. A stock Kindle and Amazon's Send-to-Kindle are not supported.

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.

Who it suits

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.

Tools 1

1 changes things. A ? marks an optional parameter.

show changes
Copies a file from an allowed local directory to the Kindle and opens it in KOReader.file_path: string

Similar servers