内容
<div align="center">
# iMessage 网桥适用于 Poke
### 使用 Poke 读取和发送 iMessage 消息
一个小型服务器在您的 Mac 上运行,Poke 通过私人隧道与其连接,菜单栏开关控制其开启和关闭。您的消息保留在 Mac 上 — 只有您要求 Poke 读取或发送的内容才会离开 Mac。
[](https://github.com/ish-cs/imessage-poke-bridge/releases/latest)
[](https://github.com/ish-cs/imessage-poke-bridge/releases)



**[⬇️ 下载](https://github.com/ish-cs/imessage-poke-bridge/releases/latest) · [⚡ 快速开始](#快速开始) · [🛠 工作原理](#工作原理) · [❓ 常见问题](#常见问题)**
</div>
---
## 使用感受
> **您:** 最后一个人给我发了什么消息?
> **Poke:** Sarah 说了 "running 10 late, order me a flat white" — 需要我回复吗?
> **您:** 是的,告诉她我知道了 👍
> **Poke:** 已发送 ✅
您正在与一个可以访问您的真实 iMessage 消息的助手聊天 — 从您的手机、任何地方,只要您的 Mac 保持唤醒状态。
## 工作原理
```
您的手机 Poke 云端 您的 Mac(唤醒)
┌──────────┐ ┌──────────┐ 私人隧道 ┌────────────────────────────┐
│ 文本 │ ──────▶ │ Poke │ ─────────────────▶ │ FastMCP 服务器:8765 │
│ "Poke…" │ │ (LLM) │ ◀───────────────── │ └▶ imsg CLI ▶ Messages.app │
└──────────┘ └──────────┘ └────────────────────────────┘
```
Poke 是一个 MCP **主机**:它发现您的服务器公开的工具并在对话中调用它们。服务器封装了 [`imsg`](https://github.com/steipete/imsg),一个读取本地 `chat.db` 并驱动 Messages.app 的 CLI。
> **每个人都运行自己的副本。** 食谱链接 **不可共享** — 共享的链接将指向 **您的** Mac 和 **您的** 文本。分享仓库,而不是您的链接。
## 快速开始
**前提条件:** macOS 12+、[Homebrew](https://brew.sh) 和一个 [Poke](https://poke.com) 账户。
### 选项 A — 下载应用程序(最简单)
1. **[⬇️ 下载最新版本](https://github.com/ish-cs/imessage-poke-bridge/releases/latest)** 并解压。
2. 右键单击 `Install iMessage Bridge.app` → **打开** → **打开**。
*(仅需一次 — 应用程序未签名,因此 macOS 会要求您确认。)*
3. 一个终端窗口运行设置并引导您完成其余操作。
### 选项 B — 一条命令
```bash
bash <(curl -fsSL https://raw.githubusercontent.com/ish-cs/imessage-poke-bridge/main/install.sh)
```
<details>
<summary>选项 C — 克隆仓库</summary>
```bash
git clone https://github.com/ish-cs/imessage-poke-bridge.git
cd imessage-poke-bridge
./install.sh
```
</details>
无论您如何安装,它都会为您设置 **您的账户**:依赖项(`imsg`、Node、 `poke` CLI、`uv`)、服务器 + 隧道作为后台服务、日志 **您** 登录到 **您的** Poke、生成 **您的** 食谱链接,并添加菜单栏应用程序。每个安装都是完全独立的 — 您的 Poke 与您的 Mac 通信,而不是其他人的。
### 您必须授予的两个权限
macOS 需要这些权限,任何安装程序都无法为您完成:
| 权限 | 原因 | 操作方法 |
|------------|-----|-----|
| **完全磁盘访问权限** | 读取您的消息数据库 | 安装程序打印一个 Python 路径并打开面板 — 使用 `+` 添加它(或使用 `⌘⇧G` 粘贴路径)并将其打开 |
| **自动化 → 消息** | 发送文本 | 对话框在第一次发送时弹出 — 点击 **允许** |
然后点击菜单栏中的 **`iMSG ●`** (`○` = 关闭)并开始与 Poke 聊天。
## 使用它
自然地与 Poke 聊天:
- *"mom 给我发了什么消息?"*
- *"告诉 Sarah 我要迟到 10 分钟了"*
- *"今天我错过了什么?"*
- *"将 ~/Desktop/ticket.png 中的照片发送到群组"*
只要您的 Mac 处于唤醒状态,它就可以工作。盖上盖子/睡眠状态 = 桥接器处于黑暗状态,直到您唤醒它。(我们 **不** 让您的 Mac 保持唤醒状态 — 您的电池感谢我们。)
## 工具
| 工具 | 功能 |
|------|--------------|
| `list_chats` | 最近的对话 + `chat_id` + 解析的联系人姓名 |
| `read_history` | 聊天中的消息(群组发送者解析为姓名) |
| `search_messages` | 您的历史记录全文搜索 |
| `find_contact` | 姓名 → 电话/邮箱,以便 *"text Mom"* 生效 |
| `whois` | iMessage 上句柄是否可达 |
| `catch_up` | *"我错过了什么"* 跨最近的聊天记录,一次调用 |
| `send_message` | 发送文本 |
| `send_attachment` | 发送图像/文件(+ 可选文本) |
| `react` | 最新消息的 Tapback |
| `bridge_status` | 自我诊断:健康状况、联系人、发送次数、食谱链接 |
联系人姓名来自您的本地 AddressBook — 受完全磁盘访问权限的保护,因此无需额外的联系人权限。
## 菜单栏应用程序
| 项目 | 操作 |
|------|--------|
| **打开/关闭** | 启动/停止桥接器(`iMSG ●` 开启,`iMSG ○` 关闭) |
| **复制食谱链接** | 您的个人 Poke 链接 |
| **打开日志文件夹** | `~/.imsg-bridge` |
自动启动登录并自行重启如果崩溃。
## 配置
在 launchd plist 或环境中设置:
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `IMSG_SEND_LIMIT` | `30` | 每小时最大发送次数 |
| `IMSG_SEND_ALLOWLIST` | *(未设置)* | 以逗号分隔的句柄;如果设置,则仅允许这些句柄可以被发送 |
| `IMSG_POKE_USER_ID` | *(由安装程序设置)* | 您的 Poke 账户 ID — 服务器仅接受携带它的请求。安装时自动设置;请勿更改它 |
| `IMSG_MCP_TOKEN` | *(未设置)* | bearer token — **仅当您将服务器公开到公共 URL 时才设置此项**;对于私人 Poke 隧道,请保持未设置状态 |
## 安全性和隐私
- **锁定到您的 Poke 账户。** Poke 在每个请求上发送 `X-Poke-User-Id`;服务器仅接受 **您的** ID(在安装时从您的 Poke 登录捕获)。即使您的食谱链接泄露,其他人的 Poke — 不同的用户 ID — 也会立即被拒绝。安装程序拒绝设置解锁的桥接器。服务器还绑定到 `127.0.0.1`,因此它只能通过您自己的私人 Poke 隧道访问,而不能通过开放的互联网访问。
- **审计日志** — 每次发送都追加到 `~/.imsg-bridge/sends.jsonl`。查看 Poke 以您的名义执行的操作。
- **速率限制 + 允许列表** — 发送工具的防护措施(参见配置)。
- **本地优先** — 消息保留在您的 Mac 上;只有 Poke 执行的操作才会发送到 Poke 上。
> ⚠️ 消息中的任何内容 — 机密信息、2FA 代码、私人笔记 — 都变得可被 Poke 读取(一个 LLM)。请勿发送您自己的 API 密钥,如果它们已经在您的历史记录中,请立即更换。
## 故障排除
| 症状 | 修复方法 |
|---------|-----|
| **菜单栏图标丢失** | 它作为 LaunchAgent 运行;检查 `launchctl list \| grep imsgbridge`。如果不存在,请重新运行 `./install.sh`。 |
| **Poke 说 "offline / no available upstreams"** | 隧道未运行。单击菜单栏项目 → **打开**,或检查 `~/.imsg-bridge/tunnel.log`。 |
| **"can't read messages"** | 完全磁盘访问权限未授予给安装程序打印的 Python 二进制文件。 |
| **发送失败,静默无声** | 授予 **自动化 → 消息**(系统设置 → 隐私和安全 → 自动化)。 |
| **Poke 无法访问它** | 您的 Mac 睡眠了。唤醒它。 |
| **Poke 集成重复** | 在 `poke.com/settings` 中删除多余的集成;保留一个。 |
日志位于 `~/.imsg-bridge/` (`server.log`, `tunnel.log`, `menubar.log`)。
## 卸载
```bash
./uninstall.sh
```
删除服务、菜单栏应用程序和文件。在系统设置中手动撤销完全磁盘访问权限,如果您想要,在 `poke.com/settings` 中删除集成。
## 限制
- **您的 Mac 必须唤醒。** iMessage 仅存在于您的 Mac 上;没有免费的云选项(云 Mac 费用为 $100+/mo)。
- **SIP-on 功能仅限。** 打字指示器、已读回执、编辑/取消发送、投票和丰富效果需要 SIP 禁用,暂时不开放。
- **尚未 notarized.** 最低可行性产品(MVP)从源代码安装。
- **联系人匹配** 按最后 10 位数字进行,因此一些国际号码可能会匹配错误。
## 常见问题
**Poke 会获取我所有的消息吗?**
不。桥接器仅在 Poke 调用工具时读取或发送消息 — 即当您要求它时。它不会将您的历史记录流式传输到任何地方。(话虽如此,Poke 读取的内容由 LLM 处理 — 请参阅安全性和隐私。)
**其他人可以使用我的链接读取我的文本吗?**
不。服务器通过 Poke 附加到每个请求的 `X-Poke-User-Id` 锁定到您的 Poke 账户 — 其他人的 Poke 甚至如果他们获得了您的链接,也会被直接拒绝。您分享的是 **应用程序/安装程序**:每个安装的人都会获得自己的服务器、隧道和链接,与 **他们的** Mac 和 **他们的** Poke 连接。安装是完全隔离的。
**为什么我的 Mac 必须唤醒?**
iMessage 仅存在于您的 Mac 上。没有云副本可以与之通信,因此当 Mac 睡眠时,Poke 无法访问它。我们不会强制唤醒 — 那是您的电池的决定。
**运行未签名的应用程序是否安全?**
源代码都在这里,安装程序是一个可读的 shell 脚本 — 检查两者。 "未识别的开发者" 警告只是因为它尚未 notarized ([路线图](#路线图));右键单击 → 打开确认了一次。
**此功能是否需要 SIP 禁用?**
不。它仅使用 SIP 开启的功能。
**如何关闭它?**
单击菜单栏项目 → **关闭**,或运行 `./uninstall.sh` 以完全删除它。
## 路線图
- [ ] [签名 + notarized `.dmg` 安装程序](https://github.com/ish-cs/imessage-poke-bridge/issues/1) — 一键安装,无警告
- [ ] [依赖无关的 Swift/Go 重写](https://github.com/ish-cs/imessage-poke-bridge/issues/2) — 无需 Homebrew/Python/Node
## 架构
```
server.py FastMCP 服务器封装 imsg — 10 个工具,无状态 HTTP,
路径前缀 shim 用于 Poke 的 /<id>/mcp 路由,可选 bearer auth,
AddressBook 联系人解析,发送审计 + 速率限制。
menubar.py pyobjc 菜单栏控制器用于 launchd 服务。
install.sh 用户特定设置:依赖项、服务、食谱捕获、菜单栏代理。
uninstall.sh 拆除。
```
## 许可证
[MIT](LICENSE) © Ishaan Pandey
---
<div align="center">
<sub>构建于 <a href="https://github.com/steipete/imsg">imsg</a> ·
<a href="https://gofastmcp.com">FastMCP</a> ·
<a href="https://modelcontextprotocol.io">MCP</a>。不与 Apple 或 Poke 关联。</sub>
</div>