@prmichaelsen/eventbrite-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +267 -0
- package/dist/server.js +681 -0
- package/dist/server.js.map +7 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# @prmichaelsen/eventbrite-mcp
|
|
2
|
+
|
|
3
|
+
An MCP (Model Context Protocol) server that provides event management and ticketing capabilities through the Eventbrite API.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Event Management**: List, create, and retrieve event details
|
|
8
|
+
- **Ticket Management**: Create and manage ticket classes
|
|
9
|
+
- **Attendee Management**: List and retrieve attendee information
|
|
10
|
+
- **Organization Support**: Work with Eventbrite organizations
|
|
11
|
+
- **Pagination Support**: Handle large datasets efficiently
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Using npx (Recommended)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @prmichaelsen/eventbrite-mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Using npm
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @prmichaelsen/eventbrite-mcp
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Configuration
|
|
28
|
+
|
|
29
|
+
### Environment Variables
|
|
30
|
+
|
|
31
|
+
Create a `.env` file in your project root or set the following environment variables:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Required
|
|
35
|
+
EVENTBRITE_API_TOKEN=your_eventbrite_api_token
|
|
36
|
+
|
|
37
|
+
# Optional
|
|
38
|
+
EVENTBRITE_API_URL=https://www.eventbriteapi.com/v3 # Default API URL
|
|
39
|
+
EVENTBRITE_TIMEOUT=30000 # Request timeout in ms
|
|
40
|
+
EVENTBRITE_RETRIES=3 # Number of retry attempts
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Getting an Eventbrite API Token
|
|
44
|
+
|
|
45
|
+
1. Go to [Eventbrite API Keys Page](https://www.eventbrite.com/platform/api-keys)
|
|
46
|
+
2. Sign in to your Eventbrite account
|
|
47
|
+
3. Copy your Private Token
|
|
48
|
+
4. Add it to your MCP client configuration (see below)
|
|
49
|
+
|
|
50
|
+
**Note:** You must create your own Eventbrite OAuth application if you need to access other users' data. For personal use, a private token is sufficient.
|
|
51
|
+
|
|
52
|
+
### MCP Client Configuration
|
|
53
|
+
|
|
54
|
+
Add to your MCP client configuration (e.g., Claude Desktop):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"eventbrite": {
|
|
60
|
+
"command": "npx",
|
|
61
|
+
"args": ["-y", "@prmichaelsen/eventbrite-mcp"],
|
|
62
|
+
"env": {
|
|
63
|
+
"EVENTBRITE_API_TOKEN": "your_eventbrite_api_token"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Or if installed globally:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"mcpServers": {
|
|
75
|
+
"eventbrite": {
|
|
76
|
+
"command": "eventbrite-mcp",
|
|
77
|
+
"env": {
|
|
78
|
+
"EVENTBRITE_API_TOKEN": "your_eventbrite_api_token"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Available Tools
|
|
86
|
+
|
|
87
|
+
### list_events
|
|
88
|
+
|
|
89
|
+
List events from Eventbrite with optional filtering.
|
|
90
|
+
|
|
91
|
+
**Parameters:**
|
|
92
|
+
- `organizationId` (optional): Filter events by organization ID
|
|
93
|
+
- `status` (optional): Filter by status (draft, live, started, ended, completed, canceled, all)
|
|
94
|
+
- `orderBy` (optional): Order results (start_asc, start_desc, created_asc, created_desc)
|
|
95
|
+
- `pageSize` (optional): Number of results per page (1-50, default: 50)
|
|
96
|
+
- `continuation` (optional): Pagination token
|
|
97
|
+
|
|
98
|
+
**Example:**
|
|
99
|
+
```typescript
|
|
100
|
+
{
|
|
101
|
+
"status": "live",
|
|
102
|
+
"orderBy": "start_asc",
|
|
103
|
+
"pageSize": 10
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### get_event
|
|
108
|
+
|
|
109
|
+
Get detailed information about a specific event.
|
|
110
|
+
|
|
111
|
+
**Parameters:**
|
|
112
|
+
- `eventId` (required): The ID of the event
|
|
113
|
+
|
|
114
|
+
**Example:**
|
|
115
|
+
```typescript
|
|
116
|
+
{
|
|
117
|
+
"eventId": "123456789"
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### create_event
|
|
122
|
+
|
|
123
|
+
Create a new event on Eventbrite.
|
|
124
|
+
|
|
125
|
+
**Parameters:**
|
|
126
|
+
- `name` (required): Event name
|
|
127
|
+
- `startTime` (required): Start time in ISO 8601 format
|
|
128
|
+
- `endTime` (required): End time in ISO 8601 format
|
|
129
|
+
- `timezone` (required): Timezone (e.g., "America/New_York")
|
|
130
|
+
- `currency` (required): Currency code (e.g., "USD")
|
|
131
|
+
- `description` (optional): Event description (supports HTML)
|
|
132
|
+
- `online` (optional): Whether this is an online event
|
|
133
|
+
- `listed` (optional): Whether to list publicly
|
|
134
|
+
- `capacity` (optional): Maximum capacity
|
|
135
|
+
- `organizationId` (optional): Organization ID
|
|
136
|
+
|
|
137
|
+
**Example:**
|
|
138
|
+
```typescript
|
|
139
|
+
{
|
|
140
|
+
"name": "Tech Conference 2024",
|
|
141
|
+
"description": "Annual technology conference",
|
|
142
|
+
"startTime": "2024-12-31T09:00:00",
|
|
143
|
+
"endTime": "2024-12-31T17:00:00",
|
|
144
|
+
"timezone": "America/New_York",
|
|
145
|
+
"currency": "USD",
|
|
146
|
+
"online": false,
|
|
147
|
+
"listed": true,
|
|
148
|
+
"capacity": 500
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### create_ticket_class
|
|
153
|
+
|
|
154
|
+
Create a ticket class for an event.
|
|
155
|
+
|
|
156
|
+
**Parameters:**
|
|
157
|
+
- `eventId` (required): The event ID
|
|
158
|
+
- `name` (required): Ticket class name
|
|
159
|
+
- `quantityTotal` (required): Total tickets available
|
|
160
|
+
- `free` (optional): Whether the ticket is free
|
|
161
|
+
- `cost` (optional): Ticket cost in minor units (e.g., cents)
|
|
162
|
+
- `currency` (optional): Currency code
|
|
163
|
+
- `description` (optional): Ticket description
|
|
164
|
+
- `salesStart` (optional): Sales start time (ISO 8601)
|
|
165
|
+
- `salesEnd` (optional): Sales end time (ISO 8601)
|
|
166
|
+
|
|
167
|
+
**Example:**
|
|
168
|
+
```typescript
|
|
169
|
+
{
|
|
170
|
+
"eventId": "123456789",
|
|
171
|
+
"name": "General Admission",
|
|
172
|
+
"quantityTotal": 100,
|
|
173
|
+
"free": false,
|
|
174
|
+
"cost": 5000,
|
|
175
|
+
"currency": "USD",
|
|
176
|
+
"description": "Standard entry ticket"
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### list_attendees
|
|
181
|
+
|
|
182
|
+
List attendees for a specific event.
|
|
183
|
+
|
|
184
|
+
**Parameters:**
|
|
185
|
+
- `eventId` (required): The event ID
|
|
186
|
+
- `status` (optional): Filter by status (attending, not_attending, unpaid)
|
|
187
|
+
- `pageSize` (optional): Results per page (1-50, default: 50)
|
|
188
|
+
- `continuation` (optional): Pagination token
|
|
189
|
+
|
|
190
|
+
**Example:**
|
|
191
|
+
```typescript
|
|
192
|
+
{
|
|
193
|
+
"eventId": "123456789",
|
|
194
|
+
"status": "attending",
|
|
195
|
+
"pageSize": 50
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Development
|
|
200
|
+
|
|
201
|
+
### Setup
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# Clone the repository
|
|
205
|
+
git clone https://github.com/prmichaelsen/eventbrite-mcp.git
|
|
206
|
+
cd eventbrite-mcp
|
|
207
|
+
|
|
208
|
+
# Install dependencies
|
|
209
|
+
npm install
|
|
210
|
+
|
|
211
|
+
# Build the project
|
|
212
|
+
npm run build
|
|
213
|
+
|
|
214
|
+
# Run in development mode with watch
|
|
215
|
+
npm run watch
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Project Structure
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
eventbrite-mcp/
|
|
222
|
+
├── src/
|
|
223
|
+
│ ├── server.ts # Main MCP server
|
|
224
|
+
│ ├── eventbrite/
|
|
225
|
+
│ │ └── client.ts # Eventbrite API client
|
|
226
|
+
│ ├── tools/ # MCP tool implementations
|
|
227
|
+
│ │ ├── list-events.ts
|
|
228
|
+
│ │ ├── get-event.ts
|
|
229
|
+
│ │ ├── create-event.ts
|
|
230
|
+
│ │ ├── create-ticket-class.ts
|
|
231
|
+
│ │ └── list-attendees.ts
|
|
232
|
+
│ ├── types/ # TypeScript type definitions
|
|
233
|
+
│ │ ├── eventbrite.ts
|
|
234
|
+
│ │ └── mcp.ts
|
|
235
|
+
│ └── utils/ # Utility functions
|
|
236
|
+
│ ├── logger.ts
|
|
237
|
+
│ └── error-serializer.ts
|
|
238
|
+
├── package.json
|
|
239
|
+
├── tsconfig.json
|
|
240
|
+
└── README.md
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Testing
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
npm test
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Building
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
npm run build
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
MIT
|
|
258
|
+
|
|
259
|
+
## Author
|
|
260
|
+
|
|
261
|
+
Patrick Michaelsen
|
|
262
|
+
|
|
263
|
+
## Links
|
|
264
|
+
|
|
265
|
+
- [Eventbrite API Documentation](https://www.eventbrite.com/platform/api)
|
|
266
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
267
|
+
- [GitHub Repository](https://github.com/prmichaelsen/eventbrite-mcp)
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,681 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// src/server.ts
|
|
7
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
8
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
+
import {
|
|
10
|
+
CallToolRequestSchema,
|
|
11
|
+
ListToolsRequestSchema
|
|
12
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
13
|
+
import { config } from "dotenv";
|
|
14
|
+
|
|
15
|
+
// src/eventbrite/client.ts
|
|
16
|
+
var EventbriteClient = class {
|
|
17
|
+
static {
|
|
18
|
+
__name(this, "EventbriteClient");
|
|
19
|
+
}
|
|
20
|
+
config;
|
|
21
|
+
baseUrl;
|
|
22
|
+
constructor(config2) {
|
|
23
|
+
this.config = {
|
|
24
|
+
apiUrl: "https://www.eventbriteapi.com/v3",
|
|
25
|
+
timeout: 3e4,
|
|
26
|
+
retries: 3,
|
|
27
|
+
...config2
|
|
28
|
+
};
|
|
29
|
+
this.baseUrl = this.config.apiUrl;
|
|
30
|
+
}
|
|
31
|
+
async request(endpoint, options = {}) {
|
|
32
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
33
|
+
const headers = {
|
|
34
|
+
"Authorization": `Bearer ${this.config.apiToken}`,
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
...options.headers
|
|
37
|
+
};
|
|
38
|
+
let lastError = null;
|
|
39
|
+
const retries = this.config.retries || 3;
|
|
40
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
41
|
+
try {
|
|
42
|
+
const controller = new AbortController();
|
|
43
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
44
|
+
const response = await fetch(url, {
|
|
45
|
+
...options,
|
|
46
|
+
headers,
|
|
47
|
+
signal: controller.signal
|
|
48
|
+
});
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const errorBody = await response.text();
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Eventbrite API error: ${response.status} ${response.statusText} - ${errorBody}`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return await response.json();
|
|
57
|
+
} catch (error) {
|
|
58
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
if (attempt < retries) {
|
|
60
|
+
const delay = Math.pow(2, attempt) * 1e3;
|
|
61
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
throw lastError || new Error("Request failed after retries");
|
|
66
|
+
}
|
|
67
|
+
async get(endpoint) {
|
|
68
|
+
return this.request(endpoint, { method: "GET" });
|
|
69
|
+
}
|
|
70
|
+
async post(endpoint, body) {
|
|
71
|
+
return this.request(endpoint, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
body: JSON.stringify(body)
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async patch(endpoint, body) {
|
|
77
|
+
return this.request(endpoint, {
|
|
78
|
+
method: "PATCH",
|
|
79
|
+
body: JSON.stringify(body)
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async delete(endpoint) {
|
|
83
|
+
return this.request(endpoint, { method: "DELETE" });
|
|
84
|
+
}
|
|
85
|
+
// Event operations
|
|
86
|
+
async listEvents(params) {
|
|
87
|
+
const queryParams = new URLSearchParams();
|
|
88
|
+
if (params.status) queryParams.append("status", params.status);
|
|
89
|
+
if (params.orderBy) queryParams.append("order_by", params.orderBy);
|
|
90
|
+
if (params.pageSize) queryParams.append("page_size", params.pageSize.toString());
|
|
91
|
+
if (params.continuation) queryParams.append("continuation", params.continuation);
|
|
92
|
+
const endpoint = params.organizationId ? `/organizations/${params.organizationId}/events/?${queryParams}` : `/users/me/events/?${queryParams}`;
|
|
93
|
+
return this.get(endpoint);
|
|
94
|
+
}
|
|
95
|
+
async getEvent(eventId) {
|
|
96
|
+
return this.get(`/events/${eventId}/`);
|
|
97
|
+
}
|
|
98
|
+
async createEvent(data) {
|
|
99
|
+
return this.post("/events/", {
|
|
100
|
+
event: data
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async updateEvent(eventId, data) {
|
|
104
|
+
return this.post(`/events/${eventId}/`, {
|
|
105
|
+
event: data
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async publishEvent(eventId) {
|
|
109
|
+
return this.post(`/events/${eventId}/publish/`, {});
|
|
110
|
+
}
|
|
111
|
+
async cancelEvent(eventId) {
|
|
112
|
+
return this.post(`/events/${eventId}/cancel/`, {});
|
|
113
|
+
}
|
|
114
|
+
// Ticket class operations
|
|
115
|
+
async listTicketClasses(eventId) {
|
|
116
|
+
return this.get(`/events/${eventId}/ticket_classes/`);
|
|
117
|
+
}
|
|
118
|
+
async createTicketClass(eventId, data) {
|
|
119
|
+
return this.post(`/events/${eventId}/ticket_classes/`, {
|
|
120
|
+
ticket_class: data
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// Attendee operations
|
|
124
|
+
async listAttendees(eventId, params) {
|
|
125
|
+
const queryParams = new URLSearchParams();
|
|
126
|
+
if (params.status) queryParams.append("status", params.status);
|
|
127
|
+
if (params.pageSize) queryParams.append("page_size", params.pageSize.toString());
|
|
128
|
+
if (params.continuation) queryParams.append("continuation", params.continuation);
|
|
129
|
+
return this.get(`/events/${eventId}/attendees/?${queryParams}`);
|
|
130
|
+
}
|
|
131
|
+
async getAttendee(eventId, attendeeId) {
|
|
132
|
+
return this.get(`/events/${eventId}/attendees/${attendeeId}/`);
|
|
133
|
+
}
|
|
134
|
+
// Order operations
|
|
135
|
+
async listOrders(eventId, params) {
|
|
136
|
+
const queryParams = new URLSearchParams();
|
|
137
|
+
if (params.status) queryParams.append("status", params.status);
|
|
138
|
+
if (params.pageSize) queryParams.append("page_size", params.pageSize.toString());
|
|
139
|
+
if (params.continuation) queryParams.append("continuation", params.continuation);
|
|
140
|
+
return this.get(`/events/${eventId}/orders/?${queryParams}`);
|
|
141
|
+
}
|
|
142
|
+
// Venue operations
|
|
143
|
+
async getVenue(venueId) {
|
|
144
|
+
return this.get(`/venues/${venueId}/`);
|
|
145
|
+
}
|
|
146
|
+
async createVenue(organizationId, data) {
|
|
147
|
+
return this.post(`/organizations/${organizationId}/venues/`, {
|
|
148
|
+
venue: data
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Organization operations
|
|
152
|
+
async getOrganization(organizationId) {
|
|
153
|
+
return this.get(`/organizations/${organizationId}/`);
|
|
154
|
+
}
|
|
155
|
+
async getCurrentUser() {
|
|
156
|
+
return this.get("/users/me/");
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// src/tools/list-events.ts
|
|
161
|
+
var ListEventsTool = class {
|
|
162
|
+
constructor(client) {
|
|
163
|
+
this.client = client;
|
|
164
|
+
}
|
|
165
|
+
static {
|
|
166
|
+
__name(this, "ListEventsTool");
|
|
167
|
+
}
|
|
168
|
+
getToolDefinition() {
|
|
169
|
+
return {
|
|
170
|
+
name: "list_events",
|
|
171
|
+
description: "List events from Eventbrite. Can filter by organization, status, and ordering.",
|
|
172
|
+
inputSchema: {
|
|
173
|
+
type: "object",
|
|
174
|
+
properties: {
|
|
175
|
+
organizationId: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "Filter events by organization ID"
|
|
178
|
+
},
|
|
179
|
+
status: {
|
|
180
|
+
type: "string",
|
|
181
|
+
enum: ["draft", "live", "started", "ended", "completed", "canceled", "all"],
|
|
182
|
+
description: "Filter events by status"
|
|
183
|
+
},
|
|
184
|
+
orderBy: {
|
|
185
|
+
type: "string",
|
|
186
|
+
enum: ["start_asc", "start_desc", "created_asc", "created_desc"],
|
|
187
|
+
description: "Order events by field"
|
|
188
|
+
},
|
|
189
|
+
pageSize: {
|
|
190
|
+
type: "number",
|
|
191
|
+
description: "Number of events to return per page (default: 50, max: 50)",
|
|
192
|
+
minimum: 1,
|
|
193
|
+
maximum: 50
|
|
194
|
+
},
|
|
195
|
+
continuation: {
|
|
196
|
+
type: "string",
|
|
197
|
+
description: "Continuation token for pagination"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
async execute(args) {
|
|
204
|
+
try {
|
|
205
|
+
const response = await this.client.listEvents({
|
|
206
|
+
organizationId: args.organizationId,
|
|
207
|
+
status: args.status,
|
|
208
|
+
orderBy: args.orderBy,
|
|
209
|
+
pageSize: args.pageSize || 50,
|
|
210
|
+
continuation: args.continuation
|
|
211
|
+
});
|
|
212
|
+
return {
|
|
213
|
+
success: true,
|
|
214
|
+
events: response.events || [],
|
|
215
|
+
pagination: response.pagination
|
|
216
|
+
};
|
|
217
|
+
} catch (error) {
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
// src/tools/get-event.ts
|
|
227
|
+
var GetEventTool = class {
|
|
228
|
+
constructor(client) {
|
|
229
|
+
this.client = client;
|
|
230
|
+
}
|
|
231
|
+
static {
|
|
232
|
+
__name(this, "GetEventTool");
|
|
233
|
+
}
|
|
234
|
+
getToolDefinition() {
|
|
235
|
+
return {
|
|
236
|
+
name: "get_event",
|
|
237
|
+
description: "Get detailed information about a specific event by ID",
|
|
238
|
+
inputSchema: {
|
|
239
|
+
type: "object",
|
|
240
|
+
properties: {
|
|
241
|
+
eventId: {
|
|
242
|
+
type: "string",
|
|
243
|
+
description: "The ID of the event to retrieve"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
required: ["eventId"]
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
async execute(args) {
|
|
251
|
+
try {
|
|
252
|
+
const event = await this.client.getEvent(args.eventId);
|
|
253
|
+
return {
|
|
254
|
+
success: true,
|
|
255
|
+
event
|
|
256
|
+
};
|
|
257
|
+
} catch (error) {
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// src/tools/create-event.ts
|
|
267
|
+
var CreateEventTool = class {
|
|
268
|
+
constructor(client) {
|
|
269
|
+
this.client = client;
|
|
270
|
+
}
|
|
271
|
+
static {
|
|
272
|
+
__name(this, "CreateEventTool");
|
|
273
|
+
}
|
|
274
|
+
getToolDefinition() {
|
|
275
|
+
return {
|
|
276
|
+
name: "create_event",
|
|
277
|
+
description: "Create a new event on Eventbrite",
|
|
278
|
+
inputSchema: {
|
|
279
|
+
type: "object",
|
|
280
|
+
properties: {
|
|
281
|
+
name: {
|
|
282
|
+
type: "string",
|
|
283
|
+
description: "The name of the event"
|
|
284
|
+
},
|
|
285
|
+
description: {
|
|
286
|
+
type: "string",
|
|
287
|
+
description: "The description of the event (supports HTML)"
|
|
288
|
+
},
|
|
289
|
+
startTime: {
|
|
290
|
+
type: "string",
|
|
291
|
+
description: "Event start time in ISO 8601 format (e.g., 2024-12-31T20:00:00)"
|
|
292
|
+
},
|
|
293
|
+
endTime: {
|
|
294
|
+
type: "string",
|
|
295
|
+
description: "Event end time in ISO 8601 format (e.g., 2024-12-31T23:00:00)"
|
|
296
|
+
},
|
|
297
|
+
timezone: {
|
|
298
|
+
type: "string",
|
|
299
|
+
description: "Timezone for the event (e.g., America/New_York)"
|
|
300
|
+
},
|
|
301
|
+
currency: {
|
|
302
|
+
type: "string",
|
|
303
|
+
description: "Currency code (e.g., USD, EUR, GBP)"
|
|
304
|
+
},
|
|
305
|
+
online: {
|
|
306
|
+
type: "boolean",
|
|
307
|
+
description: "Whether this is an online event"
|
|
308
|
+
},
|
|
309
|
+
listed: {
|
|
310
|
+
type: "boolean",
|
|
311
|
+
description: "Whether the event should be publicly listed"
|
|
312
|
+
},
|
|
313
|
+
capacity: {
|
|
314
|
+
type: "number",
|
|
315
|
+
description: "Maximum capacity for the event"
|
|
316
|
+
},
|
|
317
|
+
organizationId: {
|
|
318
|
+
type: "string",
|
|
319
|
+
description: "Organization ID to create the event under"
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
required: ["name", "startTime", "endTime", "timezone", "currency"]
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
async execute(args) {
|
|
327
|
+
try {
|
|
328
|
+
const eventData = {
|
|
329
|
+
name: {
|
|
330
|
+
html: args.name
|
|
331
|
+
},
|
|
332
|
+
start: {
|
|
333
|
+
timezone: args.timezone,
|
|
334
|
+
utc: new Date(args.startTime).toISOString()
|
|
335
|
+
},
|
|
336
|
+
end: {
|
|
337
|
+
timezone: args.timezone,
|
|
338
|
+
utc: new Date(args.endTime).toISOString()
|
|
339
|
+
},
|
|
340
|
+
currency: args.currency
|
|
341
|
+
};
|
|
342
|
+
if (args.description) {
|
|
343
|
+
eventData.description = {
|
|
344
|
+
html: args.description
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
if (args.online !== void 0) {
|
|
348
|
+
eventData.online_event = args.online;
|
|
349
|
+
}
|
|
350
|
+
if (args.listed !== void 0) {
|
|
351
|
+
eventData.listed = args.listed;
|
|
352
|
+
}
|
|
353
|
+
if (args.capacity !== void 0) {
|
|
354
|
+
eventData.capacity = args.capacity;
|
|
355
|
+
}
|
|
356
|
+
const event = await this.client.createEvent(eventData);
|
|
357
|
+
return {
|
|
358
|
+
success: true,
|
|
359
|
+
event
|
|
360
|
+
};
|
|
361
|
+
} catch (error) {
|
|
362
|
+
return {
|
|
363
|
+
success: false,
|
|
364
|
+
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
// src/tools/list-attendees.ts
|
|
371
|
+
var ListAttendeesTool = class {
|
|
372
|
+
constructor(client) {
|
|
373
|
+
this.client = client;
|
|
374
|
+
}
|
|
375
|
+
static {
|
|
376
|
+
__name(this, "ListAttendeesTool");
|
|
377
|
+
}
|
|
378
|
+
getToolDefinition() {
|
|
379
|
+
return {
|
|
380
|
+
name: "list_attendees",
|
|
381
|
+
description: "List attendees for a specific event",
|
|
382
|
+
inputSchema: {
|
|
383
|
+
type: "object",
|
|
384
|
+
properties: {
|
|
385
|
+
eventId: {
|
|
386
|
+
type: "string",
|
|
387
|
+
description: "The ID of the event"
|
|
388
|
+
},
|
|
389
|
+
status: {
|
|
390
|
+
type: "string",
|
|
391
|
+
enum: ["attending", "not_attending", "unpaid"],
|
|
392
|
+
description: "Filter attendees by status"
|
|
393
|
+
},
|
|
394
|
+
pageSize: {
|
|
395
|
+
type: "number",
|
|
396
|
+
description: "Number of attendees to return per page (default: 50, max: 50)",
|
|
397
|
+
minimum: 1,
|
|
398
|
+
maximum: 50
|
|
399
|
+
},
|
|
400
|
+
continuation: {
|
|
401
|
+
type: "string",
|
|
402
|
+
description: "Continuation token for pagination"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
required: ["eventId"]
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
async execute(args) {
|
|
410
|
+
try {
|
|
411
|
+
const response = await this.client.listAttendees(args.eventId, {
|
|
412
|
+
status: args.status,
|
|
413
|
+
pageSize: args.pageSize || 50,
|
|
414
|
+
continuation: args.continuation
|
|
415
|
+
});
|
|
416
|
+
return {
|
|
417
|
+
success: true,
|
|
418
|
+
attendees: response.attendees || [],
|
|
419
|
+
pagination: response.pagination
|
|
420
|
+
};
|
|
421
|
+
} catch (error) {
|
|
422
|
+
return {
|
|
423
|
+
success: false,
|
|
424
|
+
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// src/tools/create-ticket-class.ts
|
|
431
|
+
var CreateTicketClassTool = class {
|
|
432
|
+
constructor(client) {
|
|
433
|
+
this.client = client;
|
|
434
|
+
}
|
|
435
|
+
static {
|
|
436
|
+
__name(this, "CreateTicketClassTool");
|
|
437
|
+
}
|
|
438
|
+
getToolDefinition() {
|
|
439
|
+
return {
|
|
440
|
+
name: "create_ticket_class",
|
|
441
|
+
description: "Create a new ticket class for an event",
|
|
442
|
+
inputSchema: {
|
|
443
|
+
type: "object",
|
|
444
|
+
properties: {
|
|
445
|
+
eventId: {
|
|
446
|
+
type: "string",
|
|
447
|
+
description: "The ID of the event"
|
|
448
|
+
},
|
|
449
|
+
name: {
|
|
450
|
+
type: "string",
|
|
451
|
+
description: "The name of the ticket class"
|
|
452
|
+
},
|
|
453
|
+
quantityTotal: {
|
|
454
|
+
type: "number",
|
|
455
|
+
description: "Total quantity of tickets available"
|
|
456
|
+
},
|
|
457
|
+
free: {
|
|
458
|
+
type: "boolean",
|
|
459
|
+
description: "Whether the ticket is free"
|
|
460
|
+
},
|
|
461
|
+
cost: {
|
|
462
|
+
type: "number",
|
|
463
|
+
description: "Cost of the ticket (in minor currency units, e.g., cents)"
|
|
464
|
+
},
|
|
465
|
+
currency: {
|
|
466
|
+
type: "string",
|
|
467
|
+
description: "Currency code (e.g., USD, EUR, GBP)"
|
|
468
|
+
},
|
|
469
|
+
description: {
|
|
470
|
+
type: "string",
|
|
471
|
+
description: "Description of the ticket class"
|
|
472
|
+
},
|
|
473
|
+
salesStart: {
|
|
474
|
+
type: "string",
|
|
475
|
+
description: "When ticket sales start (ISO 8601 format)"
|
|
476
|
+
},
|
|
477
|
+
salesEnd: {
|
|
478
|
+
type: "string",
|
|
479
|
+
description: "When ticket sales end (ISO 8601 format)"
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
required: ["eventId", "name", "quantityTotal"]
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
async execute(args) {
|
|
487
|
+
try {
|
|
488
|
+
const ticketData = {
|
|
489
|
+
name: args.name,
|
|
490
|
+
quantity_total: args.quantityTotal,
|
|
491
|
+
free: args.free !== void 0 ? args.free : true
|
|
492
|
+
};
|
|
493
|
+
if (args.cost !== void 0 && args.currency) {
|
|
494
|
+
ticketData.cost = {
|
|
495
|
+
currency: args.currency,
|
|
496
|
+
value: args.cost
|
|
497
|
+
};
|
|
498
|
+
ticketData.free = false;
|
|
499
|
+
}
|
|
500
|
+
if (args.description) {
|
|
501
|
+
ticketData.description = args.description;
|
|
502
|
+
}
|
|
503
|
+
if (args.salesStart) {
|
|
504
|
+
ticketData.sales_start = args.salesStart;
|
|
505
|
+
}
|
|
506
|
+
if (args.salesEnd) {
|
|
507
|
+
ticketData.sales_end = args.salesEnd;
|
|
508
|
+
}
|
|
509
|
+
const ticketClass = await this.client.createTicketClass(args.eventId, ticketData);
|
|
510
|
+
return {
|
|
511
|
+
success: true,
|
|
512
|
+
ticketClass
|
|
513
|
+
};
|
|
514
|
+
} catch (error) {
|
|
515
|
+
return {
|
|
516
|
+
success: false,
|
|
517
|
+
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
// src/utils/logger.ts
|
|
524
|
+
var Logger = class {
|
|
525
|
+
static {
|
|
526
|
+
__name(this, "Logger");
|
|
527
|
+
}
|
|
528
|
+
// No-op logger to avoid interfering with stdio MCP transport
|
|
529
|
+
// All logging methods do nothing to prevent JSON corruption
|
|
530
|
+
error(message, ...args) {
|
|
531
|
+
}
|
|
532
|
+
warn(message, ...args) {
|
|
533
|
+
}
|
|
534
|
+
info(message, ...args) {
|
|
535
|
+
}
|
|
536
|
+
debug(message, ...args) {
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
var logger = new Logger();
|
|
540
|
+
|
|
541
|
+
// src/server.ts
|
|
542
|
+
config();
|
|
543
|
+
var EventbriteMCPServer = class {
|
|
544
|
+
static {
|
|
545
|
+
__name(this, "EventbriteMCPServer");
|
|
546
|
+
}
|
|
547
|
+
server;
|
|
548
|
+
eventbriteClient;
|
|
549
|
+
listEventsTool;
|
|
550
|
+
getEventTool;
|
|
551
|
+
createEventTool;
|
|
552
|
+
listAttendeesTool;
|
|
553
|
+
createTicketClassTool;
|
|
554
|
+
constructor() {
|
|
555
|
+
this.server = new Server(
|
|
556
|
+
{
|
|
557
|
+
name: "eventbrite-mcp-server",
|
|
558
|
+
version: "0.1.0"
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
capabilities: {
|
|
562
|
+
tools: {}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
);
|
|
566
|
+
const apiToken = process.env.EVENTBRITE_API_TOKEN;
|
|
567
|
+
if (!apiToken) {
|
|
568
|
+
throw new Error("EVENTBRITE_API_TOKEN environment variable is required");
|
|
569
|
+
}
|
|
570
|
+
const eventbriteConfig = {
|
|
571
|
+
apiToken,
|
|
572
|
+
apiUrl: process.env.EVENTBRITE_API_URL || "https://www.eventbriteapi.com/v3",
|
|
573
|
+
timeout: parseInt(process.env.EVENTBRITE_TIMEOUT || "30000"),
|
|
574
|
+
retries: parseInt(process.env.EVENTBRITE_RETRIES || "3")
|
|
575
|
+
};
|
|
576
|
+
this.eventbriteClient = new EventbriteClient(eventbriteConfig);
|
|
577
|
+
this.listEventsTool = new ListEventsTool(this.eventbriteClient);
|
|
578
|
+
this.getEventTool = new GetEventTool(this.eventbriteClient);
|
|
579
|
+
this.createEventTool = new CreateEventTool(this.eventbriteClient);
|
|
580
|
+
this.listAttendeesTool = new ListAttendeesTool(this.eventbriteClient);
|
|
581
|
+
this.createTicketClassTool = new CreateTicketClassTool(this.eventbriteClient);
|
|
582
|
+
this.setupHandlers();
|
|
583
|
+
}
|
|
584
|
+
setupHandlers() {
|
|
585
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
586
|
+
return {
|
|
587
|
+
tools: [
|
|
588
|
+
this.listEventsTool.getToolDefinition(),
|
|
589
|
+
this.getEventTool.getToolDefinition(),
|
|
590
|
+
this.createEventTool.getToolDefinition(),
|
|
591
|
+
this.listAttendeesTool.getToolDefinition(),
|
|
592
|
+
this.createTicketClassTool.getToolDefinition()
|
|
593
|
+
]
|
|
594
|
+
};
|
|
595
|
+
});
|
|
596
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
597
|
+
const { name, arguments: args } = request.params;
|
|
598
|
+
try {
|
|
599
|
+
let result;
|
|
600
|
+
switch (name) {
|
|
601
|
+
case "list_events":
|
|
602
|
+
result = await this.listEventsTool.execute(args);
|
|
603
|
+
break;
|
|
604
|
+
case "get_event":
|
|
605
|
+
result = await this.getEventTool.execute(args);
|
|
606
|
+
break;
|
|
607
|
+
case "create_event":
|
|
608
|
+
result = await this.createEventTool.execute(args);
|
|
609
|
+
break;
|
|
610
|
+
case "list_attendees":
|
|
611
|
+
result = await this.listAttendeesTool.execute(args);
|
|
612
|
+
break;
|
|
613
|
+
case "create_ticket_class":
|
|
614
|
+
result = await this.createTicketClassTool.execute(args);
|
|
615
|
+
break;
|
|
616
|
+
default:
|
|
617
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
618
|
+
}
|
|
619
|
+
if (result.error || !result.success) {
|
|
620
|
+
return {
|
|
621
|
+
content: [
|
|
622
|
+
{
|
|
623
|
+
type: "text",
|
|
624
|
+
text: JSON.stringify(result, null, 2)
|
|
625
|
+
}
|
|
626
|
+
],
|
|
627
|
+
isError: true
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
return {
|
|
631
|
+
content: [
|
|
632
|
+
{
|
|
633
|
+
type: "text",
|
|
634
|
+
text: JSON.stringify(result, null, 2)
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
};
|
|
638
|
+
} catch (error) {
|
|
639
|
+
logger.error(`Tool execution failed for ${name}:`, error);
|
|
640
|
+
return {
|
|
641
|
+
content: [
|
|
642
|
+
{
|
|
643
|
+
type: "text",
|
|
644
|
+
text: JSON.stringify({
|
|
645
|
+
success: false,
|
|
646
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
647
|
+
tool: name
|
|
648
|
+
}, null, 2)
|
|
649
|
+
}
|
|
650
|
+
],
|
|
651
|
+
isError: true
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
async start() {
|
|
657
|
+
try {
|
|
658
|
+
logger.info("Starting Eventbrite MCP Server...");
|
|
659
|
+
const transport = new StdioServerTransport();
|
|
660
|
+
await this.server.connect(transport);
|
|
661
|
+
} catch (error) {
|
|
662
|
+
process.exit(1);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
async stop() {
|
|
666
|
+
await this.server.close();
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
var server = new EventbriteMCPServer();
|
|
670
|
+
process.on("SIGINT", async () => {
|
|
671
|
+
await server.stop();
|
|
672
|
+
process.exit(0);
|
|
673
|
+
});
|
|
674
|
+
process.on("SIGTERM", async () => {
|
|
675
|
+
await server.stop();
|
|
676
|
+
process.exit(0);
|
|
677
|
+
});
|
|
678
|
+
server.start().catch((error) => {
|
|
679
|
+
process.exit(1);
|
|
680
|
+
});
|
|
681
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/server.ts", "../src/eventbrite/client.ts", "../src/tools/list-events.ts", "../src/tools/get-event.ts", "../src/tools/create-event.ts", "../src/tools/list-attendees.ts", "../src/tools/create-ticket-class.ts", "../src/utils/logger.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { config } from 'dotenv';\nimport { EventbriteClient } from './eventbrite/client.js';\nimport { EventbriteConfig } from './types/eventbrite.js';\nimport { ListEventsTool } from './tools/list-events.js';\nimport { GetEventTool } from './tools/get-event.js';\nimport { CreateEventTool } from './tools/create-event.js';\nimport { ListAttendeesTool } from './tools/list-attendees.js';\nimport { CreateTicketClassTool } from './tools/create-ticket-class.js';\nimport { logger } from './utils/logger.js';\n\n// Load environment variables\nconfig();\n\nclass EventbriteMCPServer {\n private server: Server;\n private eventbriteClient: EventbriteClient;\n private listEventsTool: ListEventsTool;\n private getEventTool: GetEventTool;\n private createEventTool: CreateEventTool;\n private listAttendeesTool: ListAttendeesTool;\n private createTicketClassTool: CreateTicketClassTool;\n\n constructor() {\n // Initialize server\n this.server = new Server(\n {\n name: 'eventbrite-mcp-server',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Initialize Eventbrite client\n const apiToken = process.env.EVENTBRITE_API_TOKEN;\n if (!apiToken) {\n throw new Error('EVENTBRITE_API_TOKEN environment variable is required');\n }\n\n const eventbriteConfig: EventbriteConfig = {\n apiToken,\n apiUrl: process.env.EVENTBRITE_API_URL || 'https://www.eventbriteapi.com/v3',\n timeout: parseInt(process.env.EVENTBRITE_TIMEOUT || '30000'),\n retries: parseInt(process.env.EVENTBRITE_RETRIES || '3')\n };\n\n this.eventbriteClient = new EventbriteClient(eventbriteConfig);\n this.listEventsTool = new ListEventsTool(this.eventbriteClient);\n this.getEventTool = new GetEventTool(this.eventbriteClient);\n this.createEventTool = new CreateEventTool(this.eventbriteClient);\n this.listAttendeesTool = new ListAttendeesTool(this.eventbriteClient);\n this.createTicketClassTool = new CreateTicketClassTool(this.eventbriteClient);\n\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n this.listEventsTool.getToolDefinition(),\n this.getEventTool.getToolDefinition(),\n this.createEventTool.getToolDefinition(),\n this.listAttendeesTool.getToolDefinition(),\n this.createTicketClassTool.getToolDefinition()\n ],\n };\n });\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n let result: any;\n \n switch (name) {\n case 'list_events':\n result = await this.listEventsTool.execute(args as any);\n break;\n\n case 'get_event':\n result = await this.getEventTool.execute(args as any);\n break;\n\n case 'create_event':\n result = await this.createEventTool.execute(args as any);\n break;\n\n case 'list_attendees':\n result = await this.listAttendeesTool.execute(args as any);\n break;\n\n case 'create_ticket_class':\n result = await this.createTicketClassTool.execute(args as any);\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n // Check if the tool returned an error response\n if (result.error || !result.success) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: true,\n };\n }\n\n // Normal successful response\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error(`Tool execution failed for ${name}:`, error);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n tool: name\n }, null, 2),\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n async start(): Promise<void> {\n try {\n logger.info('Starting Eventbrite MCP Server...');\n\n // Start MCP server with stdio transport\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n\n // Don't log to stdout/stderr when using stdio transport - it interferes with MCP JSON\n // logger.info('Eventbrite MCP Server started successfully');\n\n } catch (error) {\n // Don't log to stderr when using stdio transport\n // logger.error('Failed to start server:', error);\n process.exit(1);\n }\n }\n\n async stop(): Promise<void> {\n // Don't log when using stdio transport\n // logger.info('Stopping Eventbrite MCP Server...');\n await this.server.close();\n // logger.info('Server stopped');\n }\n}\n\n// Handle graceful shutdown\nconst server = new EventbriteMCPServer();\n\nprocess.on('SIGINT', async () => {\n await server.stop();\n process.exit(0);\n});\n\nprocess.on('SIGTERM', async () => {\n await server.stop();\n process.exit(0);\n});\n\n// Start the server\nserver.start().catch((error) => {\n // Don't log to stderr when using stdio transport\n // logger.error('Server startup failed:', error);\n process.exit(1);\n});\n", "import { EventbriteConfig } from '../types/eventbrite.js';\nimport { logger } from '../utils/logger.js';\n\nexport class EventbriteClient {\n private config: EventbriteConfig;\n private baseUrl: string;\n\n constructor(config: EventbriteConfig) {\n this.config = {\n apiUrl: 'https://www.eventbriteapi.com/v3',\n timeout: 30000,\n retries: 3,\n ...config\n };\n this.baseUrl = this.config.apiUrl!;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = {\n 'Authorization': `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n ...options.headers\n };\n\n let lastError: Error | null = null;\n const retries = this.config.retries || 3;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(\n `Eventbrite API error: ${response.status} ${response.statusText} - ${errorBody}`\n );\n }\n\n return await response.json() as T;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n \n if (attempt < retries) {\n const delay = Math.pow(2, attempt) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError || new Error('Request failed after retries');\n }\n\n async get<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET' });\n }\n\n async post<T>(endpoint: string, body: any): Promise<T> {\n return this.request<T>(endpoint, {\n method: 'POST',\n body: JSON.stringify(body)\n });\n }\n\n async patch<T>(endpoint: string, body: any): Promise<T> {\n return this.request<T>(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(body)\n });\n }\n\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n // Event operations\n async listEvents(params: {\n organizationId?: string;\n status?: string;\n orderBy?: string;\n pageSize?: number;\n continuation?: string;\n }) {\n const queryParams = new URLSearchParams();\n \n if (params.status) queryParams.append('status', params.status);\n if (params.orderBy) queryParams.append('order_by', params.orderBy);\n if (params.pageSize) queryParams.append('page_size', params.pageSize.toString());\n if (params.continuation) queryParams.append('continuation', params.continuation);\n\n const endpoint = params.organizationId\n ? `/organizations/${params.organizationId}/events/?${queryParams}`\n : `/users/me/events/?${queryParams}`;\n\n return this.get<any>(endpoint);\n }\n\n async getEvent(eventId: string) {\n return this.get<any>(`/events/${eventId}/`);\n }\n\n async createEvent(data: any) {\n return this.post<any>('/events/', {\n event: data\n });\n }\n\n async updateEvent(eventId: string, data: any) {\n return this.post<any>(`/events/${eventId}/`, {\n event: data\n });\n }\n\n async publishEvent(eventId: string) {\n return this.post<any>(`/events/${eventId}/publish/`, {});\n }\n\n async cancelEvent(eventId: string) {\n return this.post<any>(`/events/${eventId}/cancel/`, {});\n }\n\n // Ticket class operations\n async listTicketClasses(eventId: string) {\n return this.get<any>(`/events/${eventId}/ticket_classes/`);\n }\n\n async createTicketClass(eventId: string, data: any) {\n return this.post<any>(`/events/${eventId}/ticket_classes/`, {\n ticket_class: data\n });\n }\n\n // Attendee operations\n async listAttendees(eventId: string, params: {\n status?: string;\n pageSize?: number;\n continuation?: string;\n }) {\n const queryParams = new URLSearchParams();\n \n if (params.status) queryParams.append('status', params.status);\n if (params.pageSize) queryParams.append('page_size', params.pageSize.toString());\n if (params.continuation) queryParams.append('continuation', params.continuation);\n\n return this.get<any>(`/events/${eventId}/attendees/?${queryParams}`);\n }\n\n async getAttendee(eventId: string, attendeeId: string) {\n return this.get<any>(`/events/${eventId}/attendees/${attendeeId}/`);\n }\n\n // Order operations\n async listOrders(eventId: string, params: {\n status?: string;\n pageSize?: number;\n continuation?: string;\n }) {\n const queryParams = new URLSearchParams();\n \n if (params.status) queryParams.append('status', params.status);\n if (params.pageSize) queryParams.append('page_size', params.pageSize.toString());\n if (params.continuation) queryParams.append('continuation', params.continuation);\n\n return this.get<any>(`/events/${eventId}/orders/?${queryParams}`);\n }\n\n // Venue operations\n async getVenue(venueId: string) {\n return this.get<any>(`/venues/${venueId}/`);\n }\n\n async createVenue(organizationId: string, data: any) {\n return this.post<any>(`/organizations/${organizationId}/venues/`, {\n venue: data\n });\n }\n\n // Organization operations\n async getOrganization(organizationId: string) {\n return this.get<any>(`/organizations/${organizationId}/`);\n }\n\n async getCurrentUser() {\n return this.get<any>('/users/me/');\n }\n}\n", "import { EventbriteClient } from '../eventbrite/client.js';\nimport { ListEventsArgs, EventListResult } from '../types/mcp.js';\n\nexport class ListEventsTool {\n constructor(private client: EventbriteClient) {}\n\n getToolDefinition() {\n return {\n name: 'list_events',\n description: 'List events from Eventbrite. Can filter by organization, status, and ordering.',\n inputSchema: {\n type: 'object',\n properties: {\n organizationId: {\n type: 'string',\n description: 'Filter events by organization ID'\n },\n status: {\n type: 'string',\n enum: ['draft', 'live', 'started', 'ended', 'completed', 'canceled', 'all'],\n description: 'Filter events by status'\n },\n orderBy: {\n type: 'string',\n enum: ['start_asc', 'start_desc', 'created_asc', 'created_desc'],\n description: 'Order events by field'\n },\n pageSize: {\n type: 'number',\n description: 'Number of events to return per page (default: 50, max: 50)',\n minimum: 1,\n maximum: 50\n },\n continuation: {\n type: 'string',\n description: 'Continuation token for pagination'\n }\n }\n }\n };\n }\n\n async execute(args: ListEventsArgs): Promise<EventListResult> {\n try {\n const response = await this.client.listEvents({\n organizationId: args.organizationId,\n status: args.status,\n orderBy: args.orderBy,\n pageSize: args.pageSize || 50,\n continuation: args.continuation\n });\n\n return {\n success: true,\n events: response.events || [],\n pagination: response.pagination\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n }\n}\n", "import { EventbriteClient } from '../eventbrite/client.js';\nimport { GetEventArgs, EventResult } from '../types/mcp.js';\n\nexport class GetEventTool {\n constructor(private client: EventbriteClient) {}\n\n getToolDefinition() {\n return {\n name: 'get_event',\n description: 'Get detailed information about a specific event by ID',\n inputSchema: {\n type: 'object',\n properties: {\n eventId: {\n type: 'string',\n description: 'The ID of the event to retrieve'\n }\n },\n required: ['eventId']\n }\n };\n }\n\n async execute(args: GetEventArgs): Promise<EventResult> {\n try {\n const event = await this.client.getEvent(args.eventId);\n\n return {\n success: true,\n event\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n }\n}\n", "import { EventbriteClient } from '../eventbrite/client.js';\nimport { CreateEventArgs, EventResult } from '../types/mcp.js';\n\nexport class CreateEventTool {\n constructor(private client: EventbriteClient) {}\n\n getToolDefinition() {\n return {\n name: 'create_event',\n description: 'Create a new event on Eventbrite',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The name of the event'\n },\n description: {\n type: 'string',\n description: 'The description of the event (supports HTML)'\n },\n startTime: {\n type: 'string',\n description: 'Event start time in ISO 8601 format (e.g., 2024-12-31T20:00:00)'\n },\n endTime: {\n type: 'string',\n description: 'Event end time in ISO 8601 format (e.g., 2024-12-31T23:00:00)'\n },\n timezone: {\n type: 'string',\n description: 'Timezone for the event (e.g., America/New_York)'\n },\n currency: {\n type: 'string',\n description: 'Currency code (e.g., USD, EUR, GBP)'\n },\n online: {\n type: 'boolean',\n description: 'Whether this is an online event'\n },\n listed: {\n type: 'boolean',\n description: 'Whether the event should be publicly listed'\n },\n capacity: {\n type: 'number',\n description: 'Maximum capacity for the event'\n },\n organizationId: {\n type: 'string',\n description: 'Organization ID to create the event under'\n }\n },\n required: ['name', 'startTime', 'endTime', 'timezone', 'currency']\n }\n };\n }\n\n async execute(args: CreateEventArgs): Promise<EventResult> {\n try {\n const eventData: any = {\n name: {\n html: args.name\n },\n start: {\n timezone: args.timezone,\n utc: new Date(args.startTime).toISOString()\n },\n end: {\n timezone: args.timezone,\n utc: new Date(args.endTime).toISOString()\n },\n currency: args.currency\n };\n\n if (args.description) {\n eventData.description = {\n html: args.description\n };\n }\n\n if (args.online !== undefined) {\n eventData.online_event = args.online;\n }\n\n if (args.listed !== undefined) {\n eventData.listed = args.listed;\n }\n\n if (args.capacity !== undefined) {\n eventData.capacity = args.capacity;\n }\n\n const event = await this.client.createEvent(eventData);\n\n return {\n success: true,\n event\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n }\n}\n", "import { EventbriteClient } from '../eventbrite/client.js';\nimport { ListAttendeesArgs, AttendeeListResult } from '../types/mcp.js';\n\nexport class ListAttendeesTool {\n constructor(private client: EventbriteClient) {}\n\n getToolDefinition() {\n return {\n name: 'list_attendees',\n description: 'List attendees for a specific event',\n inputSchema: {\n type: 'object',\n properties: {\n eventId: {\n type: 'string',\n description: 'The ID of the event'\n },\n status: {\n type: 'string',\n enum: ['attending', 'not_attending', 'unpaid'],\n description: 'Filter attendees by status'\n },\n pageSize: {\n type: 'number',\n description: 'Number of attendees to return per page (default: 50, max: 50)',\n minimum: 1,\n maximum: 50\n },\n continuation: {\n type: 'string',\n description: 'Continuation token for pagination'\n }\n },\n required: ['eventId']\n }\n };\n }\n\n async execute(args: ListAttendeesArgs): Promise<AttendeeListResult> {\n try {\n const response = await this.client.listAttendees(args.eventId, {\n status: args.status,\n pageSize: args.pageSize || 50,\n continuation: args.continuation\n });\n\n return {\n success: true,\n attendees: response.attendees || [],\n pagination: response.pagination\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n }\n}\n", "import { EventbriteClient } from '../eventbrite/client.js';\nimport { CreateTicketClassArgs, TicketClassResult } from '../types/mcp.js';\n\nexport class CreateTicketClassTool {\n constructor(private client: EventbriteClient) {}\n\n getToolDefinition() {\n return {\n name: 'create_ticket_class',\n description: 'Create a new ticket class for an event',\n inputSchema: {\n type: 'object',\n properties: {\n eventId: {\n type: 'string',\n description: 'The ID of the event'\n },\n name: {\n type: 'string',\n description: 'The name of the ticket class'\n },\n quantityTotal: {\n type: 'number',\n description: 'Total quantity of tickets available'\n },\n free: {\n type: 'boolean',\n description: 'Whether the ticket is free'\n },\n cost: {\n type: 'number',\n description: 'Cost of the ticket (in minor currency units, e.g., cents)'\n },\n currency: {\n type: 'string',\n description: 'Currency code (e.g., USD, EUR, GBP)'\n },\n description: {\n type: 'string',\n description: 'Description of the ticket class'\n },\n salesStart: {\n type: 'string',\n description: 'When ticket sales start (ISO 8601 format)'\n },\n salesEnd: {\n type: 'string',\n description: 'When ticket sales end (ISO 8601 format)'\n }\n },\n required: ['eventId', 'name', 'quantityTotal']\n }\n };\n }\n\n async execute(args: CreateTicketClassArgs): Promise<TicketClassResult> {\n try {\n const ticketData: any = {\n name: args.name,\n quantity_total: args.quantityTotal,\n free: args.free !== undefined ? args.free : true\n };\n\n if (args.cost !== undefined && args.currency) {\n ticketData.cost = {\n currency: args.currency,\n value: args.cost\n };\n ticketData.free = false;\n }\n\n if (args.description) {\n ticketData.description = args.description;\n }\n\n if (args.salesStart) {\n ticketData.sales_start = args.salesStart;\n }\n\n if (args.salesEnd) {\n ticketData.sales_end = args.salesEnd;\n }\n\n const ticketClass = await this.client.createTicketClass(args.eventId, ticketData);\n\n return {\n success: true,\n ticketClass\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n }\n}\n", "export enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3\n}\n\nclass Logger {\n // No-op logger to avoid interfering with stdio MCP transport\n // All logging methods do nothing to prevent JSON corruption\n\n error(message: string, ...args: any[]): void {\n // No-op\n }\n\n warn(message: string, ...args: any[]): void {\n // No-op\n }\n\n info(message: string, ...args: any[]): void {\n // No-op\n }\n\n debug(message: string, ...args: any[]): void {\n // No-op\n }\n}\n\nexport const logger = new Logger();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@prmichaelsen/eventbrite-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Eventbrite MCP server providing event management and ticketing capabilities",
|
|
5
|
+
"main": "dist/server.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"eventbrite-mcp": "./dist/server.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "node esbuild.build.js",
|
|
12
|
+
"watch": "node esbuild.watch.js",
|
|
13
|
+
"start": "node dist/server.js",
|
|
14
|
+
"test": "vitest",
|
|
15
|
+
"test:watch": "vitest --watch",
|
|
16
|
+
"lint": "eslint src --ext .ts",
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"eventbrite",
|
|
23
|
+
"events",
|
|
24
|
+
"ticketing",
|
|
25
|
+
"event-management"
|
|
26
|
+
],
|
|
27
|
+
"author": "Patrick Michaelsen",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
31
|
+
"dotenv": "^16.3.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^20.10.0",
|
|
35
|
+
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
|
36
|
+
"@typescript-eslint/parser": "^6.14.0",
|
|
37
|
+
"esbuild": "^0.25.10",
|
|
38
|
+
"eslint": "^8.55.0",
|
|
39
|
+
"typescript": "^5.3.0",
|
|
40
|
+
"vitest": "^1.0.0"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18.0.0"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist",
|
|
47
|
+
"README.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
]
|
|
50
|
+
}
|