# Meetup MCP tools

> Every Meetup MCP tool on the Cotlet server: tool names, input schemas, a tools/call example and an example result for each tool.

Source: https://cotlet.dev/docs/mcp/meetup

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

14 tools for Meetup on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Meetup account, as organizer or co-organizer of the group
- Integration page: https://cotlet.dev/integrations/meetup-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `meetup_list_groups` | read | Groups you organize or co-organize, with member count and your role. |
| `meetup_list_events` | read | Events of a group with date, RSVP counts, attendee limit and status. |
| `meetup_get_event` | read | Full event: title, description, time, venue or online link, hosts, fee and settings. |
| `meetup_list_attendees` | read | RSVPs of an event with guests, answers and check-in status. |
| `meetup_list_members` | read | Members of your group with join date and role. |
| `meetup_create_event` | write | New event as a draft, or published without an announcement. |
| `meetup_copy_event` | write | Copy a past event to a new date, keeping its description, venue and settings. |
| `meetup_update_event` | write | Change the title, time, description, venue or attendee limit of an upcoming event. |
| `meetup_announce_event` | write | Send the announcement of a published event to your members. |
| `meetup_update_attendee` | write | Mark a member as attending, remove them, or move them off the waitlist. |
| `meetup_mark_attendance` | write | Set check-in status for attendees of an event, from 1 hour before it starts. |
| `meetup_message_attendees` | write | Send a message to the people who RSVPed going to an upcoming or past event. |
| `meetup_message_members` | write | Contact members of your group who opted in to organizer announcements. |
| `meetup_cancel_event` | write | Cancel an upcoming event. Attendees are notified and it cannot be undone. |

## List groups

MCP tool: `meetup_list_groups`

Access: read.

Returns every group where you are organizer or co-organizer. Use group_urlname from each item as the group parameter of the other tools.

### Parameters

No parameters.

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_list_groups",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "groups": [
      {
        "group_urlname": "tech-founders-berlin",
        "name": "Tech Founders Berlin",
        "role": "organizer",
        "members": 2140
      }
    ]
  },
  "isError": false
}
```

## List events

MCP tool: `meetup_list_events`

Access: read.

Lists events of one group, soonest first for upcoming and newest first for past. Each item has the going and waitlist counts. get_event returns the full text.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `status` | enum | no | upcoming, past, draft or cancelled. Default: upcoming. |
| `limit` | integer | no | 1 to 50. Default: 20. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_list_events",
    "arguments": {
      "group_urlname": "https://example.com"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "events": [
      {
        "event_id": "311204587",
        "title": "Python Night #23",
        "start_time": "2026-10-08T19:00:00+02:00",
        "status": "past",
        "going": 38,
        "waitlist": 0,
        "attendee_limit": 40
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get event

MCP tool: `meetup_get_event`

Access: read.

Returns one event with its full description, venue or online link, hosts and settings such as the attendee limit. Use it before copy_event or update_event.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_get_event",
    "arguments": {
      "event_id": "event_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311204587",
    "title": "Python Night #23",
    "description": "Lightning talks and pizza.",
    "start_time": "2026-10-08T19:00:00+02:00",
    "duration_minutes": 120,
    "venue": {
      "name": "Co-Work Mitte",
      "address": "Torstr. 1",
      "city": "Berlin"
    },
    "attendee_limit": 40,
    "hosts": [
      "Dana K."
    ]
  },
  "isError": false
}
```

## List attendees

MCP tool: `meetup_list_attendees`

Access: read.

Returns the RSVPs of one event with the guests each member brings, answers to your event questions and check-in status. Filter by status to see the waitlist or the no-shows.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `status` | enum | no | going, waitlist, not_going, checked_in, no_show or all. Default: going. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_list_attendees",
    "arguments": {
      "event_id": "event_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "attendees": [
      {
        "member_id": "402118",
        "name": "Ana L.",
        "status": "going",
        "guests": 1,
        "checked_in": false
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## List members

MCP tool: `meetup_list_members`

Access: read.

Lists members of one group, newest first. Filter by join date to find new members. Pages hold up to 200 members; pass next_cursor back as cursor.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `joined_since` | date | no | Only members who joined on or after this date. |
| `limit` | integer | no | 1 to 200. Default: 100. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_list_members",
    "arguments": {
      "group_urlname": "https://example.com"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "members": [
      {
        "member_id": "402118",
        "name": "Ana L.",
        "role": "member",
        "joined_at": "2026-10-01T18:21:00Z"
      }
    ],
    "next_cursor": "eyJvZmZzZXQiOjEwMH0"
  },
  "isError": false
}
```

## Create event

MCP tool: `meetup_create_event`

Access: write. Confirm: waits for the user's OK before it runs.

Creates an event in your group. It is saved as a draft unless publish is true. A published event is visible to everyone, but members are told only when you call announce_event. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `title` | string | yes | Under 80 characters. |
| `start_time` | datetime | yes | ISO 8601 with time zone. |
| `duration_minutes` | integer | no | Default: 120. |
| `description` | string | no | Event description, Markdown. |
| `venue` | object | no | name, address and city, or online_url for an online event. |
| `attendee_limit` | integer | no | Turns on the waitlist when reached. |
| `publish` | boolean | no | Publish now or keep as draft. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_create_event",
    "arguments": {
      "group_urlname": "tech-founders-berlin",
      "title": "Intro to SQL",
      "start_time": "2026-11-03T19:00:00+01:00",
      "duration_minutes": 120,
      "venue": {
        "name": "Co-Work Mitte",
        "address": "Torstr. 1",
        "city": "Berlin"
      },
      "attendee_limit": 40,
      "publish": false
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311990021",
    "status": "draft",
    "title": "Intro to SQL",
    "start_time": "2026-11-03T19:00:00+01:00"
  },
  "isError": false
}
```

## Copy event

MCP tool: `meetup_copy_event`

Access: write. Confirm: waits for the user's OK before it runs.

Creates a new event from an existing one with the same description, venue and settings, at a new start time. It is a draft unless publish is true. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `start_time` | datetime | yes | New start, ISO 8601 with time zone. |
| `title` | string | no | New title. Default: the old one. |
| `publish` | boolean | no | Publish now or keep as draft. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_copy_event",
    "arguments": {
      "event_id": "311204587",
      "start_time": "2026-11-12T19:00:00+01:00",
      "title": "Python Night #24",
      "publish": true
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311988140",
    "status": "draft",
    "announced": false,
    "start_time": "2026-11-12T19:00:00+01:00",
    "url": "https://www.meetup.com/yourgroup/events/311988140/"
  },
  "isError": false
}
```

## Update event

MCP tool: `meetup_update_event`

Access: write. Confirm: waits for the user's OK before it runs.

Changes fields of an upcoming event. Only the fields you pass change. Edits to a published event are visible to members and attendees. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `fields` | object | yes | Any of title, start_time, duration_minutes, description, venue, attendee_limit. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_update_event",
    "arguments": {
      "event_id": "event_8c41d2",
      "fields": "fields"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311988140",
    "status": "updated",
    "changed": [
      "attendee_limit"
    ]
  },
  "isError": false
}
```

## Announce event

MCP tool: `meetup_announce_event`

Access: write. Confirm: waits for the user's OK before it runs.

Sends the announcement of one published event to the members of your group. Drafts cannot be announced. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_announce_event",
    "arguments": {
      "event_id": "event_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311988140",
    "announced": true
  },
  "isError": false
}
```

## Update attendee

MCP tool: `meetup_update_attendee`

Access: write. Confirm: waits for the user's OK before it runs.

Changes the RSVP of one member for one event. Moving off the waitlist needs a free spot under the attendee limit. The member sees the change. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `member_id` | string | yes | Member ID from list_attendees or list_members. |
| `action` | enum | yes | mark_attending, remove or move_from_waitlist. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_update_attendee",
    "arguments": {
      "event_id": "event_8c41d2",
      "member_id": "member_8c41d2",
      "action": "mark_attending"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311204587",
    "member_id": "402118",
    "status": "going"
  },
  "isError": false
}
```

## Mark attendance

MCP tool: `meetup_mark_attendance`

Access: write.

Sets the status of many attendees in one call, from 1 hour before the event starts, also after it has ended. It sends nothing to members and one more call changes the status again, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `member_ids` | string[] | yes | Member IDs from list_attendees. |
| `status` | enum | yes | checked_in, no_show or not_coming. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_mark_attendance",
    "arguments": {
      "event_id": "311204587",
      "member_ids": [
        "402118",
        "402119"
      ],
      "status": "no_show"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311204587",
    "updated": 2,
    "status": "no_show"
  },
  "isError": false
}
```

## Message attendees

MCP tool: `meetup_message_attendees`

Access: write. Confirm: waits for the user's OK before it runs.

Sends one message with a subject to the people who RSVPed going to an upcoming or past event, under your name. Returns how many people it reached. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `subject` | string | yes | Message subject. |
| `body` | string | yes | Message text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_message_attendees",
    "arguments": {
      "event_id": "311988140",
      "subject": "Room 204 and 19:30 start tonight",
      "body": "Python Night moved to room 204 at Co-Work Mitte and starts at 19:30. Same building, same talks."
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311204587",
    "status": "sent",
    "recipients": 38
  },
  "isError": false
}
```

## Message members

MCP tool: `meetup_message_members`

Access: write. Confirm: waits for the user's OK before it runs.

Sends one message to the members of your group who opted in to organizer announcements, under your name. Returns how many people it reached. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `subject` | string | yes | Message subject. |
| `body` | string | yes | Message text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_message_members",
    "arguments": {
      "group_urlname": "https://example.com",
      "subject": "subject",
      "body": "body"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "group_urlname": "tech-founders-berlin",
    "status": "sent",
    "recipients": 1760
  },
  "isError": false
}
```

## Cancel event

MCP tool: `meetup_cancel_event`

Access: write. Confirm: waits for the user's OK before it runs.

Cancels one upcoming event. Attendees are notified and the cancellation cannot be undone. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meetup_cancel_event",
    "arguments": {
      "event_id": "event_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "event_id": "311988140",
    "status": "cancelled"
  },
  "isError": false
}
```
