把 Mac mini 变成远程 AI 工作台:OpenClaw + 飞书 + cpolar 实战

前言

Mac mini 很适合拿来长期跑一些本地服务,但真正让我想把 OpenClaw 装上去的原因,不是“再多一个聊天窗口”,而是想验证一件更具体的事:人在外面时,能不能直接从飞书发消息,让家里的 Mac mini 真正执行任务。聊天回复只是第一层,我更关心的是它能不能读写文件、跑命令、截图、生成页面,甚至把做出来的东西通过浏览器分享出去。只有这些步骤真的落到本地机器上,Agent 才不只是一个换了入口的聊天机器人。

这次我从 Homebrew、Node.js 22 和 OpenClaw 开始配置,在 Mac mini 上接入硅基流动模型,再把飞书机器人完整跑通;随后实际测试截图发送、PPT 生成与打开、HTML 简历、贪吃蛇小游戏这些任务。中间也遇到了“简历链接先打开目录而不是页面”“小游戏第一次没创建出来”这类小问题。最后再安装 cpolar,把本地网页从 8080 提供到公网,并配置固定二级子域名。我也不想把权限开满以后就当作理所当然,尤其飞书消息可以远程触发本地任务时,哪些人能发消息、OpenClaw 能调用哪些工具,比功能有多少更值得先想清楚。整篇我更关心的是一条真实链路:飞书发指令 → OpenClaw 在 Mac mini 执行 → 结果回到飞书或浏览器。

1. OpenClaw 在这套方案里扮演什么角色?

image-20260308181027661

OpenClaw 在这套流程里可以理解为一个运行在本地电脑上的 AI Agent。

它和普通聊天界面的差别,不是“回答得更像人”,而是可以继续连接本地工具和系统能力。例如:

  • 读取、写入文件;
  • 执行命令;
  • 运行脚本;
  • 调用浏览器;
  • 接入消息平台;
  • 根据权限调用更多工具。

这也意味着它的权限边界比普通聊天机器人更重要。尤其后面切换到 full 工具集以后,OpenClaw 可以使用的能力会明显增加,所以我不会把“权限越大”直接当成优点,而是只在受信任环境里使用。

这次实际验证的重点是:

Mac mini 本地部署 → 模型接入 → 飞书消息 → 本地任务 → 文件 / 图片 / PPT / HTML / 小游戏 → cpolar 公网访问。

2. 先准备 Homebrew

2.1 检查 Homebrew 是否已经安装

image-20260308175148027

在 Mac mini 上打开终端。

image-20260308175456433

先执行:

brew -v

image-20260308175647321

如果能正常显示版本,就可以跳过安装。

如果没有安装,继续使用当前流程中的 Homebrew 官方安装脚本:

# 官方安装脚本(需要良好的网络环境)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

image-20260308203536663

安装完成以后,按照终端提示把 Homebrew 加入环境。

当前示例命令是:

echo >> /Users/susu/.zprofile                                                                   
echo 'eval "$(/opt/homebrew/bin/brew shellenv zsh)"' >> /Users/susu/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv zsh)"

image-20260309132744446

这里的用户目录是当前示例中的 /Users/susu/,实际使用时以终端给出的路径为准。

3. 安装 Node.js 22,并确认 Git

OpenClaw 需要 Node.js 环境。

当前使用 Homebrew 安装:

brew install node@22

image-20260308195111231

安装完成后,把 Node 22 加入 PATH:

# 1. 将路径写入你的配置文件
echo 'export PATH="/opt/homebrew/opt/node@22/bin:$PATH"' >> ~/.zshrc

# 2. 让配置立即生效
source ~/.zshrc

然后检查 Node.js、npm 和 Git:

# 1. 检查 Node.js 版本,看到类似 v22.x.x 的数字即为成功
node -v

npm -v

# 2. 检查 Git 版本,看到 git version 2.x.x 即为成功
git --version

image-20260308195300465

当前流程要求 Node.js 版本在 22 及以上;Git 没有额外指定版本要求。

4. 在 Mac mini 上安装 OpenClaw

执行当前安装命令:

curl -fsSL https://openclaw.ai/install.sh | bash

image-20260309163910640

等待安装完成。

image-20260309163938429

安装以后进入初始化向导。

5. OpenClaw 初始化:先把模型跑通

初始化时先确认安全警告。

当前流程里使用方向键选择:

YES

如果不小心退出,说明中给出的重新进入命令是:

openclaw onboard --install-daemon

image-20260308213904089

然后选择:

QuickStart

image-20260308213948288

继续进入模型提供商配置。

image-20260308214424216

5.1 这次使用硅基流动

当前示例先进入:

https://cloud.siliconflow.cn/i/TGbSCR57

image-20260228180843777

注册后领取当前页面展示的额度。

image-20260228181103563

然后创建 API Key。

image-20260228184350625

复制密钥备用。

image-20260228184453753

回到 OpenClaw,模型提供商这里选择:

Custom Provider

image-20260308214659049

API Base URL 填:

https://api.siliconflow.cn/v1

image-20260308215316382

API Key 提供方式选择:

Paste API key now

image-20260308215448458

粘贴前面创建的密钥。

image-20260308215617663

Endpoints 兼容模式保持:

OpenAI-compatible

image-20260308215653072

接着进入当前界面里写作【Mode ID】的模型选择步骤。

回车后,会需要让你输入【Mode ID】,即代表你要使用的模型,可以在模型广场选择一个你要使用的模型Code,这里以【Pro/MiniMaxAI/MiniMax-M2.5】为例:image-20260228194404720

这里使用:

Pro/MiniMaxAI/MiniMax-M2.5

image-20260308220048351

提示:

Verification successful

以后,再继续设置 Endpoint ID 和 Model alias。

image-20260308220440577

到这里,模型接入这一层先完成。

6. 接入飞书之前,先安装 Feishu 插件

模型配置完成后进入消息平台选择。

选择:

Feishu/飞书

87a7d9ab3003059ace07f684c6f2a69c

插件来源选择:

Download from npm

583bc324c46c99f93c772cc31bfe40fd

下载完成以后,向导会继续要求配置飞书应用凭证。

7. 在飞书开放平台创建机器人

打开飞书开放平台:

https://open.feishu.cn/?lang=zh-CN

image-20260309172126590

登录以后进入开发者后台。

image-20260309172223329

创建企业自建应用。

image-20260309172305256

填写应用名称、描述和图标。

image-20260309173322227

创建完成后,添加机器人能力。

image-20260309173502513

继续设置机器人名称。

image-20260309173659590

8. 导入飞书机器人权限

进入【权限管理】,点击【批量导入】。

image-20260309173916846

当前流程使用下面这份 JSON:

{
  "scopes": {
    "tenant": [
      "aily:file:read",
      "aily:file:write",
      "application:application.app_message_stats.overview:readonly",
      "application:application:self_manage",
      "application:bot.menu:write",
      "cardkit:card:write",
      "contact:user.employee_id:readonly",
      "corehr:file:download",
      "docs:document.content:read",
      "event:ip_list",
      "im:chat",
      "im:chat.access_event.bot_p2p_chat:read",
      "im:chat.members:bot_access",
      "im:message",
      "im:message.group_at_msg:readonly",
      "im:message.group_msg",
      "im:message.p2p_msg:readonly",
      "im:message:readonly",
      "im:message:send_as_bot",
      "im:resource",
      "sheets:spreadsheet",
      "wiki:wiki:readonly"
    ],
    "user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"]
  }
}

image-20260309174042981

然后继续申请新增权限。

image-20260309174115871

确认申请。

image-20260309174141809

这里不调整 JSON 中的权限名称,当前配置按已有流程保留,包括其中的 aily:file:readaily:file:write 等字段。

9. 配置 App Secret、App ID 和连接方式

进入【凭证与基础信息】,先复制:

App Secret

image-20260309174357083

回到 Mac mini 终端粘贴。

image-20260309174519963

再复制:

App ID

image-20260309174612945

继续粘贴到终端。

看到:

client ready

说明当前客户端已经准备就绪。

image-20260309174815347

后面的连接选项依次使用:

  • WebSocket (default)
  • Feishu - China
  • Allowlist

image-20260309175535466

【Group chat allowlist】这里直接回车,当前流程暂时不让机器人加入群聊。

10. 把 OpenClaw 剩余初始化跑完

【Search provider】先选择:

Skip for now

image-20260309180050088

【Configure skills now】选择:

NO

image-20260309180255800

【Enable hooks】当前流程选择全部。

image-20260309180816522

接着开始安装网关服务。

image-20260309180942010

安装完成以后选择:

Open The Web UI

image-20260309181027101

浏览器打开 OpenClaw 后,用下面这段话做第一次验证:

你好,你是谁,你当前运行在什么操作系统上,接入的上什么模型,你能够干什么,请你详细回答。

image-20260309181804916

OpenClaw 能够正常返回回答,说明 Web UI 和模型层已经跑起来。

11. 飞书还差两步:事件与发布

回到飞书开放平台。

在【事件与回调】里,把订阅方式改成:

长连接

并保存。

当前说明中特别提醒:如果 OpenClaw 网关没有启动或渠道没有添加,长连接设置会保存失败。

image-20260309182149578

接着添加事件,搜索并勾选:

接收消息

image-20260309182529797

然后进入【版本管理与发布】,创建版本。

image-20260309182629701

填写版本号、更新说明和可用范围。

image-20260309183000868

确认发布。

image-20260309183039587

12. 在飞书客户端完成机器人授权

飞书客户端下载地址:

https://www.feishu.cn/download

image-20260309183231043

登录以后,在【开发小助手】里找到机器人并打开。

image-20260309183426558

第一次发消息时,当前示例返回的是:

OpenClaw: access not configured.
Your Feishu user id: ou_c523c04accc3966f4c80893bd59e06c7
Pairing code: FLK2Z9XT
Ask the bot owner to approve with:
openclaw pairing approve feishu FLK2Z9XT

image-20260309183525259

这里会给出 Feishu user id 和 Pairing code。

然后回到 Mac mini 执行授权命令:

openclaw pairing approve feishu FLK2Z9XT

image-20260309183753230

授权成功以后,再从飞书发送消息测试。

image-20260309184135495

到这里,这条基础链路已经成立:

飞书 → OpenClaw 网关 → 模型 → Mac mini → 飞书回复。

13. 真正决定它“能做多少”的,是 tools.profile

默认情况下,当前说明里 OpenClaw 使用的是:

coding

工具集。

如果需要更多能力,可以切换到:

full

当前列出的工具集包括:

工具集名称说明包含工具举例
minimal只开放 session_status 工具session_status
coding编程模式(默认)文件读写、执行命令、会话、内存、图片相关
messaging消息模式消息发送、会话列表/历史/发送、session_status
full全工具模式所有工具(等同于未设置)

切换命令:

# 切换到 full 工具集
openclaw config set tools.profile full

# 重启网关使配置生效
openclaw gateway restart

image-20260311110306136

这里需要特别注意:full 不只是“功能更多”,而是权限更大。当前说明中提到它会开放发送消息、读写文件、执行命令、浏览器控制等能力,所以只适合自己信任的环境和账号。

14. 第一个实测:让 OpenClaw 截图并通过飞书发回来

先直接发送:

请你截一张当前Mac mini屏幕目前显示画面的图片,然后发送给我看一下

image-20260310181730791

当前第一次尝试并不能直接把图片发回来。

于是继续给它一段更明确的任务说明:

截图一张当前屏幕显示的界面图片发给我,我需要测试是否能正常查看该图片。
要求:
1. 飞书发送图片有大小限制(限制大约为10MB左右,建议压缩至不超过1MB,推荐分辨率1920x1080)
2. 截图图片需要放在 ~/.openclaw/workspace/tmp_files/ 目录中
3. 使用 message 工具发送给我,工具调用参数如下:
   - action: send
   - target: 从对话上下文中获取对方 ID(格式:user:ou_xxx)
   - filePath: 截图文件的绝对路径
   - message: 询问对方是否能成功看到图片
4. 询问我是否能成功看到图片,等待我回复成功提示
5. 如果我确认成功,将解决方案步骤写入 MEMORY.md

image-20260310205914247

这次成功把截图发送到了飞书。

这个过程反而很能说明 Agent 的实际使用方式:不是所有事情一句话都会一次成功,任务边界、文件路径和工具参数写清楚以后,成功率会更高。

15. 第二个实测:让它做一份 PPT

继续发送:

帮我做一个ppt,主题是:《元旦节快乐》,大概页数10张左右,要美观好看一点的,做完后打开,截张图给我看一下

如下图:image-20260311115133603

当前生成了 PPT 稿件,但没有真正打开。

于是继续:

你得打开这个ppt,然后截图这个ppt页面给我看

image-20260311120449176

这时 OpenClaw 提示 Mac mini 上没有能打开 PPT 的应用。

继续发送:

帮我安装一个吧

image-20260311120617241

当前流程里,它安装了:

WPS Office

但页面还需要同意协议并登录,所以这里手动完成了这一步。

然后继续:

好了,我登陆了一下,你帮我打开ppt,截个图给我看下内容

image-20260311120912900

PPT 成功打开并截图返回。

继续翻看以后,当前稿件确实做了大约 10 页。

image-20260311121053218

这一段不写成“AI 一句话就完整做完 PPT”,因为真实过程里至少经历了:

生成 → 没打开 → 发现缺少应用 → 安装 WPS → 手动确认 / 登录 → 再打开 → 截图返回。

16. 第三个实测:生成 HTML 简历,再让手机打开

接下来让它生成一个简历页面:

我想写一个简历,姓名就用苏苏,其他的信息你用模拟的数据就可以,请你用html帮我写一个简历的页面,要做好看一点,最后打开那个页面,截图发给我看一下

image-20260311162008809

当前 OpenClaw 完成了 HTML 页面,并在浏览器里打开后截图返回。

随后继续提出一个新的要求:

我看到了,写的很棒!但是我想在我手机上访问查看具体的效果,我电脑上有安装cpolar内网穿透并且登录了,你可以帮我把它穿透出来把链接提供给我吗?

image-20260311164759552

它返回了一个公网链接。

image-20260311165156929

第一次打开以后,页面显示的是目录,而不是直接进入简历。

这说明公网入口已经建立,但链接还少了一层具体文件路径。

点击:

resume.html

以后,实际地址是:

https://630c8107.r7.cpolar.cn/resume.html

image-20260311165339422

这次才真正进入简历页面。

手机端也继续做了访问验证。

image-20260311165642630

这一段很适合保留下来,因为它不是一个“一次成功”的理想流程,而是很真实地暴露出一个小问题:

穿透地址能打开 ≠ 已经直接打开目标文件。

17. cpolar 在这里负责什么?

前面的简历示例里,OpenClaw 已经尝试调用现有 cpolar 环境完成公网发布。

但为了把网络入口本身说清楚,后面继续手工跑一遍安装和穿透流程。

cpolar 在这套方案里只负责:

把 Mac mini 本地正在运行的 Web 服务提供到公网。

它不负责生成简历、不负责写小游戏,也不负责飞书消息和 OpenClaw 的本地任务。

image-20260311173747662

18. Mac mini 安装 cpolar

使用 Homebrew 安装:

brew tap probezy/core && brew install cpolar

image-20260311183045189

安装服务:

sudo cpolar service install

启动服务:

sudo cpolar service start

image-20260311183722235

然后检查版本:

cpolar version

注册账号。

image-20250804085039567

进入注册页面。

image-20260301193227057

本地 Web UI 地址:

http://127.0.0.1:9200

image-20250815171734046

登录以后进入后台。

image-20250815171846757

19. 再做一个更直观的任务:生成贪吃蛇小游戏

回到飞书,让 OpenClaw 创建一个移动端也能玩的贪吃蛇页面。

请你写一个贪吃蛇的小游戏,界面要好看些,还得适配移动端,写完后,把文件放在桌面,然后,把这个贪吃蛇小游戏运行起来,不用穿透,给我本地能够访问的地址

image-20260311194258268

当前第一次出现了一个小问题:没有成功创建。

继续对话以后解决了,再打开它给出的本地地址。

image-20260311192405498

小游戏可以正常操作。

snake_toGif

这一步确认的是:

飞书任务 → OpenClaw 编写页面 → 本地服务运行 → 浏览器可玩。

当前页面运行在本地:

8080

端口。

20. 手工把这个小游戏发布到公网

回到 cpolar Web UI。

默认已有两个隧道。

image-20260311195231122

编辑 website 隧道,当前设置里:

  • 协议:http
  • 本地地址:8080
  • 地区:China Top

image-20260311195518352

更新以后,在在线隧道列表看到两个 tcc01 地址,一个 HTTP,一个 HTTPS。

image-20260311195614492

访问时需要注意具体文件路径。

当前示例地址:

# 注意拼接上 snake.html
https://7c13f9f.r33.cpolar.top/snake.html

image-20260311195811198

页面可以正常打开。

这一步验证的是:

Mac mini 8080 → cpolar 随机公网地址 → /snake.html → 外部浏览器。

21. 长期使用再换固定二级子域名

随机地址适合先验证,但长期使用时更适合固定入口。

进入预留页面:

https://dashboard.cpolar.com/reserved

然后选择保留二级子域名。

image-20260311201406636

当前记录为:

  • 地区:China Top
  • 二级域名:tcc01

不同账号以自己实际保留结果为准。

回到【隧道管理 → 隧道列表】,找到:

tcc01

image-20260311201617841

把域名类型改成:

二级子域名

并填写前面保留好的名称。

image-20260311201736625

更新以后,在线隧道列表会切换成固定地址形式。

image-20260311202131929

继续用 HTTPS 测试。

image-20260311202203925

页面可以正常打开。

总结

这次把 OpenClaw 装到 Mac mini 上以后,我最大的感受并不是“终于有了一个全能 AI 管家”,而是消息入口、本地执行和公网发布真的可以被串成一条工作流

实际跑通的链路包括:

Homebrew → Node.js 22 → OpenClaw → 硅基流动 → 飞书机器人 → Pairing → tools.profile full → 截图发送 → PPT → WPS Office → HTML 简历 → 公网简历 → cpolar → 贪吃蛇 8080 → 随机公网 → 固定二级子域名 tcc01

几个边界也值得记住:

  • OpenClaw 能做什么,取决于模型、工具和权限;
  • full 工具集权限很高,不适合交给不受信任的人;
  • 飞书接入和公网发布是两条不同链路;
  • cpolar 只负责网络入口,不负责 AI 任务本身;
  • Agent 并不是每次一句话就一次成功,真实过程里也会出现缺少应用、路径没拼对、第一次创建失败等情况;
  • 本地页面能跑通以后,再做公网发布,更容易排查问题。

对我来说,Mac mini 的价值不在于“吃灰机器翻身”,而在于它可以长期在线,适合承担这种需要持续运行的本地 Agent。先把飞书消息、本地任务和公网网页这三件事分别跑通,再逐步增加权限和自动化,会比一开始就追求“全能助手”更稳。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐