Meetup管理服务

用于管理单个Meetup组的组织者导向的MCP服务器,支持通过Docker Compose作为持久HTTP服务运行,并提供安全的Meetup操作执行功能。

  • by Aaronontheweb
  • C#
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 Aaronontheweb/meetup-mcp

使用说明

meetup mcp

以组织者为中心的MCP服务器,用于管理单个Meetup组。通过Docker Compose作为持久HTTP服务运行——启动一次,从任何Claude Code会话连接。

此服务器故意简单:

  • 无内置内容模板
  • 无原始GraphQL传递
  • 每个服务器实例只有一个组作用域
  • 发布由显式配置控制的操作

使用LLM生成事件内容。使用此MCP服务器安全执行Meetup操作。

特性

  • authorize --OAuth2授权流(仅限首次运行)
  • get_group --组元数据和成员计数
  • search_events --按状态搜索: upcoming, past, draft
  • get_event --按ID列出的完整事件详细信息
  • list_venues --该团体的已知场地
  • create_event --默认情况下创建为草稿
  • edit_event --更新标题、描述、日期时间、持续时间、地点、路线、特色照片
  • add_event_speaker --在活动中添加结构化的演讲者详细信息
  • update_event_speaker --编辑结构化的演讲者详细信息或演讲者照片
  • remove_event_speaker --从事件中删除结构化演讲者详细信息
  • attach_event_speaker_photo --将上传的照片附加到活动演讲者个人资料中
  • publish_event --后面有门 MEETUP_ALLOW_PUBLISH=true
  • create_event_photo_upload --获取直接上传票(照片ID+上传URL)
  • attach_event_photo --将上传的照片附加到活动中

安全模型

  • 单组锁通过 MEETUP_GROUP_URLNAME
  • 基于模式的能力控制(organizer 对比 read_only)
  • 所有写入都需要 organizer 模式
  • 默认情况下阻止发布(MEETUP_ALLOW_PUBLISH=false)
  • 除非明确启用并请求发布,否则创建为草稿的事件

策略违规返回前缀为的错误 POLICY_DENIED.

部署

先决条件

  • Docker+Docker组合
  • 具有API访问权限的Meetup Pro帐户
  • Meetup OAuth消费者(密钥+秘密)

1.创建Meetup OAuth消费者

  1. 首选 https://www.meetup.com/api/oauth/create/
  2. 集 重定向URI 到 http://127.0.0.1:8787/meetup/oauth/callback
  3. 复制您的 消费者密钥 和 消费者秘密

2.配置环境

复制 .env.example 到 .env 并填写您的值:

cp .env.example .env
MEETUP_GROUP_URLNAME=your-group-urlname
MEETUP_MODE=organizer
MEETUP_ALLOW_PUBLISH=false
MEETUP_OAUTH_KEY=your-consumer-key
MEETUP_OAUTH_SECRET=your-consumer-secret

3.构建容器镜像

dotnet publish src/Meetup.McpServer/Meetup.McpServer.csproj /t:PublishContainer

4.启动服务器

docker compose up -d

服务器运行在 http://localhost:5180/mcp 除非明确停止,否则会自动重新启动。

5.配置克劳德代码

包括 .mcp.json 将Claude Code指向正在运行的服务器:

{
  "mcpServers": {
    "meetup": {
      "type": "http",
      "url": "http://localhost:5180/mcp"
    }
  }
}

6.授权(仅限首次运行)

第一次调用API时,服务器将提示您进行授权。打电话给 authorize 工具——它返回一个在浏览器中打开的URL。在您在Meetup网站上授权后,浏览器将重定向到 http://127.0.0.1:8787/meetup/oauth/callback?code=....

重要提示: 如果服务器在远程计算机(VM、云)上运行,则浏览器重定向将落在您的本地计算机上,而不是服务器上。复制完整的回调URL并运行:

curl "http://YOUR_SERVER:8787/meetup/oauth/callback?code=THE_CODE"

令牌被持久化在Docker卷中(meetup-mcp-tokens)并在容器重启后幸存下来。每个令牌生命周期只需要授权一次。

注: 如果您之前运行过此映像,但OAuth令牌存储无法持久,则您的Docker卷可能拥有不正确的所有权。删除并重新创建它:

docker compose down
docker volume rm meetup-mcp-tokens
docker compose up -d

配置参考

变量 必填 默认 描述
MEETUP_GROUP_URLNAME 是 -- 聚会组URL名称(例如。 nhdnug)
MEETUP_MODE 没有 organizer organizer 或 read_only
MEETUP_ALLOW_PUBLISH 没有 false 启用 publish_event 工具
MEETUP_ALLOW_DESTRUCTIVE 没有 false 预留用于未来的破坏性操作
MEETUP_USE_FAKE_API 没有 false 使用内存中的假响应(本地开发)
MEETUP_OAUTH_KEY 是* -- OAuth使用者密钥
MEETUP_OAUTH_SECRET 是* -- OAuth消费者机密
MEETUP_OAUTH_REDIRECT_URI 没有 http://127.0.0.1:8787/meetup/oauth/callback OAuth重定向URI
MEETUP_TOKEN_STORE_PATH 没有 ~/.meetup-mcp/tokens.json 令牌持久化路径
MEETUP_API_URL 没有 https://api.meetup.com/gql-ext Meetup GraphQL端点
MEETUP_OAUTH_ACCESS_URL 没有 https://secure.meetup.com/oauth2/access 令牌交换端点

*在以下情况下不需要 MEETUP_USE_FAKE_API=true

图像上传流程

照片上传分为两个步骤:

  1. 呼叫 create_event_photo_upload → 回报 { photoId, uploadUrl }
  2. PUT 图像字节直接到 uploadUrl
  3. 呼叫 attach_event_photo 或 attach_event_speaker_photo 和 eventId + photoId

结构化扬声器支持

Meetup当前的GraphQL API公开了一个单一的结构化 speakerDetails 每个事件的对象,而不是自由形式的扬声器阵列。MCP服务器通过专注的工具公开这一点:

  • add_event_speaker
  • update_event_speaker
  • remove_event_speaker
  • attach_event_speaker_photo

get_event 现在返回结构化的说话者详细信息(如果存在)。

本地开发

dotnet build MeetupMcp.slnx
dotnet test MeetupMcp.slnx

针对内存中的假数据运行(不需要Meetup凭据):

MEETUP_GROUP_URLNAME=nhdnug \
MEETUP_USE_FAKE_API=true \
dotnet run --project src/Meetup.McpServer/Meetup.McpServer.csproj

仓库

  • github: https://github.com/Aaronontheweb/meetup-mcp