使用说明
事件cli
用于管理Meetup和Luma事件的命令行工具。使用Playwright浏览器自动化-不需要付费的API层。设计为脚本化:每个操作都是一个具有可预测标志和退出代码的非交互式命令。
命令
| 命令 | 描述 |
|---|---|
events login --platform <meetup|luma> |
身份验证(打开浏览器窗口登录) |
events logout --platform <meetup|luma> |
清除平台的已保存会话 |
events status [--platform <meetup|luma>] |
检查哪些平台有活动会话 |
events meetup-list-events --group-url-name <name> |
列出Meetup组中即将举行的活动 |
events meetup-create-event ... |
在Meetup上创建活动 |
events meetup-update-event --event-url <url> ... |
编辑现有的Meetup活动 |
events meetup-cancel-event --event-url <url> --confirm |
取消聚会活动(破坏性) |
events meetup-get-rsvps --event-url <url> |
获取Meetup活动的回复列表 |
events luma-list-events |
从Luma仪表板中列出即将发生的事件 |
events luma-create-event ... |
在Luma上创建活动 |
events luma-update-event --event-url <url> ... |
编辑现有Luma事件 |
events luma-cancel-event --event-url <url> --confirm |
取消Luma事件(破坏性) |
events luma-get-rsvps --event-url <url> |
获取Luma活动的宾客名单 |
events sync --source-url <url> --target-platform <meetup|luma> |
将事件从一个平台复制到另一个平台 |
短别名: login, logout, status, sync两者都有 meetup-create-event 和 meetup_create_event 拼写是有效的。
跑 events help 查看完整列表,或 events <command> --help 对于命令的标志(根据底层模式自动生成,因此帮助总是准确的)。
设置
npm install
npx playwright install chromium
npm run build
然后将其链接到您的 PATH:
npm link # makes `events` available globally
events status
…或在不链接的情况下运行它:
npm start -- status # via the start script
node dist/cli.js status # directly
用法
首先,每个平台登录一次(这会打开一个真正的浏览器窗口供您登录,包括任何2FA)。会话已保存到 ~/.events-mcp/,所以你只做一次:
events login --platform meetup
events login --platform luma
events status
然后从命令行或脚本驱动事件:
# List what's coming up
events meetup-list-events --group-url-name imagineering-ai-claude-code
# Create a draft (omit --publish to keep it a draft)
events meetup-create-event \
--group-url-name imagineering-ai-claude-code \
--title "AI Hack Night" \
--description "Bring a laptop and an idea." \
--start-date 2026-06-13T18:00:00 \
--venue-name "The Loading Bar" \
--publish
# Change the time and venue of an existing event — only the flags you pass change
events meetup-update-event \
--event-url https://www.meetup.com/imagineering-ai-claude-code/events/123456789/ \
--start-date 2026-06-14T18:00:00 \
--venue-name "Fishburners"
# Cancel an event (destructive — requires the explicit guard flag)
events meetup-cancel-event \
--event-url https://www.meetup.com/imagineering-ai-claude-code/events/123456789/ \
--confirm
# Mirror a Luma event onto Meetup
events sync \
--source-url https://lu.ma/abc123 \
--target-platform meetup \
--group-url-name imagineering-ai-claude-code
标志、退出代码和脚本
- 旗帜是烤肉串箱 (
--group-url-name)并映射到基础字段名称;camelCase(--groupUrlName)以及--flag=value也被接受。 - 布尔值 存在标志:
--publish将其设置为真,--no-publish将其设置为假。 - 退出代码:
0成功,1运行时错误(打印到stderr),2无效参数(用法打印到stderr)。这使得该工具可以安全地链接脚本&&并在CI/CD中打开。 - 输出 转到stdout;list/RSVP命令发出JSON,您可以通过管道进入
jq.
events meetup-get-rsvps --event-url "$URL" | jq '.count'
建筑
该工具是一个精简的CLI 前端 通过与传输无关的命令注册表。每个操作都存在于 src/tools/*.ts 作为一个普通物体-- { name, description, schema, handler } --以及 src/tools/registry.ts 将它们收集到一个列表中。
架构驱动标志 — src/cli/args.ts 读取每个命令的zod schema 并导出其CLI标志:字段类型变为标志类型,枚举变为有效选项,选项变为非必需,以及 .describe() 文本变成了帮助。没有手写的标志表,因此标志和验证永远不会偏离模式。添加新命令是一个文件更改,它会自动获得标志、验证和 --help.
会话持续 --浏览器会话(Cookie、本地存储)保存到 ~/.events-mcp/ 因此,您无需对每次运行都重新进行身份验证。
Browsermutex --进程内互斥体将所有浏览器操作序列化,因此并发工作不会破坏共享的Playwright上下文。
首次使用时的会话验证 --在平台的第一次操作中,该工具加载站点并检查保存的会话是否仍然有效,及早捕获过时的令牌,而不是在操作过程中失败。
安全关机 --每个命令都会刷新 storageState 并在退出前关闭浏览器,因此会话在调用后仍然存在。
项目结构
src/
cli.ts CLI entry: command dispatch, help, lifecycle
cli/
args.ts Schema-driven flag parsing & validation (pure, unit-tested)
args.test.ts
browser.ts Browser management, session persistence, BrowserMutex
tools/
registry.ts Collects all tools; command/alias resolution
auth.ts Login, logout, status
meetup.ts Meetup: list, create, update, cancel, RSVPs
luma.ts Luma: list, create, update, cancel, RSVPs
sync.ts Cross-platform sync
注意事项
浏览器自动化本质上是脆弱的。创建/更新/取消命令通过CSS选择器驱动实时Meetup和Luma页面,当这些网站更改其HTML时,这些选择器可能会中断。如果一个命令在正常工作后开始失败,选择器可能需要更新—— *-create-event, *-update-event,以及 *-cancel-event 处理程序在 src/tools/ 在哪里可以看。CLI框架(解析、验证、调度)经过全面的单元测试且稳定;站点选择器是最好的努力。