活动管理命令行工具

用于管理Meetup和Luma活动的命令行工具,利用Playwright浏览器自动化实现无需付费API层级的功能,支持脚本化操作。

  • by imagineering-cc
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 imagineering-cc/events-mcp

使用说明

事件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框架(解析、验证、调度)经过全面的单元测试且稳定;站点选择器是最好的努力。