@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 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
+ }