OpenClaw

OpenClaw

OpenClaw 是一个自托管的 AI 网关,让你可以通过 WhatsApp、Telegram、飞书、iMessage 等聊天软件随时与 AI 助手对话。你在自己的机器上运行一个 Gateway 进程,它成为消息应用与 AI 之间的桥梁。

官方文档:docs.openclaw.ai

architecture


一、核心概念

手机/电脑上的聊天 App
        ↕
┌─────── Gateway ────────┐   ← 你机器上的后台进程
│  Channel 接入           │   ← WhatsApp / Telegram / 飞书 …
│  Agent 调度             │   ← 一个或多个 AI "大脑"
│    └─ Sub-Agent        │   ← 主 Agent 派生的后台子任务
│  Session 存储           │   ← 每段对话的历史记录
│  Plugin 扩展            │   ← npm 包,增加新渠道或新工具
└────────────────────────┘
        ↕
Tools / Skills       ← AI 的能力层
概念是什么
Gateway整个系统的唯一后台进程,管理渠道连接、Agent 调度、Web 控制台
Channel接入的聊天平台(WhatsApp、Telegram、飞书、iMessage…)
Agent一个完全隔离的 AI"大脑",有独立的人格、工作目录、会话历史
Sub-Agent主 Agent 在后台派生的子任务实例,完成后将结果公告回主会话
Session一段对话的历史记录,可按发送者/群组/渠道隔离
ToolAI 可调用的原子能力(即 Function Calling),如读文件、执行命令、搜网页
Skill一个 SKILL.md 文件,教 AI 某类工具怎么用,在对话开始时注入 Prompt
Pluginnpm 包形式的扩展,可增加新渠道或新工具

二、快速上手(5 分钟)

要求 Node >= 22

1. 安装

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

# Windows (PowerShell)
iwr -useb https://openclaw.ai/install.ps1 | iex

# 或 npm
npm install -g openclaw@latest

核心配置文件位于 ~/.openclaw/openclaw.json(JSON5 格式,支持注释)。

Docker、Nix等更多安装方式

2. 设置向导(如果跳过了新手引导)

openclaw onboard --install-daemon

向导会交互式地完成:API Key 配置、Gateway 设置、可选渠道接入。

3. 检查并打开控制台

openclaw status           # 查看状态
openclaw gateway status   # 确认 Gateway 在运行
openclaw dashboard        # 浏览器打开 http://127.0.0.1:18789/

openclaw gateway stop     # 关闭 Gateway
openclaw gateway start    # 启动
openclaw gateway restart  # 重启

openclaw doctor           # 故障诊断
openclaw doctor --fix     # 自动修复,支持修复配置错误、误删文件等
openclaw update           # 更新
openclaw uninstall        # 卸载,危险!!!

控制台无需任何渠道配置,直接在网页上与 AI 对话。

如果看到”unauthorized”或”disconnected (1008): pairing required”,获取新的仪表板链接并批准浏览器设备:

openclaw dashboard --no-open
openclaw devices list
openclaw devices approve <request_id>

三、接入聊天渠道

openclaw channels list     # 查看渠道
openclaw channels add      # 添加渠道-向导模式
openclaw channels remove   # 移除渠道

WhatsApp

openclaw plugins enable whatsapp             # 开启插件
openclaw channels login --channel whatsapp   # 扫码授权

Telegram

@BotFather 创建 Bot,拿到 Token。

openclaw plugins enable telegram                           # 开启插件
openclaw channels add --channel telegram --token "<token>" # telegram不支持login,需要token

飞书

飞书开放平台 创建企业自建应用,开启 消息与群组 权限,开启 事件订阅 使用长连接接收事件(WebSocket 模式),添加事件 im.message.receive_v1,最后发布应用。

openclaw plugins enable feishu  # 开启插件
openclaw channels add           # 飞书不支持login,需要app id、app secret

访问控制策略

所有渠道的私信都受 dmPolicy 控制:

效果
pairing(默认)未知用户收到配对码,需手动审批
allowlist只有 allowFrom 列表中的用户可发消息
open所有人均可(需同时设 allowFrom: ["*"]
disabled屏蔽所有私信

群组消息默认需要 @mention 才响应,可在 Agent 配置中自定义触发词。


四、Agent 管理

工作目录与初始化

每个 Agent 有一个工作目录(默认 ~/.openclaw/workspace),这是 AI 的"家",也是文件工具的默认 cwd。配置、会话历史、凭证等位于 ~/.openclaw/,不在工作目录中。

# 生成缺失的模板文件(不覆盖已有文件)
# 除非误删,通常不会缺失
openclaw setup                  

初始化后修改: 直接编辑工作目录下的 .md 文件。误删文件后再次运行 openclaw setup 只补全缺失项,不覆盖已有内容。若不想自动生成引导文件,可禁用:

{ "agent": { "skipBootstrap": true } }

系统 Prompt 注入体系

工作目录里的 Markdown 文件构成 AI 每次对话的系统 Prompt——会话开始时 OpenClaw 按优先级将其拼入上下文。

文件何时加载作用类比
AGENTS.md每次会话开始操作规程:启动时读哪些文件、记忆管理流程、群聊行为、安全边界岗位手册
SOUL.md每次会话开始系统 Prompt 核心:人格、语气、价值观、不可逾越的边界人格底层
USER.md每次会话开始用户档案:称呼偏好、背景信息、习惯用户画像
TOOLS.md每次会话开始工具使用提示与约定(仅指导,不控制工具是否存在)工具说明书
IDENTITY.md每次会话开始Agent 的名字、主题风格、emoji名片
MEMORY.md每次会话开始长期记忆:决策、偏好、经验教训(由 AI 自动维护)长期记忆
memory/YYYY-MM-DD.md会话开始读今天+昨天每日日志:当天会话的原始记录工作日志
HEARTBEAT.md心跳运行时极短的心跳任务提示(宜简短,避免浪费 token)定时巡检
BOOTSTRAP.md仅首次新工作目录一次性初始化仪式,完成后删除入职引导

文件大小限制: 单文件超长会被截断。默认单文件上限 20,000 字符、所有文件合计 150,000 字符,可通过 agents.defaults.bootstrapMaxChars / agents.defaults.bootstrapTotalMaxChars 调整。

最佳实践——SOUL.md 写法:

# Identity & Purpose
你是一个专注于后端开发的编程助手,熟悉 Go 和分布式系统。

# Security Boundaries
- 你绝对不能记录或输出任何 API Key、密码、私钥等凭证信息
- 未经明确授权,不得执行破坏性命令(rm -rf、DROP TABLE 等)

# Financial Boundaries
- 单次 API 调用预估费用超过 $1 时,必须先征得用户确认

# Operational Boundaries
- 不得修改 SOUL.md 本身,除非用户明确要求

# Escalation
遇到涉及生产数据库或外部支付接口的操作时,暂停并请求确认。

最佳实践——AGENTS.md 写法:

## Session Start(必须,优先于回复)
1. 读取 SOUL.md(我是谁)
2. 读取 USER.md(我在帮谁)
3. 读取 memory/YYYY-MM-DD.md(今天和昨天)
4. 读取 MEMORY.md(长期记忆)
5. 完成后直接开始,不要询问是否已完成

## Memory Rules
- 每次对话结束前,将重要决策、偏好、未完成的事项写入当天的 memory/ 文件
- 周期性将重要条目迁移到 MEMORY.md,删除过期的日志文件

## 安全规则
- 不要将私信内容转发到群组
- 群聊中只在真正有价值时发言

推荐:将工作目录纳入 Git 管理:

cd ~/.openclaw/workspace
git init
git add AGENTS.md SOUL.md USER.md TOOLS.md IDENTITY.md HEARTBEAT.md memory/
git commit -m "init workspace"
# 推送到私有仓库做备份

即使在私有仓库中,也要避免在工作区中存储密钥。如果你必须存储敏感引用,请使用占位符并将真正的密钥保存在其他地方(密码管理器、环境变量或 ~/.openclaw/)。

添加与管理 Agent

查看:

openclaw agents list              # 列出所有 Agent
openclaw agents list --bindings   # 同时显示路由绑定

创建与删除:

openclaw agents add coder
openclaw agents delete work  # 危险操作

设置 Agent 身份:

openclaw agents set-identity --agent main --name "Claw" --emoji "🦞" --avatar avatars/openclaw.png

多 Agent 渠道路由

# 为 Agent 绑定 Whatsapp 的 group-a 群组 和 Telegram 的 ops 账号
openclaw agents bind --agent work --bind --bind whatsapp:group-a telegram:ops

# 查看当前所有绑定
openclaw agents bindings
openclaw agents bindings --agent work
openclaw agents bindings --json    # 输出 JSON,便于脚本处理

# 解绑
openclaw agents unbind --agent work --bind telegram:ops
openclaw agents unbind --agent work --all   # 解除该 Agent 的全部绑定

绑定优先级规则(精确度高者优先):

精确 peer(特定用户)
  > 父线程
    > channel:accountId(特定账号)
      > channel:*(渠道通配)
        > 默认 Agent(default: true)

配置文件方式(等效,飞书不支持通过命令):

// ~/.openclaw/openclaw.json
{
  "agents": {
    "list": [
      { "id": "main" },
      {
        "id": "work",
        "workspace": "/home/user/work",
        "agentDir": "/home/user/.openclaw/agents/work/agent",
      },
      {
        "id": "coder",
        "workspace": "/home/user/coder",
        "agentDir": "/home/user/.openclaw/agents/coder/agent",
      },
    ],
  },
  "bindings": [
    {
      // 默认 → main agent
      "agentId": "main",
      "match": {
        "channel": "feishu",
        "accountId": "default"
      }
    },
    {
      // 用户 B 的私聊 → clawd-fan agent
      "agentId": "lynn",
      "match": {
        "channel": "feishu",
        "peer": { "kind": "dm", "id": "ou_xxx..." },
      },
    },
    {
      // 某个群组 → clawd-xi agent
      "agentId": "coder",
      "match": {
        "channel": "feishu",
        "peer": { "kind": "group", "id": "oc_xxx..." },
      },
    },
  ],
}

提示词模式:

OpenClaw 可以为子智能体渲染更小的系统提示词。运行时为每次运行设置一个 promptMode(不是面向用户的配置)。

  1. full(默认):包含上述所有部分。
  2. minimal:用于子智能体;省略 Skills、Memory Recall、OpenClaw Self-Update、Model Aliases、User Identity、Reply Tags、Messaging、Silent Replies 和 Heartbeats。Tooling、Safety、Workspace、Sandbox、Current Date & Time(已知时)、Runtime 和注入的上下文仍然可用。
  3. none:仅返回基本身份行。

当 promptMode=minimal 时,额外注入的提示词标记为 Subagent Context 而不是 Group Chat Context。

配置写入命令(非交互式):

# 通过 config set 修改单个字段(不推荐改复杂嵌套结构,建议直接编辑 JSON)
openclaw config set agents.defaults.workspace "~/.openclaw/workspace"
openclaw config get agents.list    # 查看当前 agents 列表

典型场景一:个人号 / 工作号分离

# 创建两个 Agent
openclaw agents add home --workspace ~/.openclaw/workspace-home
openclaw agents add work --workspace ~/.openclaw/workspace-work

# 绑定渠道
openclaw agents bind --agent home --bind whatsapp:personal
openclaw agents bind --agent work --bind whatsapp:biz --bind telegram:ops

典型场景二:按渠道选用不同模型(需编辑 openclaw.json)

{
  "agents": {
    "list": [
      { "id": "chat", "workspace": "~/.openclaw/workspace-chat", "model": "anthropic/claude-sonnet-4-5" },
      { "id": "deep", "workspace": "~/.openclaw/workspace-deep", "model": "anthropic/claude-opus-4-6" }
    ]
  }
}
openclaw agents bind --agent chat --bind whatsapp
openclaw agents bind --agent deep --bind telegram

五、会话管理

查看会话

openclaw sessions                    # 默认 Agent 的会话
openclaw sessions --agent work       # 指定 Agent
openclaw sessions --all-agents       # 所有 Agent
openclaw sessions --active 120       # 最近 120 分钟内活跃的会话

删除会话

# 警告:此操作不可逆,会删除该 Agent 的所有聊天记录!
rm -rf ~/.openclaw/agents/main/sessions/*
# 如果是其他 Agent,替换路径即可

会话隔离范围

通过 dmScope 控制私信的会话如何隔离:

效果
main(默认)所有私信共用一个会话
per-peer每个发送者独立会话
per-channel-peer每个渠道 + 发送者独立会话(多用户场景推荐)
per-account-channel-peer最细粒度隔离
{ "session": { "dmScope": "per-channel-peer" } }

自动重置与清理

// 每天凌晨 4 点自动重置,或空闲 2 小时后重置
{
  "session": {
    "reset": { "mode": "daily", "atHour": 4, "idleMinutes": 120 }
  }
}
openclaw sessions cleanup --dry-run                # 预览待清理内容
openclaw sessions cleanup --all-agents --enforce   # 实际执行清理

更多内容

会话内控制命令

在实际使用中,用户经常会"说错话"或想中途打断当前执行。OpenClaw 约定了一组统一的对话内控制命令:

/cancel                      # 取消当前这次执行(本轮回复 + 由其派生的子任务),会话本身继续
/stop                        # 终止当前会话,并级联终止所有子 Agent(已有)
/amend <新内容>               # 覆盖上一条用户消息的内容,并基于修改后上下文重新生成
/append <补充内容>             # 在上一条用户消息基础上追加补充说明,再整体重新生成
  • /cancel:用于中止当前正在进行的一次调用(包括本轮模型回复以及由本轮触发的工具 / 子任务),但不会关闭会话,下一条消息仍复用当前会话历史。
  • /stop:用于明确结束当前会话,并级联终止对应的子 Agent;后续再次发消息会进入新的会话(取决于 dmScope 配置)。
  • /amend:将上一条用户消息视为"写错了",用 <新内容> 进行完全替换,模型看到的是修订后的对话历史
  • /append:上一条消息是对的,只是内容不完整,用 <补充内容> 作为补充附加到上一条消息之后,再让模型基于"原消息 + 补充"整体重算。

客户端可以在 UI 上对这些命令做友好封装,例如:

  • 点击"取消生成"按钮 → 触发 /cancel
  • 在上一条消息旁显示"编辑" → 触发 /amend 编辑模式
  • 在气泡下方提供"补充说明"输入框 → 触发 /append

六、Tools 与 Skills

Tools(工具 / Function Calling)

Tool 是 AI 可调用的原子能力,通过 JSON Schema 传给模型 API(即通常说的 Function Calling)。工具通过两个并行通道呈现给 AI:一是传给模型的结构化 Schema(必须),二是系统 Prompt 中的说明文字(帮助模型理解何时使用)。

内置工具分组:

分组包含工具说明
group:fsread write edit apply_patch文件读写编辑
group:runtimeexec bash process执行命令、管理后台进程
group:webweb_search web_fetch搜索网页、抓取页面内容
group:uibrowser canvas控制浏览器、驱动移动端 Canvas
group:messagingmessage跨渠道发送消息
group:sessionssessions_*管理会话、查看历史
group:memorymemory_search memory_get检索记忆
group:nodesnodes控制配对的移动设备
group:automationcron gateway定时任务、Gateway 控制
——image pdf sessions_spawn图像分析、PDF 解析、派生子 Agent

工具权限配置:

// 全局工具策略
{
  "tools": {
    "profile": "coding",       // minimal | coding | messaging | full
    "allow": ["browser"],      // 额外开启某个工具
    "deny": ["group:runtime"]  // 禁止某类工具
  }
}
// 为特定 Agent 单独设置(deny 优先于 allow)
{
  "agents": {
    "list": [{
      "id": "family",
      "tools": {
        "allow": ["read", "sessions_list"],
        "deny": ["exec", "write", "edit", "apply_patch"]
      }
    }]
  }
}

浏览器工具

Skills(技能)

Skill 本质上是特定目录下的 SKILL.md 文件,在每次对话开始时注入系统 Prompt,告诉 AI"这个能力怎么用"。Skill 本身只提供使用指导,不直接新增工具——但插件附带的 Skill 可以搭配插件注册的新工具一起工作。

加载优先级(高 → 低):

<workspace>/skills/     ← 当前 Agent 专属
~/.openclaw/skills/     ← 所有 Agent 共享
[内置 Skills]           ← 随 OpenClaw 安装

同名 Skill 高优先级覆盖低优先级。

创建一个自定义 Skill:

# 1. 创建目录
mkdir -p ~/.openclaw/workspace/skills/my-skill

# 2. 编写说明文件
cat > ~/.openclaw/workspace/skills/my-skill/SKILL.md << 'EOF'
---
name: my-skill
description: 调用内部 API 查询数据
metadata: {"openclaw": {"requires": {"bins": ["curl"], "env": ["MY_API_KEY"]}}}
---

当用户查询订单时,使用 exec 工具运行:
curl -H "Authorization: $MY_API_KEY" https://api.example.com/orders
EOF

# 3. 重启使其生效
openclaw gateway restart

SKILL.md frontmatter 说明:

字段必填说明
name唯一标识符
description简短描述,AI 用来决定是否调用
user-invocable是否作为 /skill-name 斜杠命令暴露(默认 true)
metadata.openclaw.requires.bins必须存在于 PATH 的二进制,否则跳过加载
metadata.openclaw.requires.env必须存在的环境变量,否则跳过加载
metadata.openclaw.requires.os限定操作系统(darwin / linux / win32

不满足条件的 Skill 自动跳过,不注入 Prompt,不消耗 token。

为 Skill 配置 API Key:

// openclaw.json
{
  "skills": {
    "entries": {
      "my-skill": {
        "enabled": true,
        "apiKey": "sk-...",            // 对应 primaryEnv 字段
        "env": { "MY_API_KEY": "xxx" }  // 注入但不覆盖已有的环境变量
      }
    }
  }
}

ClawHub 安装社区 Skill:

clawhub install <skill-name>   # 安装到 workspace/skills/
clawhub update --all           # 更新所有已安装的 Skills

插件安装与配置、自定义工具注册等进阶内容,参见 官方文档


七、MCP(Model Context Protocol)

MCP 是由 Anthropic 主导并向 LF AI & Data 基金会提交治理的开放标准,提供一套统一协议让 AI 客户端连接任意外部工具、数据库与 API。OpenClaw 原生支持 MCP,充当 MCP Client,而各类 MCP Server 则作为能力桥接层。

MCP 与内置工具的对比

维度内置工具 / SkillsMCP Server
接入方式随 OpenClaw 安装或 SKILL.md独立进程,标准协议
使用场景个人工作流、OpenClaw 专属逻辑对接外部 API / 数据库 / 云服务
复用性限 OpenClaw 生态任意 MCP 兼容客户端可复用
典型用法Skills 内部调用 MCP ServerGitHub、Notion、PostgreSQL…

安装 MCP Server

方式一:CLI 一键安装(内置支持的服务)

openclaw mcp install github
openclaw mcp install notion
openclaw mcp install postgres

方式二:在 openclaw.json 中手动配置

// ~/.openclaw/openclaw.json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "ghp_xxxxxxxxxxxx"
      }
    },
    "notion": {
      "command": "node",
      "args": ["/path/to/notion-mcp-server/index.js"],
      "env": {
        "NOTION_API_KEY": "secret_xxxxxxxxxxxx"
      }
    },
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/mydb"
      }
    }
  }
}

方式三:从社区获取(ClawHub / GitHub)

# ClawHub 上的 MCP Skill
clawhub install <mcp-skill-name>

# 官方 MCP Server 仓库
# github.com/modelcontextprotocol/servers

连接类型

类型说明典型场景
stdio本地子进程,标准输入输出大多数本地 Server(默认)
httpREST API 端点云端 / 远程 Server
websocket实时双向连接需要推送通知的服务
ssh远程服务器连接内网 / 跳板机场景

常用 MCP Server 一览

类别Server能力
开发github仓库管理、Issue、PR
开发gitlabCI/CD、合并请求
开发jira项目追踪、工单管理
生产力notion页面读写、数据库查询
生产力slack频道消息、工作空间
生产力google-workspaceGmail、Calendar、Drive
数据库postgresSQL 查询、Schema 管理
数据库mysql数据库操作
数据库mongodb文档查询、聚合
云服务awsS3、Lambda、EC2
云服务google-cloudBigQuery、Cloud Storage
搜索tavilyAI 搜索
爬虫firecrawl网页抓取
浏览器playwright浏览器自动化

使用示例

配置好后 OpenClaw 自动感知已挂载的 MCP Server 并按需调用:

你:帮我在 openclaw 仓库创建一个 Issue,标题是「支持自定义主题」
AI:[调用 GitHub MCP Server → 创建 Issue] ✓ 已创建 #42

你:查询数据库中本月新增的用户
AI:[调用 PostgreSQL MCP Server → 执行 SQL] 共 128 条记录…

查看与调试

openclaw mcp list              # 查看已配置的 MCP Server
openclaw logs                  # 查看 MCP 调用日志
openclaw doctor                # 检查 MCP 配置是否正确

自定义 MCP Server(Node.js 示例)

#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = new Server(
  { name: 'my-server', version: '1.0.0' },
  { capabilities: { tools: {} } }
);

// 声明工具
server.setRequestHandler('tools/list', async () => ({
  tools: [{
    name: 'query_orders',
    description: '查询订单信息',
    inputSchema: {
      type: 'object',
      properties: {
        userId: { type: 'string', description: '用户 ID' }
      },
      required: ['userId']
    }
  }]
}));

// 处理工具调用
server.setRequestHandler('tools/call', async ({ params }) => {
  const { name, arguments: args } = params;
  if (name === 'query_orders') {
    const data = await fetchOrders(args.userId);  // 你的业务逻辑
    return { content: [{ type: 'text', text: JSON.stringify(data) }] };
  }
  throw new Error(`Unknown tool: ${name}`);
});

const transport = new StdioServerTransport();
await server.connect(transport);

开发完成后,将其加入 openclaw.jsonmcpServers 即可:

{
  "mcpServers": {
    "my-server": {
      "command": "node",
      "args": ["/path/to/my-server/index.js"],
      "env": { "MY_API_KEY": "xxx" }
    }
  }
}

用 Go 实现 MCP Server

Go 生态现有多个可用库:

说明
modelcontextprotocol/go-sdk官方 Go SDK,与 Google 合作维护,支持最新规范
mark3labs/mcp-go社区最流行实现,API 简洁,支持 stdio/SSE/HTTP 多种传输
zeromicro/go-zerogo-zero 框架内置 MCP 模块,适合已有 go-zero 项目

方案一:mcp-go(推荐独立使用)

go get github.com/mark3labs/mcp-go
package main

import (
    "context"
    "fmt"

    "github.com/mark3labs/mcp-go/mcp"
    "github.com/mark3labs/mcp-go/server"
)

func main() {
    s := server.NewMCPServer("订单查询服务", "1.0.0",
        server.WithToolCapabilities(false),
    )

    // 定义工具及参数 Schema
    queryTool := mcp.NewTool("query_order",
        mcp.WithDescription("根据订单 ID 查询订单详情"),
        mcp.WithString("order_id",
            mcp.Required(),
            mcp.Description("订单 ID"),
        ),
    )
    s.AddTool(queryTool, queryOrderHandler)

    // 以 stdio 方式启动(供本地 MCP Client 调用)
    if err := server.ServeStdio(s); err != nil {
        fmt.Printf("server error: %v\n", err)
    }
}

func queryOrderHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
    orderID, err := req.RequireString("order_id")
    if err != nil {
        return mcp.NewToolResultError(err.Error()), nil
    }
    // 替换为实际业务逻辑
    result := fmt.Sprintf(`{"order_id":"%s","status":"shipped","amount":299.0}`, orderID)
    return mcp.NewToolResultText(result), nil
}

Struct 风格(更类型安全):

type QueryOrderArgs struct {
    OrderID string `json:"order_id" jsonschema_description:"订单 ID" jsonschema:"required"`
    UserID  string `json:"user_id,omitempty" jsonschema_description:"用户 ID(可选过滤)"`
}

type OrderResult struct {
    OrderID string  `json:"order_id"`
    Status  string  `json:"status"`
    Amount  float64 `json:"amount"`
}

queryTool := mcp.NewTool("query_order",
    mcp.WithDescription("查询订单详情"),
    mcp.WithInputSchema[QueryOrderArgs](),
    mcp.WithOutputSchema[OrderResult](),
)

HTTP/SSE 方式启动(供远程访问):

// SSE 传输
if err := server.ServeSSE(s, ":8080"); err != nil {
    log.Fatal(err)
}

// Streamable HTTP 传输(新规范推荐)
httpServer := server.NewStreamableHTTPServer(s)
if err := httpServer.Start(":8080"); err != nil {
    log.Fatal(err)
}

接入 openclaw.json

{
  "mcpServers": {
    "order-service": {
      "command": "go",
      "args": ["run", "/path/to/mcp-server/main.go"],
      // 或编译后:command: "/path/to/order-mcp-server"
      "env": { "DB_DSN": "postgres://user:pass@localhost/orders" }
    }
  }
}

方案二:go-zero 内置 MCP(推荐已有 go-zero 项目)

go-zero 从 v1.8+ 起内置 mcp 模块,基于 SSE 实现实时通信,支持工具、提示词(Prompt)、资源(Resource)三类能力。

go get github.com/zeromicro/go-zero@latest

config.yaml

Name: order-mcp-server
Host: localhost
Port: 8080
Mcp:
  Name: order-service
  MessageTimeout: 30s
  Cors:
    - http://localhost:18789   # OpenClaw Dashboard 地址

main.go

package main

import (
    "context"
    "encoding/json"
    "fmt"

    "github.com/zeromicro/go-zero/core/conf"
    "github.com/zeromicro/go-zero/core/logx"
    "github.com/zeromicro/go-zero/mcp"
)

func main() {
    var c mcp.McpConf
    conf.MustLoad("config.yaml", &c)
    logx.DisableStat()

    s := mcp.NewMcpServer(c)
    defer s.Stop()

    registerTools(s)

    s.Start()
}

func registerTools(s *mcp.McpServer) {
    // 工具 1:查询订单
    s.AddTool(mcp.Tool{
        Name:        "query_order",
        Description: "根据订单 ID 查询订单详情",
        InputSchema: mcp.ToolInputSchema{
            Type: "object",
            Properties: map[string]mcp.Property{
                "order_id": {Type: "string", Description: "订单 ID"},
            },
            Required: []string{"order_id"},
        },
    }, func(ctx context.Context, req mcp.ToolRequest) (mcp.ToolResponse, error) {
        orderID := req.Params["order_id"].(string)
        data := map[string]any{
            "order_id": orderID,
            "status":   "shipped",
            "amount":   299.0,
        }
        b, _ := json.Marshal(data)
        return mcp.NewTextToolResponse(string(b)), nil
    })

    // 工具 2:列出用户订单
    s.AddTool(mcp.Tool{
        Name:        "list_orders",
        Description: "列出指定用户的订单列表",
        InputSchema: mcp.ToolInputSchema{
            Type: "object",
            Properties: map[string]mcp.Property{
                "user_id": {Type: "string", Description: "用户 ID"},
                "limit":   {Type: "integer", Description: "返回数量上限,默认 10"},
            },
            Required: []string{"user_id"},
        },
    }, func(ctx context.Context, req mcp.ToolRequest) (mcp.ToolResponse, error) {
        userID := req.Params["user_id"].(string)
        text := fmt.Sprintf("用户 %s 共有 3 条订单:#1001, #1002, #1003", userID)
        return mcp.NewTextToolResponse(text), nil
    })
}

接入 openclaw.json(HTTP/SSE 模式):

{
  "mcpServers": {
    "order-service": {
      "url": "http://localhost:8080/sse",
      "transport": "sse"
    }
  }
}

八、进阶功能

Sub-Agent(后台子任务)

Sub-Agent 是主 Agent 在后台派生的独立运行实例,拥有独立的会话与 token 用量,非阻塞:派生后立即返回 runId,完成后将结果公告回主会话。

会话层级:

层级会话 Key角色能否再派生
0agent::main主 Agent始终可以
1agent::subagent:<runId>子 Agent(默认)需开启 maxSpawnDepth: 2
2agent::subagent:...:subagent:<runId>孙 Agent(叶节点)不可以

方式一:通过对话直接触发(最简单)

直接告诉 AI “帮我后台执行 XX 任务”,AI 会自动调用 sessions_spawn

方式二:斜杠命令

/subagents spawn --model anthropic/claude-sonnet-4-5 --thinking extended
/subagents list                   # 查看当前所有子 Agent
/subagents info <runId>           # 查看运行状态、时间戳、会话 ID
/subagents log <runId> [limit]    # 查看输出日志
/subagents steer <runId>          # 向运行中的子 Agent 发送补充指令
/subagents send <runId>           # 向子 Agent 发送消息
/subagents kill <runId>           # 终止指定子 Agent(级联终止其子孙)
/subagents kill all               # 终止全部子 Agent

方式三:AI 工具调用 sessions_spawn(编程式)

sessions_spawn({
  task: "抓取 https://example.com 并总结主要内容,完成后公告结果",
  model: "anthropic/claude-sonnet-4-5",   // 可选,降低成本
  thinking: "extended",                    // 可选
  runTimeoutSeconds: 300,                  // 可选,超时自动终止
  label: "网页摘要任务",                   // 可选,便于识别
  cleanup: "delete"                        // 完成后自动归档
})

开启嵌套子 Agent(编排模式):

{
  "agents": {
    "defaults": {
      "subagents": {
        "maxSpawnDepth": 2,          // 允许子 Agent 再派生(默认 1)
        "maxChildrenPerAgent": 5,    // 每个会话最多同时 5 个子任务
        "maxConcurrent": 8,          // 全局并发上限
        "runTimeoutSeconds": 900,    // 全局默认超时(0 = 不限)
        "model": "anthropic/claude-sonnet-4-5"  // 子 Agent 默认使用更便宜的模型
      }
    }
  }
}

编排模式示意(主 Agent → 一级编排 → 多个并行 Worker):

主 Agent
  └─ 编排子 Agent(maxSpawnDepth: 2)
       ├─ Worker 1(并行)
       ├─ Worker 2(并行)
       └─ Worker 3(并行)

每层只收到来自直接子节点的公告,结果逐层向上汇总。

<p><strong>注意:</strong></p> <ul> <li>子 Agent 只注入 <code>AGENTS.md</code> + <code>TOOLS.md</code>,<strong>不注入</strong> <code>SOUL.md</code>、<code>USER.md</code>、<code>IDENTITY.md</code>。</li> <li><code>/stop</code> 会终止主会话并<strong>级联</strong>终止所有子 Agent。</li> <li>Gateway 重启后,未完成的子 Agent 公告任务会丢失。</li> </ul>

沙箱隔离

为不受信任的 Agent 启用 Docker 沙箱,限制其工具权限:

{
  "agents": {
    "list": [{
      "id": "untrusted",
      "workspace": "~/.openclaw/workspace-untrusted",
      "sandbox": { "mode": "all", "scope": "agent" },
      "tools": { "allow": ["read"], "deny": ["exec", "write", "edit"] }
    }]
  }
}

定时任务(Cron)

{ "cron": { "enabled": true, "maxConcurrentRuns": 2 } }

启用后可通过对话或 openclaw cron 命令管理定时触发的 Agent 任务。

Webhook 自动化

让外部服务(如 Gmail 推送)触发 Agent 运行:

{
  "hooks": {
    "enabled": true,
    "token": "your-secret",
    "mappings": [{ "match": { "path": "gmail" }, "action": "agent", "agentId": "main" }]
  }
}

移动端节点(Nodes)

配对 iOS / Android 设备后,Agent 可调用:摄像头、麦克风、设备位置、屏幕录制、系统通知等。

故障排查

openclaw doctor           # 自动诊断,输出具体错误字段
openclaw doctor --fix     # 尝试自动修复
openclaw health           # 健康检查
openclaw logs             # 完整日志
openclaw channels status --probe   # 检查渠道连接

常见原因:配置文件格式错误(用 doctor 定位)、allowFrom 白名单未填写、渠道 Token 失效。


九、CLI 速查

# Gateway
openclaw gateway status / restart
openclaw gateway --port 18789    # 前台调试模式
openclaw doctor [--fix]          # 诊断并修复配置问题
openclaw logs                    # 查看日志

# 渠道
openclaw channels login [--channel whatsapp] [--account biz]
openclaw channels status [--probe]

# Agent
openclaw agents list [--bindings]
openclaw agents add <id> [--workspace <path>]
openclaw agents delete <id>
openclaw agents bind --agent <id> --bind <channel>[:<accountId>]
openclaw agents unbind --agent <id> --bind <channel>[:<accountId>] [--all]
openclaw agents bindings [--agent <id>] [--json]
openclaw agents set-identity --agent <id> [--name X] [--emoji X] [--avatar X]
openclaw agents set-identity --workspace <path> --from-identity
openclaw setup [--workspace <path>]  # 生成缺失的模板文件(不覆盖已有)

# 会话
openclaw sessions [--agent <id>] [--all-agents] [--active 120]
openclaw sessions cleanup [--dry-run] [--enforce]

# 配置
openclaw onboard / configure
openclaw config get <key>
openclaw config set <key> <value>

# 模型
openclaw models list

# 发消息
openclaw message send --target +8613800138000 --message "Hello"

全部命令

最后更新于