acp-router
Route plain-language requests for Pi, Claude Code, Codex, OpenCode, Gemini CLI, or ACP harness work into either OpenClaw ACP…
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
$ npx -y skills add luyike221/xiaohongshu-mcp-python --skill canvas --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/canvasContext preview
The summary Claude sees to decide when to auto-load this skill.
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
The canvas tool lets you present web content on any connected node's canvas view. Great for:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ Canvas Host │────▶│ Node Bridge │────▶│ Node App │ │ (HTTP Server) │ │ (TCP Server) │ │ (Mac/iOS/ │ │ Port 18793 │ │ Port 18790 │ │ Android) │ └─────────────────┘ └──────────────────┘ └─────────────┘
1. **Canvas Host Server**: Serves static HTML/CSS/JS files from `canvasHost.root` directory 2. **Node Bridge**: Communicates canvas URLs to connected nodes 3. **Node Apps**: Render the content in a WebView
The canvas host server binds based on `gateway.bind` setting:
| Bind Mode | Server Binds To | Canvas URL Uses | | ---------- | ------------------- | -------------------------- | | `loopback` | 127.0.0.1 | localhost (local only) | | `lan` | LAN interface | LAN IP address | | `tailnet` | Tailscale interface | Tailscale hostname | | `auto` | Best available | Tailscale > LAN > loopback |
**Key insight:** The `canvasHostHostForBridge` is derived from `bridgeHost`. When bound to Tailscale, nodes receive URLs like:
http://<tailscale-hostname>:18793/__openclaw__/canvas/<file>.html
This is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
| Action | Description | | ---------- | ------------------------------------ | | `present` | Show canvas with optional target URL | | `hide` | Hide the canvas | | `navigate` | Navigate to a new URL | | `eval` | Execute JavaScript in the canvas | | `snapshot` | Capture screenshot of canvas |
In `~/.openclaw/openclaw.json`:
{
"canvasHost": {
"enabled": true,
"port": 18793,
"root": "/Users/you/clawd/canvas",
"liveReload": true
},
"gateway": {
"bind": "auto"
}
}When `liveReload: true` (default), the canvas host:
Great for development!
Place files in the canvas root directory (default `~/clawd/canvas/`):
cat > ~/clawd/canvas/my-game.html << 'HTML' <!DOCTYPE html> <html> <head><title>My Game</title></head> <body> <h1>Hello Canvas!</h1> </body> </html> HTML
Check how your gateway is bound:
cat ~/.openclaw/openclaw.json | jq '.gateway.bind'
Then construct the URL:
Find your Tailscale hostname:
tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'
openclaw nodes list
Look for Mac/iOS/Android nodes with canvas capability.
canvas action:present node:<node-id> target:<full-url>
**Example:**
canvas action:present node:mac-63599bc4-b54d-4392-9048-b97abd58343a target:http://peters-mac-studio-1.sheep-coho.ts.net:18793/__openclaw__/canvas/snake.html
canvas action:navigate node:<node-id> url:<new-url> canvas action:snapshot node:<node-id> canvas action:hide node:<node-id>
**Cause:** URL mismatch between server bind and node expectation.
**Debug steps:**
1. Check server bind: `cat ~/.openclaw/openclaw.json | jq '.gateway.bind'` 2. Check what port canvas is on: `lsof -i :18793` 3. Test URL directly: `curl http://<hostname>:18793/__openclaw__/canvas/<file>.html`
**Solution:** Use the full hostname matching your bind mode, not localhost.
Always specify `node:<node-id>` parameter.
Node is offline. Use `openclaw nodes list` to find online nodes.
If live reload isn't working:
1. Check `liveReload: true` in config 2. Ensure file is in the canvas root directory 3. Check for watcher errors in logs
The canvas host serves from `/__openclaw__/canvas/` prefix:
http://<host>:18793/__openclaw__/canvas/index.html → ~/clawd/canvas/index.html http://<host>:18793/__openclaw__/canvas/games/snake.html → ~/clawd/canvas/games/snake.html
The `/__openclaw__/canvas/` prefix is defined by `CANVAS_HOST_PATH` constant.
xiaohongshu-mcp-python 是一个基于现代 Python 技术栈开发的小红书内容自动化发布工具,通过 Model Context Protocol(MCP)协议为 AI 客户端提供强大的小红书操作能力。项目核心功能包括小红书账户登录管理、图文内容发布、视频内容发布、内容搜索与获取、帖子详情查看以及评论互动等。支持多种图片格式(JPG、PNG、GIF)和视频格式(MP4、MOV、AVI),既可处理本地文件路径,也支持 HTTP/HTTPS 链接,为用户提供灵活的内容发布方案。 该工具特别适合内容创作者、营销人员和开发者使用,能够显著提升小红书内容发布的效率和自动化程度。通过标准化的 MCP 接口,用户可以轻松地将小红书操作能力集成到各种 AI 工作流中,实现智能化的内容管理
Route plain-language requests for Pi, Claude Code, Codex, OpenCode, Gemini CLI, or ACP harness work into either OpenClaw ACP…
Use the diffs tool to produce real, shareable diffs (viewer URL, file artifact, or both) instead of manual edit summaries.
Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.
Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.
Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.
Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.