惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Recorded Future
Recorded Future
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Scott Helme
Scott Helme
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
Project Zero
Project Zero
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
S
Schneier on Security
S
SegmentFault 最新的问题
G
GRAHAM CLULEY
J
Java Code Geeks
IT之家
IT之家
爱范儿
爱范儿
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Jina AI
Jina AI
腾讯CDC
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
T
Threatpost
V
V2EX
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
美团技术团队
小众软件
小众软件
NISL@THU
NISL@THU
Simon Willison's Weblog
Simon Willison's Weblog
T
The Exploit Database - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Securelist
V
Vulnerabilities – Threatpost
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
A
Arctic Wolf
U
Unit 42
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
OpenClaw.NET 外部 CLI 连接器 (External CLI Connectors) 详细技术总结
张善友 · 2026-05-10 · via 博客园_首页

基于文档: https://github.com/clawdotnet/openclaw.net/blob/main/docs/EXTERNAL_CLI_CONNECTORS.md
基于代码 Commit: https://github.com/clawdotnet/openclaw.net/commit/bde72ea12f05457d0d36422d627ffbe383fce1d8
整理日期: 2026-05-10


一、架构概述

External CLI Connectors 是 OpenClaw.NET 的一个受控原生工具 (external_cli),用于将官方平台 CLI(如 GitHub CLI、Azure CLI、kubectl、Stripe CLI、Lark/Feishu CLI 等)包装为可被 AI Agent 安全调用的工具。

核心设计哲学:

  • 默认禁用 — 功能不会自动启用,需要显式配置
  • 不是通用 Shell — 不接受任意命令字符串,只允许预配置的具名命令
  • 深度防御 — 通过命名命令白名单、风险评分、预览、审批、脱敏、超时、审计记录和运行时事件实现多层安全控制

二、安全模型 (Security Model)

2.1 核心安全原则

外部 CLI 可以在强大的用户、机器人、云、集群或支付身份下运行,因此:

  • 所有变更性命令 (mutating commands) 被视为高风险
  • 使用最小权限原则 (least privilege)
  • 支持 dry-run 预览审批流程审计日志

2.2 命令调用方式

连接器不接受原始命令字符串。Agent 通过指定连接器名、命令名和命名参数来调用:

{
  "action": "execute",
  "connector": "gh",
  "command": "issue_list",
  "parameters": {
    "repo": "clawdotnet/openclaw.net"
  }
}

运行时通过配置化的参数模板直接展开为 ProcessStartInfo.ArgumentList不经过 Shell 解释器,且拒绝缺失或未知参数(除非命令显式允许)。

2.3 关键安全默认值

配置项 默认值 含义
Enabled false 默认不注册工具
AllowFreeformCommands false 拒绝自由形式命令
RequireApprovalForMutatingCommands true 非只读命令需要审批
RiskLevel high 默认高风险,总是需要审批
ReadOnly false 默认可变操作

三、配置系统详解

3.1 顶层配置结构

{
  "OpenClaw": {
    "ExternalCli": {
      "Enabled": true,                          // 总开关
      "DefaultTimeoutSeconds": 60,              // 默认超时
      "MaxStdoutBytes": 262144,                 // stdout 最大字节数 (256KB)
      "MaxStderrBytes": 65536,                  // stderr 最大字节数 (64KB)
      "RedactSecrets": true,                    // 启用密钥脱敏
      "AllowFreeformCommands": false,           // 禁止自由命令
      "RequireApprovalForMutatingCommands": true, // 变更命令需审批
      "Connectors": {                           // 连接器配置
        // 各平台CLI连接器定义
      }
    }
  }
}

3.2 连接器配置结构

GitHub CLI (gh) 为例:

{
  "gh": {
    "Enabled": true,
    "DisplayName": "GitHub CLI",
    "Executable": "gh",
    "DefaultOutputFormat": "json",
    "StatusCommand": {
      "Args": ["auth", "status"],
      "TimeoutSeconds": 20
    },
    "VersionCommand": {
      "Args": ["--version"],
      "TimeoutSeconds": 10
    },
    "Commands": {
      "repo_view": {
        "Description": "View repository metadata",
        "ArgsTemplate": [
          "repo", "view", "{{repo}}",
          "--json", "name,owner,description,url,isPrivate"
        ],
        "RiskLevel": "low",
        "ReadOnly": true,
        "StructuredOutput": "json",
        "Parameters": {
          "repo": {
            "Required": true,
            "Pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"
          }
        }
      },
      "issue_create": {
        "Description": "Create a GitHub issue",
        "ArgsTemplate": [
          "issue", "create", "--repo", "{{repo}}",
          "--title", "{{title}}", "--body", "{{body}}"
        ],
        "RiskLevel": "medium",
        "ReadOnly": false,
        "RequiresApproval": true,
        "StructuredOutput": "text",
        "Parameters": {
          "repo": { "Required": true },
          "title": { "Required": true, "MaxLength": 200 },
          "body": { "Required": true, "MaxLength": 16000 }
        }
      }
    }
  }
}

3.3 命令配置选项说明

字段 类型 说明
Description string 命令描述
ArgsTemplate string[] 参数模板,{{param}} 占位符将被替换
RiskLevel string 风险等级: low / medium / high
ReadOnly bool 是否为只读操作
RequiresApproval bool 是否需要审批(覆盖默认策略)
StructuredOutput string 输出格式: json / ndjson / csv / table / text
DryRunArgsTemplate string[] (可选) Dry-run 模式的参数模板
Parameters dict 参数定义,含 Required/MaxLength/Pattern/AllowedValues
RedactionRules string[] (可选) 平台特定的密钥脱敏规则
RequiredScopes string[] (可选) 所需身份/权限范围
RequiredIdentity string (可选) 所需身份标识
TimeoutSeconds int (可选) 命令级别超时覆盖
WorkingDirectory string (可选) 工作目录
Environment dict (可选) 环境变量

3.4 参数验证选项

每个参数可配置:

  • Required — 是否必填
  • Description — 参数描述
  • MaxLength — 最大长度限制
  • Pattern — 正则表达式验证
  • AllowedValues — 允许值列表

四、预览与审批流程 (Preview & Approval)

4.1 预览命令

openclaw external preview gh repo_view --param repo=clawdotnet/openclaw.net

4.2 预览返回信息

字段 说明
可执行文件路径 解析后的 CLI 路径
参数列表 展开的参数(已脱敏)
风险等级 low / medium / high
操作类型 只读 (ReadOnly) 或变更 (Mutating)
是否需要审批 true / false
输出格式 json / ndjson / csv / table / text
所需身份/权限范围 如配置了 RequiredScopes
审批指纹 (Approval Fingerprint) 稳定的指纹值,用于审批匹配

4.3 执行审批流程

# 1. 先预览
openclaw external preview gh issue_create \
  --param repo=clawdotnet/openclaw.net \
  --param title="Example" \
  --param body="Example body"

# 2. 确认后加 --yes 执行(自动携带指纹)
openclaw external execute gh issue_create \
  --param repo=clawdotnet/openclaw.net \
  --param title="Example" \
  --param body="Example body" \
  --yes

指纹安全机制: 如果命令模板、解析参数或策略在审批和执行之间发生变化,指纹不匹配将导致执行被阻止。

4.4 Dry-Run 支持

预览时加上 --dry-run 可执行 dry-run 模式(需命令配置了 DryRunArgsTemplate):

openclaw external preview gh issue_create \
  --param repo=clawdotnet/openclaw.net \
  --param title="Test" \
  --param body="Test body" \
  --dry-run

注意: 运行时不会猜测 dry-run 标志,必须在模板中显式配置。


五、审计、事件与脱敏 (Audit, Events & Redaction)

5.1 审计记录 (Append-Only Audit)

每次执行写入不可篡改的审计记录,包含:

  • 连接器名和命令名
  • 可执行文件路径
  • 已脱敏的命令行预览
  • 参数和参数哈希
  • 执行者、会话、频道、发送者
  • 审批指纹(如有)
  • 退出码、执行时长、超时标志
  • stdout/stderr 截断标志
  • 风险等级和工作目录

5.2 运行时事件

触发以下事件类型:

  • status_check — 状态检查
  • previewed / dry_run_previewed — 预览
  • dry_run_executed — Dry-run 执行
  • command_executed — 命令执行
  • command_failed — 命令失败
  • command_timed_out — 超时
  • truncation — 输出截断
  • redaction — 密钥脱敏
  • command_blocked_by_policy — 策略阻止

5.3 密钥脱敏 (Redaction)

脱敏应用于:参数预览、stdout、stderr、审计记录、运行时事件、错误消息。可为连接器或命令配置 RedactionRules,支持平台特定的密钥格式。


六、输出解析 (Output Parsing)

按命令配置 StructuredOutput

格式 处理方式
json 解析 stdout 为 JSON,返回解析后的 JSON + 脱敏 stdout
ndjson 解析换行分隔 JSON 为 JSON 数组
csv / table / text 作为脱敏文本返回

注意: 连接器不会注入全局 --json 标志,需要在每个命令模板中显式放置输出标志。


七、推荐配置预设 (Conservative Presets)

7.1 GitHub CLI (gh)

类别 命令示例
只读 auth status, repo view, issue list, pr list, pr view, release list
需审批 issue create, issue comment, pr review, pr merge, release create

7.2 Azure CLI (az)

类别 命令示例
只读 account show, group list, resource list, webapp list
需审批 resource create/update/delete, deployment create, role assignment changes

7.3 kubectl

类别 命令示例
只读 config current-context, get pods/services/deployments -o json, describe
高风险需审批 apply, delete, scale, rollout restart, exec, port-forward

日志可能暴露密钥,建议至少 medium 风险等级。

7.4 Stripe CLI

类别 命令示例
只读 listen status, fixtures/list, customers/list(最小权限凭证)
高风险需审批 payment mutations, refunds, customer/subscription mutations, webhook trigger, event replay

7.5 Lark / Feishu CLI

类别 命令示例
只读 auth status, schema inspection, calendar agenda, docs search/read, sheets read, mail search/read, meeting minutes query
需审批 send messages, write docs, write sheets, send email, approve/reject workflows, create/update OKRs, raw API calls

八、管理 API (Admin API)

网关暴露以下 RESTful 端点:

方法 端点 说明
GET /admin/external-cli/connectors 列出所有连接器
GET /admin/external-cli/connectors/{connector} 获取连接器状态
GET /admin/external-cli/connectors/{connector}/commands 列出连接器命令
POST /admin/external-cli/preview 预览命令(需 CSRF)
POST /admin/external-cli/execute 执行命令(需 operator 角色 + 匹配审批元数据)

九、CLI 命令

# 列出所有连接器
openclaw external list

# 查看连接器状态
openclaw external status gh

# 列出连接器命令
openclaw external commands gh

# 预览命令
openclaw external preview gh repo_view --param repo=clawdotnet/openclaw.net

# 执行命令
openclaw external execute gh repo_view --param repo=clawdotnet/openclaw.net

# 使用 --json 获取机器可读输出
openclaw external list --json

十、代码实现架构 (Commit bde72ea)

10.1 项目结构

本次 Commit 共修改 29 个文件+2,966 行代码,涉及以下模块:

docs/
  EXTERNAL_CLI_CONNECTORS.md          # 新增完整文档 (278行)
  README.md                           # 添加文档链接
  SITE_MAP.md                         # 添加站点地图

src/OpenClaw.Agent/
  OpenClawToolExecutor.cs             # 工具执行器集成 (+29/-4)
  Tools/ExternalCliTool.cs            # 新增 External CLI 工具实现 (251行)

src/OpenClaw.Client/
  OpenClawHttpClient.cs               # HTTP 客户端新增 Admin API 方法 (+51行)

src/OpenClaw.Cli/
  CliArgs.cs                          # CLI 参数解析扩展
  ExternalCliCommands.cs              # 新增 CLI 命令实现 (250行)
  OpenClawHttpClient.cs               # CLI HTTP 客户端包装 (+15行)
  Program.cs                          # 注册 external 子命令 (+3行)

src/OpenClaw.Core/
  Abstractions/IToolActionDescriptorProvider.cs  # 抽象接口
  ExternalCli/
    ExternalCliServices.cs            # DI 服务注册
    ExternalCliConnectorRegistry.cs   # 连接器注册表
    ExternalCliRunner.cs              # 命令执行器
  Models/
    ExternalCliModels.cs              # 数据模型 (284行)
    GatewayConfig.cs                  # 配置集成 (+1行)
    Session.cs                        # JSON 序列化 (+26行)
    ToolingPolicyModels.cs            # 策略模型 (+4行)
  Pipeline/ToolActionPolicyResolver.cs # 策略解析 (+27/-1)
  Validation/ConfigValidator.cs       # 配置验证 (+78行)

src/OpenClaw.Gateway/
  Composition/                         # DI 组合注册
  Endpoints/AdminEndpoints.ExternalCli.cs  # Admin API 端点 (264行)
  Endpoints/ExternalCliStores.cs      # 存储抽象

OpenClaw.Tests/
  ExternalCliTests.cs                 # 单元测试

10.2 核心类型与接口

// 连接器注册表
public interface IExternalCliConnectorRegistry
{
    ExternalCliPreparedInvocation BuildPreview(ExternalCliPreviewRequest request, bool dryRun);
}

// 命令执行器
public interface IExternalCliRunner
{
    Task<ExternalCliExecutionResult> ExecuteAsync(ExternalCliPreparedInvocation prepared, CancellationToken ct);
}

// 审计 Sink
public interface IExternalCliAuditSink { void Record(ExternalCliAuditEntry entry); }

// 事件 Sink
public interface IExternalCliEventSink { void Record(ExternalCliRuntimeEvent evt); }

10.3 关键数据模型

// 连接器配置选项
public sealed class ExternalCliConnectorOptions
{
    public bool Enabled { get; set; } = false;
    public string DisplayName { get; set; } = "";
    public string Executable { get; set; } = "";
    public string DefaultOutputFormat { get; set; } = "json";
    public ExternalCliStatusCommandOptions? StatusCommand { get; set; }
    public ExternalCliStatusCommandOptions? VersionCommand { get; set; }
    public Dictionary<string, ExternalCliCommandOptions> Commands { get; set; } = new();
    // ...
}

// 命令配置选项
public sealed class ExternalCliCommandOptions
{
    public string Description { get; set; } = "";
    public string[] ArgsTemplate { get; set; } = [];
    public string[]? DryRunArgsTemplate { get; set; }
    public string RiskLevel { get; set; } = ExternalCliRiskLevel.High;
    public bool ReadOnly { get; set; } = false;
    public bool RequiresApproval { get; set; } = false;
    public string StructuredOutput { get; set; } = ExternalCliOutputFormat.Text;
    public Dictionary<string, ExternalCliParameterOptions> Parameters { get; set; } = new();
    // ...
}

// 执行结果
public sealed class ExternalCliExecutionResult
{
    public ExternalCliInvocationPreview Preview { get; init; } = new();
    public int ExitCode { get; init; }
    public double DurationMs { get; init; }
    public bool TimedOut { get; init; }
    public bool Failed { get; init; }
    public bool StdoutTruncated { get; init; }
    public bool StderrTruncated { get; init; }
    // ...
}

// 审计记录
public sealed class ExternalCliAuditEntry
{
    public string Id { get; init; } = "";
    public DateTimeOffset TimestampUtc { get; init; }
    public string SessionId { get; init; } = "";
    public string Connector { get; init; } = "";
    public string Command { get; init; } = "";
    public string RedactedArgsPreview { get; init; } = "";
    public string? ApprovalFingerprint { get; init; }
    public int ExitCode { get; init; }
    // ...
}

10.4 执行流程

  1. Agent 调用ExternalCliTool 接收工具请求
  2. 策略解析ToolActionPolicyResolver 解析操作描述符(含 IsMutation、RequiresApproval、ApprovalFingerprint、RiskLevel、ReadOnly)
  3. 预览构建ExternalCliConnectorRegistry.BuildPreview() 解析模板、验证参数、计算指纹
  4. 审批检查 → 如需审批,比较指纹是否匹配
  5. 执行命令ExternalCliRunner.ExecuteAsync() 通过 ProcessStartInfo.ArgumentList 启动进程
  6. 输出解析 → 按 StructuredOutput 设置解析输出
  7. 记录审计 → 写入 ExternalCliAuditEntry(不可篡改)
  8. 发送事件 → 通过 ExternalCliEventSink 发送运行时事件

10.5 策略解析增强

ToolActionDescriptor 新增字段:

  • RequiresApproval — 是否需要审批
  • ApprovalFingerprint — 审批指纹
  • RiskLevel — 风险等级
  • ReadOnly — 是否只读

OpenClawToolExecutor 中的审批逻辑增强:

  • 支持指纹匹配验证
  • 如模板、参数或策略在审批后变更,指纹不匹配将阻止执行

十一、飞书 (Feishu/Lark) CLI 配置详细教程

11.1 理解架构

OpenClaw 通过外部 CLI 连接器调用 lark-cli(官方 npm 包 @larksuite/cli)来操作飞书。这需要:

  1. 在飞书开放平台创建自建应用并获取凭证
  2. 安装并配置 lark-cli
  3. 完成用户授权(OAuth 2.0 设备授权流程)
  4. 在 OpenClaw 中配置 External CLI 连接器

11.2 步骤一:创建飞书自建应用

1. 访问飞书开放平台

2. 创建应用

  1. 登录后点击右上角 「开发者后台」
  2. 点击 「创建应用」 → 选择 「企业自建应用」
  3. 填写应用名称(如「我的AI助手」)和描述
  4. 点击 「确认创建」

3. 开启机器人能力

  1. 左侧菜单 → 「应用能力」→「机器人」
  2. 点击 「开启」

4. 获取凭证

  1. 左侧菜单 → 「凭证与基础信息」
  2. 复制以下信息备用:
    • App ID(格式如 cli_xxxxxxxxx
    • App Secret(点击「查看」显示完整内容,请妥善保管)

5. 开通权限
左侧菜单 → 「权限管理」,搜索并开通以下权限:

权限 用途
docx:document:readonly 查看、评论和导出云文档
docx:document:write 创建和编辑云文档
drive:drive:readonly 获取文件元信息
drive:folder:write 管理云空间中所有文件
im:message 发送/接收消息
im:message.group_at_msg 接收群聊 @ 消息
im:message:send_as_bot 以机器人身份发送消息
im:chat 群聊管理
im:resource 消息资源
search:docs:read 搜索文档

6. 发布应用

  1. 左侧菜单 → 「版本管理与发布」
  2. 「创建版本」 → 填写版本说明 → 「提交」
  3. 等待审批(企业内部应用通常自动通过)

11.3 步骤二:安装与配置 lark-cli

1. 安装 lark-cli

# 全局安装
npm install -g @larksuite/cli

# 验证安装
lark-cli --version

2. 配置凭证(交互式)

lark-cli config init --new

按提示输入 App ID 和 App Secret。

3. 配置凭证(非交互式/自动化)

echo "你的App Secret" | lark-cli config init \
  --app-id "你的AppID" \
  --app-secret-stdin \
  --brand feishu

--brand feishu 用于国内版飞书,国际版 Lark 使用 --brand lark

4. 验证配置

lark-cli doctor

应显示配置正确、凭证有效。

11.4 步骤三:用户授权 (OAuth 2.0 设备授权)

1. 发起授权请求

lark-cli auth login --no-wait --recommend --json

输出示例:

{
  "device_code": "ABC123XYZ",
  "user_code": "ABCD1234",
  "verification_url": "https://open.feishu.cn/open-apis/authen/v1/scan?qrcode=..."
}

2. 完成授权
复制 verification_url 到浏览器打开,使用飞书 App 扫码确认。

3. 完成登录
扫码确认后执行:

lark-cli auth login --device-code "ABC123XYZ"

4. 补充搜索权限(如需文档搜索能力)

lark-cli auth login --no-wait --scope "search:docs:read" --json

重复扫码授权流程。

11.5 步骤四:验证 lark-cli 功能

# 搜索文档
lark-cli docs +search --query "文档" --as user

# 创建文档
lark-cli docs +create --title "测试文档" --markdown "# 你好世界"

# 查询日历
lark-cli calendar +agenda --as user

# 发送消息
lark-cli message +send --to-user "user_open_id" --text "Hello from CLI"

11.6 步骤五:在 OpenClaw 中配置 Feishu External CLI 连接器

在 OpenClaw 配置文件中添加:

{
  "OpenClaw": {
    "ExternalCli": {
      "Enabled": true,
      "DefaultTimeoutSeconds": 60,
      "MaxStdoutBytes": 262144,
      "MaxStderrBytes": 65536,
      "RedactSecrets": true,
      "AllowFreeformCommands": false,
      "RequireApprovalForMutatingCommands": true,
      "Connectors": {
        "lark": {
          "Enabled": true,
          "DisplayName": "Lark/Feishu CLI",
          "Executable": "lark-cli",
          "DefaultOutputFormat": "json",
          "StatusCommand": {
            "Args": ["auth", "status"],
            "TimeoutSeconds": 20
          },
          "VersionCommand": {
            "Args": ["--version"],
            "TimeoutSeconds": 10
          },
          "Commands": {
            "auth_status": {
              "Description": "Check lark-cli auth status",
              "ArgsTemplate": ["auth", "status"],
              "RiskLevel": "low",
              "ReadOnly": true,
              "StructuredOutput": "text",
              "Parameters": {}
            },
            "docs_search": {
              "Description": "Search Feishu documents",
              "ArgsTemplate": ["docs", "+search", "--query", "{{query}}", "--as", "user", "--json"],
              "RiskLevel": "low",
              "ReadOnly": true,
              "StructuredOutput": "json",
              "Parameters": {
                "query": { "Required": true, "MaxLength": 200 }
              }
            },
            "docs_read": {
              "Description": "Read a Feishu document",
              "ArgsTemplate": ["docs", "+get", "{{doc_id}}", "--as", "user"],
              "RiskLevel": "low",
              "ReadOnly": true,
              "StructuredOutput": "json",
              "Parameters": {
                "doc_id": { "Required": true }
              }
            },
            "docs_create": {
              "Description": "Create a Feishu document",
              "ArgsTemplate": ["docs", "+create", "--title", "{{title}}", "--markdown", "{{content}}"],
              "RiskLevel": "medium",
              "ReadOnly": false,
              "RequiresApproval": true,
              "StructuredOutput": "json",
              "Parameters": {
                "title": { "Required": true, "MaxLength": 200 },
                "content": { "Required": true, "MaxLength": 50000 }
              }
            },
            "calendar_agenda": {
              "Description": "Query calendar agenda",
              "ArgsTemplate": ["calendar", "+agenda", "--as", "user"],
              "RiskLevel": "low",
              "ReadOnly": true,
              "StructuredOutput": "json",
              "Parameters": {}
            },
            "message_send": {
              "Description": "Send a Feishu message",
              "ArgsTemplate": ["message", "+send", "--to-user", "{{to}}", "--text", "{{text}}"],
              "RiskLevel": "medium",
              "ReadOnly": false,
              "RequiresApproval": true,
              "StructuredOutput": "text",
              "Parameters": {
                "to": { "Required": true },
                "text": { "Required": true, "MaxLength": 2000 }
              }
            }
          }
        }
      }
    }
  }
}

11.7 步骤六:验证 OpenClaw 集成

# 查看连接器状态
openclaw external status lark

# 列出可用命令
openclaw external commands lark

# 预览搜索文档命令
openclaw external preview lark docs_search --param query="项目计划"

# 执行搜索(如需要审批,先预览再加 --yes)
openclaw external execute lark docs_search --param query="项目计划" --yes

# 预览创建文档(变更命令,需要审批)
openclaw external preview lark docs_create \
  --param title="会议纪要 2026-05-10" \
  --param content="# 会议纪要\n\n## 参与人\n- ..."

# 审批后执行
openclaw external execute lark docs_create \
  --param title="会议纪要 2026-05-10" \
  --param content="# 会议纪要\n\n## 参与人\n- ..." \
  --yes

11.8 懒人方式(让 AI 助手自动配置)

你也可以让 AI 助手自动完成大部分配置工作:

帮我配置飞书云文档能力。请按以下步骤做:

1. 检查是否安装了 lark-cli,如果没有则执行:
   npm install -g @larksuite/cli

2. 运行 lark-cli doctor 检查当前状态

3. 如果显示缺少凭证配置,问我 App ID 和 App Secret

4. 拿到凭证后完成配置:
   echo "AppSecret" | lark-cli config init --app-id "AppID" --app-secret-stdin --brand feishu

5. 运行 lark-cli auth login --no-wait --recommend --json
   把返回的 verification_url 发给我,告诉我扫码授权

6. 我扫码确认后,用返回的 device_code 执行登录

7. 如果缺少搜索权限,按上面的方式再走一遍授权流程补充 search:docs:read

8. 全部完成后,用以下命令验证各项能力:
   - lark-cli docs +search --query "文档" --as user
   - lark-cli docs +create --title "测试文档" --markdown "# 你好"
   - lark-cli calendar +agenda --as user

十二、完整 lark-cli 能力一览

模块 能力
docs 搜索文档、创建文档、读取文档、更新文档、分享文档
sheets 读取表格、写入单元格、添加行/列
message 发送文本消息、卡片消息、图片消息
calendar 查询日程、创建日程
mail 搜索邮件、读取邮件、发送邮件
contact 搜索用户、查询部门
wiki 搜索知识库、读取知识库页面
meeting 查询会议纪要
drive 文件上传、下载、管理
bitable 多维表格操作
approval 审批流程查询/操作
okr OKR 查询/创建

十三、最佳实践与注意事项

13.1 安全最佳实践

  1. 最小权限原则 — 只开通实际需要的权限
  2. 审批变更操作 — 所有写入/变更命令应设置 RequiresApproval: true
  3. 使用只读预设 — 初始配置只启用读操作,按需开启写操作
  4. 监控审计日志 — 定期检查 external_cli 的审计记录
  5. 配置密钥脱敏 — 为涉及敏感凭证的命令添加 RedactionRules
  6. 设置合理超时 — 根据命令特性设置 TimeoutSeconds

13.2 常见问题排查

问题 排查方法
命令执行失败 检查 lark-cli doctor 输出,确认凭证和授权状态
权限不足 在飞书开放平台检查应用权限是否已开通并发布
审批指纹不匹配 命令参数或模板可能在审批后发生变化,重新预览获取新指纹
输出为空 检查 StructuredOutput 设置是否与 CLI 实际输出格式匹配
超时 增加 TimeoutSeconds 设置

十四、总结

OpenClaw.NET 的 External CLI Connectors 提供了一个安全、受控、可审计的框架,将各种官方平台 CLI 集成到 AI Agent 的工具调用体系中。通过命名命令白名单、参数模板、风险评分、预览-审批流程、密钥脱敏和审计日志等多重安全机制,实现了在保持平台深度的同时确保操作安全。

对于飞书/Feishu 集成,通过 lark-cli 外部 CLI 连接器,AI Agent 可以安全地读写飞书云文档、查询日历、发送消息等,所有变更操作都需要显式审批,确保企业数据安全。