zoom-meeting-admin
Manage Zoom meetings, cloud recordings, and account users via a Server-to-Server OAuth REST script. Use this skill when the user wants to list, view, create, or delete a scheduled …
Jacky Shen
@mebusw
Install
$ openclaw skills install @mebusw/zoom-meeting-adminZoom Server-to-Server OAuth REST API
权限与约束
本 Skill 通过 scripts/zoom-s2s.py 调用 Zoom Server-to-Server OAuth REST API,不实现"通用 REST 代理"。
- 声明的工具:
Bash(python3:*)(执行scripts/zoom-s2s.py)、Bash(ls:*)/Bash(cat:*)(查看脚本输出与缓存)、Read(读取凭证文件与文档)。 - 网络访问:向
https://zoom.us/oauth/token与https://api.zoom.us/v2/*发起 HTTPS 请求,传输头包含Authorization: Bearer <token>。 - 文件写入:在
~/.zoom-s2s-token.json缓存访问令牌(已自动chmod 600)。 - 凭证读取:从仓库根目录的
.env读取ZOOM_ACCOUNT_ID/ZOOM_CLIENT_ID/ZOOM_CLIENT_SECRET/ZOOM_USER_ID。 - 允许的 Action(白名单)——禁止构造任意 Zoom REST 请求或调用未列出的端点:
- 会议:
list_meetings/get_meeting/create_meeting/delete_meeting - 用户:
get_user/list_users - 录像:
recordings
- 会议:
- 越权防护:脚本未导出
api_call给上层调用;不得通过修改脚本、注入参数、拼接 URL 等方式旁路调用白名单外的 Zoom 端点(如DELETE /users/{id}、PATCH /accounts/{id}等高风险端点)。 - 强人类确认:
create_meeting与delete_meeting在执行前必须获得用户显式确认;delete_meeting命令还需附加--yes参数。
凭证配置
在 .env 文件中配置(仅 chmod 600,不要提交到任何 Git 仓库):
ZOOM_ACCOUNT_ID=你的AccountID
ZOOM_CLIENT_ID=你的ClientID
ZOOM_CLIENT_SECRET=你的ClientSecret
ZOOM_USER_ID=你的用户邮箱或user_id
⚠️ 完整的安全规范见下一节
## 凭证安全。
Token 获取方式:Server-to-Server OAuth,机器对机器,无需用户交互授权。
凭证安全
.env 中的 ZOOM_CLIENT_SECRET 是长期有效的账户级凭据,等同于账户管理员口令。必须遵守:
- 加入
.gitignore:本仓库.gitignore已包含.env;同步确保 IDE、备份工具、文件同步(iCloud / Dropbox / OneDrive / 坚果云)不会自动上传该文件。 - 限制文件权限:
chmod 600 .env;scripts/zoom-s2s.py缓存的~/.zoom-s2s-token.json同样敏感(已自动chmod 600),不要复制到剪贴板、聊天窗口、终端截图、报错工单、AI 对话上下文或第三方日志服务。 - 不要在共享环境复用:CI runner、公用跳板机、容器镜像、共享开发机中复用同一份凭据 ≈ 凭据公开。
Account ID + Client ID + Client Secret三元组可换得 1 小时有效的访问令牌。 - 最小权限:按
## 最小权限配置建议表按需开启 Scope;不需要的 Action 不要勾选对应权限;delete_meeting之外的写权限(meeting:write:update、user:write:*、account:write:*)默认不要开。 - 独立 App:为此 Skill 单独创建一个 Zoom Server-to-Server App,不要复用其他业务 App 的凭据;一旦泄露,旋转该 App 的凭据即可,不影响其他业务。
- 凭据泄露应急:在 Zoom Marketplace 删除该 App → 重新创建并轮换
ACCOUNT_ID/CLIENT_ID/CLIENT_SECRET/USER_ID四项 →rm -f ~/.zoom-s2s-token.json强制下次重新认证 → 复盘泄露路径。
核心脚本
scripts/zoom-s2s.py — 纯 Python,无外部依赖,兼容 Python 3.7+。
cd ~/.agents/skills/zoom-meeting-admin/scripts
# 获取帮助
python3 zoom-s2s.py help
# 列出即将到来的会议
python3 zoom-s2s.py list_meetings <user> <page_size> upcoming
# 获取单个会议详情
python3 zoom-s2s.py get_meeting <meeting_id>
# 创建会议 (start_time: YYYY-MM-DDTHH:MM:SS)
python3 zoom-s2s.py create_meeting "<主题>" "<start_time>" <时长分钟> [时区] [密码]
# 创建周期性会议(每周二,7次,每次120分钟)
python3 zoom-s2s.py create_meeting "CSM公开课" "2026-05-23T08:00:00" 120 Asia/Shanghai "" 2 1 2 7
python3 zoom-s2s.py create_meeting "煎饼果子讨论会" "2026-05-05T10:00:00" 60 Asia/Shanghai
# 删除会议
python3 zoom-s2s.py delete_meeting <meeting_id>
# 获取云录像
python3 zoom-s2s.py recordings <user> <page_size>
# 获取用户信息
python3 zoom-s2s.py get_user [user]
# 列出账户下所有用户
python3 zoom-s2s.py list_users [page_size]
Token 缓存
脚本自动缓存 Token 到 ~/.zoom-s2s-token.json(有效期约 50 分钟),重复调用无需每次重新认证。
常用操作快速参考
| 操作 | 命令 |
|---|---|
| 列出最近5个会议 | list_meetings <user> 5 upcoming |
| 列出最近10个历史会议 | list_meetings <user> 10 past |
| 创建明天10点会议 | create_meeting "主题" "YYYY-MM-DDT10:00:00" 60 Asia/Shanghai |
| 创建周期性会议 | create_meeting "主题" "YYYY-MM-DDT20:00:00" 120 America/New_York "" 2 1 2 7 |
| 获取会议详情 | get_meeting <id> |
| 删除会议 | delete_meeting <id> --yes |
| 获取云录像 | recordings <user> 10 |
最小权限配置建议
根据实际使用场景按需开通 scope,不需要的功能不要授权:
| 功能 | 所需 Scope | 建议 |
|---|---|---|
| 列出会议 | meeting:read:list_meetings | ✅ 核心 |
| 查看会议详情 | meeting:read:meeting | ✅ 核心 |
| 创建会议 | meeting:write:create | 按需开启 |
| 删除会议 | meeting:write:delete | ⚠️ 谨慎开启 |
| 读取云录像 | cloud_recording:read:list_user_recordings | ⚠️ 谨慎开启 |
| 列出账户用户 | user:read:list_users | ⚠️ 谨慎开启 |
建议为此 Skill 单独创建一个 Zoom Server-to-Server App,不要复用已有 App 的凭证。
Agent 调用规范
- 创建会议前:向用户确认主题、时间、时长,再执行。
- 删除会议前:必须向用户明确展示会议信息并获得确认,命令需附加
--yes参数。 - 禁止超范围调用:仅允许文档中列出的 Action,不得构造任意 Zoom REST API 请求。
创建周期性会议
CLI 方式
create_meeting 额外支持周期性参数(按位置传递):
python3 zoom-s2s.py create_meeting "<主题>" "<start_time>" <duration> [timezone] [password] \
[recurrence_type] [repeat_interval] [weekly_days] [end_times] [end_date_time]
| 参数 | 说明 | 示例 |
|---|---|---|
recurrence_type | 1=每日, 2=每周, 3=每月 | 2 |
repeat_interval | 每几周/天重复 | 1 |
weekly_days | 周几(字符串,1=周一~7=周日) | "2" |
end_times | 总共几次 | 7 |
end_date_time | 结束日期(二选一) | "2026-10-06T00:00:00Z" |
示例:每周二 20:00,共 7 次,每次 2 小时
python3 zoom-s2s.py create_meeting "北美龙虾 AI 数字员工系列第 2 期" \
"2026-08-18T20:00:00" 120 America/New_York "" 2 1 2 7
API Payload 方式
创建 type=8(周期性会议)的 recurrence 参数说明:
| recurrence.type | 说明 | 可用字段 | 是否可用 |
|---|---|---|---|
| 1 | 每日循环(Daily) | end_date_time 或 count | ✅ |
| 2 | 每周循环(Weekly) | weekly_days(字符串), end_date_time 或 count | ✅ |
| 3 | 每月循环(Monthly) | monthly_day 或 monthly_weeks + weekly_days | ✅ |
⚠️ 关键避坑:weekly_days 必须是字符串,不是数组!
| 错误写法 | 正确写法 |
|---|---|
"weekly_days": [6] | "weekly_days": "6" |
"weekly_days": ["6"] | "weekly_days": "6"(单日) |
"weekly_days": "6,0"(多日,周六+周日) |
weekly_days 取值:1=周一 ~ 7=周日
示例:通过 api_call 直接 POST 创建周期性会议:
payload = {
"topic": "CSM公开课",
"type": 8,
"start_time": "2026-05-23T08:00:00",
"duration": 540,
"timezone": "Asia/Shanghai",
"recurrence": {
"type": 2,
"repeat_interval": 1,
"weekly_days": "6,0", # 周六+周日,字符串!
"end_date_time": "2026-05-24T00:00:00Z"
},
"settings": {
"host_video": True,
"participant_video": True,
"join_before_host": False,
"mute_upon_entry": False
}
}
多日示例(周一+周三+周五):
"weekly_days": "1,3,5"
踩坑记录
- scope 错误 (4711):某些 API(如
get_user)需要在 App 里开通对应 scope,又如list_meetings需要在 App 里开通meeting:read:list_meetings权限 - Token 有效期:Server-to-Server Token 有效期 1 小时,脚本自动刷新并缓存
- 用户 ID:可用邮箱,也可用
list_users查 user_id weekly_days必须为字符串:Zoom API 要求weekly_days是"6"这样的字符串,而非[6]数组,传数组会报 300 错误
Top skills in this category
API Gateway
@byungkyuCall third-party APIs through the Maton gateway, which injects the credential for an app the user has already connected. Use this skill when the user names a connected app and a concrete action in it - read a mailbox, query a CRM, file an issue, update a spreadsheet, run a query through a connected
Prompt Guard
@seojoonkim650+ pattern AI agent security defense covering prompt injection, supply chain injection, memory poisoning, action gate bypass, unicode steganography, cascad...
google-meet
@byungkyuGoogle Meet API integration with managed OAuth. Create meeting spaces, list conference records, and manage meeting participants. Use this skill when users want to interact with Google Meet. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login; default to read and list calls, and confirm every write or new connection with the user.
Manage Facebook Pages, posts, comments, messages, and insights via the Facebook Graph API. Use this skill when users want to post content, read engagement me...
Google Meet
@hith3shGoogle Meet API integration with managed OAuth. Create meeting spaces, inspect conference records, retrieve recordings and transcripts, and manage meeting pa...