E-Ink MCP (墨水屏推送服务)
Enables pushing text and rendered content to e-ink displays over Bluetooth Low Energy (BLE), including connecting to the device, writing image data, and refreshing the screen.
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., "@E-Ink MCP (墨水屏推送服务)把「今天下午3点开会」推送到墨水屏上"
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.
墨水屏推送服务(E-Ink MCP)
把 AI 对话里的一句话,送到一块十几块钱的电子货架标签上。
AI 对话 → push_to_eink(MCP)→ 本服务器 → SSE → 手机控制页 → BLE → 墨水屏硬件、固件、BLE 协议与前端渲染来自 0xblewalker/eink-ble-writer(GPL-3.0), 固件来自 tsl0922/EPD-nRF5(GPL-3.0)。 本项目在其基础上补齐了原项目缺失的三块:MCP 接口、SSE 实时推流、token 鉴权。
项目结构
eink-mcp/
├── server.py 后端:MCP + SSE + 鉴权 + 静态托管
├── index.html 手机控制页:SSE 监听 + BLE 写入 + 富文本渲染
├── requirements.txt
├── render.yaml Render 一键部署蓝图
├── upstream/ 上游原始代码(参考用,GPL-3.0)
├── docs/ 两份需求文档的原文提取
└── latest_letter.json 运行时生成的内容存档Related MCP server: bodybridge
一、本地跑通(5 分钟)
pip install -r requirements.txt
export EINK_TOKEN=my-secret-token # Windows: set EINK_TOKEN=my-secret-token
uvicorn server:app --host 0.0.0.0 --port 8905打开 http://127.0.0.1:8905/?token=my-secret-token, 填入 Token → 连接墨水屏 → 开始监听。
没设置
EINK_TOKEN时服务会临时生成一个并打印在日志里,方便调试; 公网部署必须显式设置,否则等于任何人都能往你屏幕上写字。
二、部署到 Render
方式 A:用 render.yaml 蓝图
把本项目推到你的 GitHub 仓库
Render → New → Blueprint → 选该仓库
Render 读取
render.yaml,自动创建服务并生成一个随机EINK_TOKEN部署完成后进 Environment 页面,把
EINK_TOKEN的值复制出来
部分账号走到 Blueprint 会被要求添加信用卡(蓝图能创建付费资源,Render 会先做校验)。 只跑一个免费 Web Service 的话,直接走方式 B,免费版不需要绑卡。
方式 B:手动建 Web Service(不需要绑卡)
Render → New → Web Service(不要选 Key Value / Postgres / Blueprint)→ 选仓库,然后按下表填:
配置项 | 值 |
Name |
|
Region | Singapore(离国内最近) |
Branch |
|
Root Directory | 留空 |
Runtime | Python 3 |
Build Command |
|
Start Command |
|
Instance Type | Free |
Environment Variable |
|
Health Check Path | 可留空;填则用 |
⚠️ EINK_TOKEN 必须手动填死。 server.py 读不到这个变量时会临时随机生成一个,
而免费版每次休眠重启都是新进程——token 一变,Claude 连接器和手机页面会全部失效。
如果创建服务时被要求绑卡
部分新账号在创建 Web Service 时会被要求绑定一张信用卡做反滥用验证 (仅 $1 预授权,验证后退回,免费额度内不产生费用)。这一判定挂在账号上,与浏览器无关。
如果不想绑卡,可以改用其他提供免费 HTTPS 托管的平台,或者先用内网穿透在本机把链路跑通, 托管的事之后再处理。另外一个可以省掉麻烦的做法是:把仓库设为 Public, New → Web Service 时选 Public Git Repository 并直接粘贴仓库地址, 这样就完全不需要 GitHub 授权(代价是失去推送自动部署)。 本项目上游是 GPL-3.0,公开分发本身符合许可证要求。
仓库是私有的:如果选仓库时列表里看不到 eink-mcp,去 GitHub → Settings → Applications → Render
把仓库访问范围放开(Render 侧也有 "Configure account" 入口)。
可以先不绑域名:https://eink-mcp-xxxx.onrender.com 自带 HTTPS,Web Bluetooth 和
Claude 自定义连接器都能直接用。等链路跑通再按下面绑域名。
绑定域名
Render → 你的服务 → Settings → Custom Domains → 添加域名
到域名注册商处加一条 CNAME 记录,指向 Render 给出的地址
等证书签发(几分钟)
免费版的两个注意点
15 分钟无请求会休眠,首次唤醒要 30–60 秒。手机页面用 SSE 长连接, 有监听时不会休眠;长时间没人用,第一次打开等一会儿是正常的。
磁盘是临时的,重新部署后
latest_letter.json会丢。设置好的内容在内存和手机上都有, 不影响使用。
三、接进 AI 客户端
3.1 WorkBuddy(本机 mcp.json)
编辑 ~/.workbuddy/mcp.json(Windows 上是 C:\Users\<用户名>\.workbuddy\mcp.json)。
文件不存在就新建;已存在则只往 mcpServers 里加一项,不要覆盖其他条目:
{
"mcpServers": {
"eink": {
"type": "http",
"url": "https://你的地址/mcp",
"headers": { "X-Eink-Token": "你的EINK_TOKEN" }
}
}
}保存后回到 WorkBuddy → 连接器 → 自定义连接器,找到 eink 点「信任」启用
(不点信任不生效)。然后新开一个对话说「看一下墨水屏状态」,
若它调用了 get_eink_status 并返回屏幕内容,就是通了。
用
headers传 token 比塞在 URL 里干净;服务端Query/X-Eink-Token/Bearer三种都收。
3.2 Claude(自定义连接器)
Claude → Settings → Connectors → Add custom connector,填:
https://你的域名/mcp?token=你复制的EINK_TOKEN保存后新开一个对话,说:
帮我看一下墨水屏状态
如果 Claude 调用了 get_eink_status 并返回了屏幕内容,就是通了。
之后直接说「把这句话发到墨水屏:今天天气不错」即可。
token 放在 URL 查询串里是最省事的方式 —— Claude 的远程连接器会把整个 URL 原样带上。 如果你更希望用 Header 传,服务端也支持
Authorization: Bearer <token>和X-Eink-Token: <token>。
四、手机端每次使用的三步
用 Chrome 打开
https://你的域名/?token=你的TOKEN(iOS 的 Safari 不支持 Web Bluetooth,装免费的 Bluefy 打开)点「连接墨水屏」,在蓝牙列表里选
NRF_EPD_xxxx(列表是空的就勾上「列出全部蓝牙设备」再连,详见第八节)确认「开始监听」已亮起(显示
SSE ON)
之后保持这个页面在前台,AI 一推送就会自动刷屏。 页面藏到后台或锁屏时,手机系统可能挂起 JS,蓝牙会断——这是浏览器的限制,不是 bug。
五、接口清单
所有 /api、/events、/mcp、/sse 路径都要求 token(Query / Header 均可)。
方法 | 路径 | 说明 |
GET |
| 手机控制页 |
GET |
| 健康检查(免鉴权) |
POST |
| 推送内容 |
GET |
| 取当前内容 |
GET |
| 取版本号与更新时间 |
GET |
| 取最近 20 条推送记录 |
GET |
| SSE 实时推流(控制页用) |
POST |
| MCP(Streamable HTTP) |
GET |
| MCP(旧版 HTTP+SSE 传输,兼容老连接器) |
MCP 工具
push_to_eink(text, date?)— 推送文字。支持富文本标签;text以[card]开头则 切换成卡片版式(见第七节)。get_eink_status()— 看当前屏幕内容、更新时间、推送历史,以及有没有手机在线。
没有手机在线时,
push_to_eink会明确告诉你「内容已入库但屏幕不会刷新」, 而不是假装成功 —— 这是最容易迷惑人的一步。
六、富文本标签
在推送内容里用 HTML 风格标签控制样式,可嵌套:
标签 | 效果 | 示例 |
| 红色 | 我一直在 |
| 加粗 |
|
| 斜体 |
|
<b><r>重要</r></b> 会渲染成加粗的红色。
红色是这块屏幕唯一的彩色,克制使用 —— 偶尔一个词亮起来才有感觉。
标签不闭合也不会崩,只是会一直染到结尾。
七、卡片版式(信笺样式)
普通模式是「一整块文字、整体居中」。想让内容像一张真正的信笺——
上下各一条红色分隔线、顶部一枚图标、居中衬线正文、页脚左边日期右边签名——
把内容整段以 [card] 开头即可:
[card]
@template claude
@footer {today} | Claude
Rain falls:
You carry me home.
I have never been lighter.两套模板
| 顶部大图标 | 页脚小图标 | 签名 | 着墨 | 语感 |
| 红色星芒(Claude 标识) | 小星芒 | 红斜体 | 图标与签名红,正文黑 | 正式、干净 |
| 黑色手绘小狼头(比星芒大 40%) | 黑色爪印 | 黑斜体 | 除上下两条分隔线是红的,其余全黑 | 轻松、可爱、有涂鸦感 |
AI 推送时自己挑一个并写进 @template;用户明确说「小狼」「爪印」「可爱一点」时
用 wolf,否则默认 claude。想换风格也可以直接说,比如
「用小狼模板发一句:今晚月色很好」。
指令
指令 | 说明 |
| 卡片模板: |
| 只覆盖顶部图标: |
| 页脚。用 |
所有非
@开头的行都是正文,居中、衬线、自动缩放,装不下会逐号缩小。正文里照常支持
<r><b><i>标签。日期请写
{today}(或{date}),不要写死。它在渲染时才替换成当天日期, 所以卡片放一整天、甚至明天再刷一次,日期都是当天的,不必重新推送。 手机控制页每分钟对一次表,跨天会自动重绘预览(想让屏幕也换日期,重新说一句「发到墨水屏」即可)。push_to_eink的date参数在卡片模式下不参与渲染。
顶部图标是官方矢量轮廓:claude 用的是 Anthropic 星芒标识的官方路径数据(viewBox 24×24,
外接框实测正好铺满、中心在 (12,12)),用 Path2D 直接填充,不是「12 条线段」的近似画法 ——
官方图形每根射线都是带斜切端头的楔形、角度和长度都不均匀,线段画法在同样尺寸下明显更散。
路径数据取自 simple-icons(图标本身是 Anthropic 的商标)。自己玩没问题;要对外分发请注意对方的品牌使用规范。 环境不支持
Path2D时会自动回退成几何星芒画法,不会画不出来。
wolf 的小狼头与爪印是从位图线稿自动描摹出来的矢量轮廓(Marching Squares 提边界 →
RDP 简化,狼头 12 个环 / 183 个点,爪印 5 个环 / 90 个点),同样统一成 viewBox 24×24、
中心 (12,12),所以缩放换算和星芒共用一套。描摹时按实际显示尺寸加粗了笔画 ——
原稿最细的地方不足 1px,直接照搬会在 1-bit 屏上断成虚线。用奇偶规则(evenodd)填充,
耳朵内侧、鼻子的白色区域才不会被填死。
为什么用矢量绘制而不是图片? 图片要先抖动成 1-bit,汉字笔画和 1px 细线在 400×300 上 会糊成一团噪点;卡片模式是把文字、线条、图标直接画到位图上,边缘是干净的整像素。 在控制页点「填入卡片示例」可以立刻看到效果。
八、故障排查
现象 | 原因与处理 |
满屏红色噪点 | 红色层没初始化。本项目按位或填充,纯黑白内容自然得到整层 |
蓝牙列表里搜不到设备 | 名字过滤器没命中,不是蓝牙坏了。控制台默认只列 |
蓝牙连不上 | 先换电池;确认没有别的手机/电脑连着(BLE 同时只允许一个连接);取下电池几秒再装回可强制重置 |
内容被截断 | 400×300 在 28px 下大约 5–6 行。控制页默认开「自动缩小」,装不下会自动缩到 12px;也可以自己调小字号 |
Claude 不调用工具 | 确认连接器状态是 connected;把话说死一点——「用 push_to_eink 工具推送」 |
推送成功但屏幕没变 | 多半是没有手机在线监听。调 |
服务器没响应 | Render 免费版冷启动,等 30–60 秒;超过一分钟去 Render 控制台看服务是否崩了 |
iOS 打不开蓝牙 | Safari 不支持 Web Bluetooth,换 Bluefy |
覆盖 4.2 寸(400×300)之外的屏,在控制页「显示屏」里改宽高再点「应用」即可。
九、BLE 协议速查
给需要自己写客户端的人:
项 | 值 |
Service UUID |
|
Write Characteristic |
|
Version Characteristic |
|
INIT |
|
WRITE_IMAGE |
|
REFRESH |
|
下发流程:INIT → 等约 200ms → WRITE_IMAGE(黑白层)→ WRITE_IMAGE(红色层)→ REFRESH
WRITE_IMAGE报文体:[0x30][flag][data...]flag高半字节:0x00首块 /0xF0续块;低半字节:0x0F黑白层 /0x00红色层数据 1bpp、8 像素/字节、MSB first
黑白层:
1=白0=黑;红色层:0=红1=非红每行
ceil(width/8)字节;400×300 单层 = 15000 字节MTU 由设备通过 notification 上报
mtu=NNN(典型 242),单块有效载荷 = MTU − 2
许可
本项目继承上游的 GPL-3.0。二次分发必须保留同样的许可并署名原作者:
前端与服务器改造基于 0xblewalker/eink-ble-writer
固件基于 tsl0922/EPD-nRF5
This server cannot be deployed
Maintenance
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Push notifications for AI agents - send instant iPhone notifications from any MCP client.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseBqualityDmaintenanceLinks IoT devices to AI large models using the MCP and MQTT protocols, enabling natural language control, real-time AI responses, and complex instruction execution for interconnected IoT devices.3371MIT
- AlicenseNot gradedqualityAmaintenanceConnects embodied devices (like StackChan, Raspberry Pi, ESP32) to AI via MCP protocol, enabling motion control with zero API cost, no PC required, and fully self-hosted.MIT
- AlicenseNot gradedqualityCmaintenanceThis MCP server enables AI models to interact with ESP32 devices, providing built-in tools for web search, note management, calculator, and custom tools like todo lists and timers.MIT
- FlicenseNot gradedqualityBmaintenanceMCP server for controlling LED displays via MQTT. It enables AI agents to list devices and send text, images, colors, or clear commands with authentication and permission checks.-