meetup mcp
](https://hub.docker.com/r/aaronontheweb/meetup-mcp)
以组织者为中心的MCP服务器,用于管理单个Meetup组。通过Docker Compose作为持久HTTP服务运行——启动一次,从任何Claude Code会话连接。
此服务器故意简单:
- 无内置内容模板
- 无原始GraphQL传递
- 每个服务器实例只有一个组作用域
- 发布由显式配置控制的操作
使用LLM生成事件内容。使用此MCP服务器安全执行Meetup操作。
特性
authorize--OAuth2授权流(仅限首次运行)get_group--组元数据和成员计数search_events--按状态搜索:upcoming,past,draftget_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=truecreate_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消费者
- 首选
https://www.meetup.com/api/oauth/create/ - 集 重定向URI 到
http://127.0.0.1:8787/meetup/oauth/callback - 复制您的 消费者密钥 和 消费者秘密
2.配置环境
复制 .env.example 到 .env 并填写您的值:
cp .env.example .envMEETUP_GROUP_URLNAME=your-group-urlname
MEETUP_MODE=organizer
MEETUP_ALLOW_PUBLISH=false
MEETUP_OAUTH_KEY=your-consumer-key
MEETUP_OAUTH_SECRET=your-consumer-secret3.构建容器镜像
dotnet publish src/Meetup.McpServer/Meetup.McpServer.csproj /t:PublishContainer4.启动服务器
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卷可能拥有不正确的所有权。删除并重新创建它: ``bash 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
图像上传流程
照片上传分为两个步骤:
- 呼叫
create_event_photo_upload→ 回报{ photoId, uploadUrl } PUT图像字节直接到uploadUrl- 呼叫
attach_event_photo或attach_event_speaker_photo和eventId+photoId
结构化扬声器支持
Meetup当前的GraphQL API公开了一个单一的结构化 speakerDetails 每个事件的对象,而不是自由形式的扬声器阵列。MCP服务器通过专注的工具公开这一点:
add_event_speakerupdate_event_speakerremove_event_speakerattach_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
