💴【付费】小智AI × Halo 博客:用语音管理你的博客(MCP 完全指南 + 全程踩坑实录)

周店瑟谷 16 阅读 建站与数字基建

小智AI × Halo 博客:用语音管理你的博客(MCP 完全指南 + 全程踩坑实录)

最终效果:对着小智语音设备说"帮我看看博客最近的文章",它通过 MCP 协议实时调用你 Halo 博客的 45 个工具(搜索/创建/修改文章、页面、分类、标签、评论、附件、主题设置、瞬间……),并语音回答你。

环境:极空间 NAS(192.168.5.178,Docker)· Halo 2.26+(NAS 内 Docker,内网 8081,公网域名 blog.seguzhixue.top)· 小智AI(xiaozhi.me,设备 xingzhi-abs-2.0 固件 2.2.3)· Windows 电脑
桥接器:xiaozhi-mcphub(Docker 常驻 7×24)
整理日期:2026-10-03 | 全程配图已上传至本站媒体库


目录

  1. 架构与原理

  2. 准备工作

  3. Halo 侧:开启 MCP 服务与访问密钥

  4. 极空间 NAS:Docker 镜像加速

  5. 部署 mcphub 桥接器(Docker Compose)

  6. mcphub 初始化与账号体系

  7. 添加小智端点

  8. 添加 Halo 服务器(核心步骤)

  9. 测试验收

  10. 踩坑实录(六连坑,全程图文) ★重头戏

  11. 安全与运维建议

  12. 附录:命令速查 / 源码分析


一、架构与原理

1.1 为什么需要桥接器

小智和 Halo 两头协议对不上,无法直连:

端

协议

连接方向

小智云端 MCP 接入点

WebSocket(wss://api.xiaozhi.me/mcp/?token=...)

需要你这边主动连过去

Halo MCP 服务

Streamable HTTP + Bearer Token

等别人连过来

桥接器 xiaozhi-mcphub 做两件事:

  1. 主动连小智:用 WebSocket 常驻连接小智接入点,把手里的工具"上报"给小智;

  2. 主动连 Halo:作为 MCP 客户端连接 Halo 的 /mcp 端点,拉取博客的全部工具。

1.2 完整链路

你说话 → 小智语音终端(手机/音箱/设备 xingzhi-abs-2.0)
              │ 语音(WiFi)
              ▼
        小智云端 api.xiaozhi.me
              │ WebSocket 长连接(wss://api.xiaozhi.me/mcp/?token=...)
              ▼
   ┌──────────────────────────────────────────────┐
   │  极空间 NAS  192.168.5.178(Docker)           │
   │                                              │
   │  ┌────────────────────────┐                  │
   │  │ mcphub 桥接器           │ Web管理 :8090    │
   │  └───────────┬────────────┘                  │
   │              │ HTTP + Bearer Token           │
   │              ▼                               │
   │  Halo 博客  blog.seguzhixue.top/mcp          │
   │  (NAS 内网端口 :8081,Nginx/网关转回)         │
   │                                              │
   │  ┌────────────────────────┐                  │
   │  │ PostgreSQL(mcphub-db) │ :5432 内部       │
   │  └────────────────────────┘                  │
   └──────────────────────────────────────────────┘
              │ 查询结果原路返回
              ▼
        小智语音播报结果

1.3 工具命名规则

小智端看到的工具名格式为:服务器名-工具名,例如 halo-seguzhixue-halo_search_content(服务器叫 halo-seguzhixue,工具是 halo_search_content)。所以服务器命名时用有辨识度的名字。

1.4 mcphub 的依赖

mcphub 用 PostgreSQL + pgvector 存配置(服务器、端点、用户、日志),所以 NAS 上要跑两个容器:mcphub(本体)+ db(数据库)。


二、准备工作(三样凭证)

#

凭证

获取方式

用途

1

Halo MCP 访问密钥

Halo 后台 → MCP 服务 → 新建访问密钥

hmcp_ 开头,只显示一次,务必当场保存

2

小智 MCP 接入点 URL

xiaozhi.me → 智能体 → 配置角色 → 扩展能力 → MCP 接入点

wss://api.xiaozhi.me/mcp/?token=...

3

Halo 的 MCP 端点地址

确认"从 NAS 能访问到 Halo 的地址"

本例最终用域名 http://blog.seguzhixue.top/mcp

小智智能体配置页的 MCP 接入点
Halo 后台的 MCP 服务总览
Halo MCP 已链接的 45 个工具

密钥权限最小化:首次只勾"搜索/查看"类只读工具,确认稳定后再逐步放开"创建草稿"等安全操作;发布/删除权限谨慎开放。


三、Halo 侧:开启 MCP 服务与访问密钥

  1. Halo 版本要求 ≥ 2.26.0;

  2. Halo 后台 → MCP 服务(管理入口仅超级管理员可见)→ 确认 MCP 端点已启用;

  3. 新建访问密钥:勾选允许调用的工具 → 保存 → 立即复制 token(hmcp_ 开头,只显示一次);

  4. 记下 MCP 端点地址:http://<你的Halo地址>/mcp。

建议:给小智单独建一个密钥,与其他客户端(如 WorkBuddy)隔离,方便日后单独禁用/轮换。


四、极空间 NAS:Docker 镜像加速

mcphub 的镜像托管在 Docker Hub,国内直连大概率超时。

方式 A:极空间图形界面(优先试)
Docker 应用 → 设置 → 镜像仓库,添加加速源。

方式 B:SSH 改配置
极空间系统设置开启 SSH 后登录执行:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
  ]
}
EOF

改完在图形界面重启 Docker 服务(或重启 NAS)。

实测可用的加速源(失效就换下一个):

docker.1ms.run
docker.xuanyuan.me
docker.m.daocloud.io
docker.1panel.live
docker.kejilion.pro

五、部署 mcphub 桥接器(Docker Compose)

极空间 Docker 应用 → Compose(容器编排) → 新建编排 → 粘贴以下内容 → 启动:

services:
  db:
    image: pgvector/pgvector:pg16
    container_name: mcphub-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: xiaozhi
      POSTGRES_PASSWORD: 改成你的数据库密码
      POSTGRES_DB: xiaozhi_mcphub
    volumes:
      - mcphub-db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U xiaozhi -d xiaozhi_mcphub"]
      interval: 10s
      timeout: 5s
      retries: 5

mcphub:
image: huangjunsen/xiaozhi-mcphub:latest
container_name: xiaozhi-mcphub
restart: unless-stopped
ports:
- "3000:3000"
environment:
DB_URL: postgres://xiaozhi:改成你的数据库密码@db:5432/xiaozhi_mcphub
SMART_ROUTING_ENABLED: "false"
volumes:
- mcphub-data:/app/data
depends_on:
db:
condition: service_healthy

volumes:
mcphub-db-data:
mcphub-data:

字段说明:

字段

说明

pgvector/pgvector:pg16

PostgreSQL 16 + pgvector 向量扩展(智能路由用,不用可不装外部依赖)

POSTGRES_USER/PASSWORD/DB

数据库初始化账号,与 mcphub 的 DB_URL 对应

restart: unless-stopped

常驻关键:NAS 重启后自动拉起

-p 3000:3000

mcphub Web 管理端口(本例映射到宿主 8090,按需调整,避免端口冲突)

DB_URL

指向同编排内的 db 服务

SMART_ROUTING_ENABLED=false

智能路由(向量检索选工具)默认关,开了需要 OpenAI Key

启动后两个容器均"运行中",浏览器打开 Web 管理台(本例 http://192.168.5.178:8090)。

⚠️ 排错伏笔:部署完成后记清楚两个端口——mcphub Web 管理的端口 和 Halo 博客的端口是两回事,后面坑 2 就栽在这里。


六、mcphub 初始化与账号体系

  • 默认管理员:admin / 改成你的密码,首次登录后立即在「用户」页改密码;

  • mcphub 支持多用户注册,普通用户和管理员的权限差别很大(直接决定了后面能不能连内网,见坑 3):

能力

管理员 admin

普通用户

管理服务器/端点/用户

✅

部分

创建的服务器允许连内网 IP

✅ 放行

❌ 被 SSRF 防护拦截

本文的坑 3 和坑 6 都是这一条引发的。结论先行:需要连内网服务的服务器,一律用 admin 创建。


瑟谷智学 · 全站解锁弹窗
示例页:关闭弹窗后,右下角出现「解锁全站」入口可再次唤起|嵌入博客时删除本行提示

此处内容已隐藏,「密码可见」