# Deploy Teddy MCP → blackbean.io.vn (OpenClaw)

Hướng dẫn gắn OpenClaw với site live **https://blackbean.io.vn** qua MCP bridge (`mcp-server/`).

> Bridge chạy trên máy OpenClaw (stdio), **không** chạy trong PHP trên server. WordPress chỉ cần Teddy REST domain-tools + Application Password.

```
OpenClaw ──stdio──▶ teddy-mcp (máy local)
                         │
                         │ HTTPS + Basic (App Password)
                         ▼
              https://blackbean.io.vn/wp-json/teddy/v1
                 GET  /domain-tools
                 POST /tools/{name}/execute
```

---

## Checklist nhanh

| # | Việc | Ai làm |
|---|------|--------|
| 1 | Teddy active + **Agent Pipeline** bật | Admin WP |
| 2 | Tạo Application Password cho `vinhnx` | Admin WP |
| 3 | `npm install` trong `mcp-server/` (máy OpenClaw) | Dev |
| 4 | Cấu hình env live + `npm run probe` | Dev |
| 5 | `openclaw mcp add teddy-live …` + `doctor --probe` | Dev |
| 6 | Upload zip Teddy mới (có `mcp-server/` + docs) | Admin WP |

---

## 1. WordPress (blackbean.io.vn)

### 1.1 Bật Agent Pipeline

**Teddy → Settings** → bật **Agent Pipeline** (`use_agent_pipeline`).

Không bật thì `GET /wp-json/teddy/v1/domain-tools` sẽ không đăng ký route.

### 1.2 Application Password

Đăng nhập user **`vinhnx`** (administrator hoặc đủ capability tool cần):

1. **Users → Profile** (hoặc **Users → All Users → vinhnx**)
2. mục **Application Passwords**
3. Name: `openclaw-teddy-live`
4. **Add New Application Password** → copy chuỗi (chỉ hiện 1 lần)

Giữ password offline; không commit vào git.

### 1.3 Kiểm tra REST (tuỳ chọn)

Không auth phải trả **401** (route tồn tại):

```bash
curl -sS -o /dev/null -w "%{http_code}\n" \
  https://blackbean.io.vn/wp-json/teddy/v1/domain-tools
# kỳ vọng: 401
```

Có auth (thay USER / APP_PASS):

```bash
curl -sS -u 'vinhnx:APP_PASS_NO_SPACES' \
  https://blackbean.io.vn/wp-json/teddy/v1/domain-tools | head
# kỳ vọng: JSON array các tool
```

---

## 2. Máy chạy OpenClaw

Bridge dùng code trong repo Teddy (hoặc zip đã giải nén):

```bash
cd /path/to/teddy/mcp-server
npm install
```

### 2.1 File `.env` live (local, gitignored)

```bash
cp .env.example .env.live
```

Nội dung gợi ý:

```env
TEDDY_BASE_URL=https://blackbean.io.vn
TEDDY_AUTH=application_password
TEDDY_USERNAME=vinhnx
TEDDY_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx

# Cert Let's Encrypt hợp lệ → để false
TEDDY_INSECURE_TLS=false

TEDDY_AUTO_APPROVE_DANGEROUS=false
TEDDY_TIMEOUT_MS=60000

# Manager allowlist (read + careful writes)
TEDDY_TOOL_ALLOWLIST=site.briefing,content.gaps,content.scheduled,comment.list,comment.set_status,post.list,post.create,post.update,site.statistics,docs.search,seo.meta.generate,media.find_missing_alt,ops.recent_changes,ai.usage.summary,knowledge.status,system.ping,system.clear_cache,wc.product.low_stock,wc.order.list,wc.report.revenue
TEDDY_TOOL_DENYLIST=system.wp_cli,system.optimize_db,system.backup.run,system.send_email
```

Approvals over Zalo: [approvals-zalo.md](./approvals-zalo.md). Playbooks: [docs/playbooks/](../../playbooks/).


Probe:

```bash
set -a && source .env.live && set +a
npm run probe
```

Kỳ vọng `"ok": true` và `tool_count` > 0.

### 2.2 Đăng ký OpenClaw (`teddy-live`)

Giữ server `teddy` trỏ local `blackbean.test`; thêm server riêng cho live:

```bash
MCP=/path/to/teddy/mcp-server
set -a && source "$MCP/.env.live" && set +a

openclaw mcp add teddy-live \
  --command node \
  --arg "$MCP/src/index.js" \
  --cwd "$MCP" \
  --env "TEDDY_BASE_URL=$TEDDY_BASE_URL" \
  --env "TEDDY_AUTH=$TEDDY_AUTH" \
  --env "TEDDY_USERNAME=$TEDDY_USERNAME" \
  --env "TEDDY_APP_PASSWORD=$TEDDY_APP_PASSWORD" \
  --env "TEDDY_INSECURE_TLS=$TEDDY_INSECURE_TLS" \
  --env "TEDDY_AUTO_APPROVE_DANGEROUS=$TEDDY_AUTO_APPROVE_DANGEROUS" \
  --env "TEDDY_TIMEOUT_MS=$TEDDY_TIMEOUT_MS" \
  --env "TEDDY_TOOL_ALLOWLIST=$TEDDY_TOOL_ALLOWLIST" \
  --env "TEDDY_TOOL_DENYLIST=$TEDDY_TOOL_DENYLIST"

openclaw mcp doctor teddy-live --probe
openclaw mcp probe teddy-live --json
```

Thử trong session: `teddy-live__teddy_ping` hoặc `teddy-live__teddy_site_briefing`.

### 2.3 Morning briefing (cron + Zalo)

Prefer cron for a fixed time (after zalouser pairing):

```bash
openclaw cron add \
  --name teddy-daily-briefing \
  --cron "0 8 * * *" \
  --tz Asia/Ho_Chi_Minh \
  --session isolated \
  --announce \
  --channel zalouser \
  --message "Run teddy-live site.briefing. If needs_attention, summarize actionable for me. Else reply HEARTBEAT_OK."
```

Heartbeat alternative: fill `~/.openclaw/workspace/HEARTBEAT.md` (already ships a Teddy checklist).

### 2.4 Dangerous tools

Mặc định: preview → gọi lại với `approved: true` + `approval_token`.

Chỉ bật `TEDDY_AUTO_APPROVE_DANGEROUS=true` nếu agent được tin cậy hoàn toàn trên live.

---

## 3. Bảo mật live

- Dùng Application Password riêng; revoke ngay nếu lộ.
- Prefer user dedicated (hoặc giữ `vinhnx` nhưng **allowlist** hẹp).
- Không commit `.env` / `.env.live` / password trong `openclaw.json` lên git công khai.
- OpenClaw có thể cảnh báo “literal sensitive value” — chấp nhận được trên máy local; hoặc inject env từ shell trước khi start gateway.
- Deny: `system.wp_cli`, `system.optimize_db`, backup/email trừ khi thật sự cần.

---

## 4. Update plugin zip trên live

Sau khi MCP live probe OK, build từ máy dev:

```bash
cd wp-content/plugins/teddy
npm run release          # cần build/ sẵn
# hoặc
npm run release:full     # build JS/CSS rồi zip
```

Output: `release/teddy.zip` → **Plugins → Add New → Upload** trên blackbean.io.vn.

Zip gồm `mcp-server/` (không gồm `node_modules` / `.env`). Trên server WP, folder này chủ yếu để tài liệu/ops; OpenClaw vẫn chạy bridge từ máy local (hoặc host riêng).

---

## 5. Troubleshooting

| Triệu chứng | Kiểm tra |
|-------------|----------|
| `Unexpected /domain-tools` / 404 | Agent Pipeline off; plugin cũ; permalink |
| 401 sau khi có password | Sai user/pass; khoảng trắng password; App Passwords bị plugin bảo mật chặn |
| 403 | User thiếu capability (`edit_posts` / tool-specific) |
| TLS error | Cert hết hạn; tạm `TEDDY_INSECURE_TLS=true` chỉ để debug |
| 0 tools | Allowlist quá chặt; pipeline off |
| OpenClaw không thấy server | `openclaw mcp list` / restart gateway |

---

## Liên quan

- [mcp-server/README.md](../../../mcp-server/README.md)
- [mcp-bridge overview](./README.md)
- OpenClaw MCP CLI: https://docs.openclaw.ai/cli/mcp
