@chrischall/eventbrite-mcp 0.3.3 → 1.0.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.
@@ -10,9 +10,9 @@ export function registerAccountTools(server, deps) {
10
10
  const { client } = deps;
11
11
  server.registerTool('eb_me', {
12
12
  description: "Get the authenticated Eventbrite user's profile (id, name, primary email).",
13
- inputSchema: {
13
+ inputSchema: z.object({
14
14
  view: viewArg(),
15
- },
15
+ }),
16
16
  annotations: { readOnlyHint: true },
17
17
  }, async ({ view }) => {
18
18
  const data = await client.request('GET', '/users/me/');
@@ -21,14 +21,14 @@ export function registerAccountTools(server, deps) {
21
21
  server.registerTool('eb_my_orders', {
22
22
  description: "List the authenticated user's ticket orders (attendee side), with the event expanded. time_filter narrows to upcoming or past events.",
23
23
  annotations: { readOnlyHint: true },
24
- inputSchema: {
24
+ inputSchema: z.object({
25
25
  view: viewArg(),
26
26
  time_filter: z
27
27
  .enum(['all', 'current_future', 'past'])
28
28
  .optional()
29
29
  .describe('Filter orders by event time (default all)'),
30
30
  continuation: schemaContinuation,
31
- },
31
+ }),
32
32
  }, async ({ time_filter, continuation, view }) => {
33
33
  const params = new URLSearchParams({ expand: 'event' });
34
34
  if (time_filter)
@@ -41,9 +41,10 @@ export function registerAccountTools(server, deps) {
41
41
  server.registerTool('eb_my_organizations', {
42
42
  description: 'List the organizations the authenticated user belongs to (organizer side). Use the returned org id with eb_org_events / eb_org_attendees / eb_org_orders.',
43
43
  annotations: { readOnlyHint: true },
44
- inputSchema: {
45
- view: viewArg(), continuation: schemaContinuation
46
- },
44
+ inputSchema: z.object({
45
+ view: viewArg(),
46
+ continuation: schemaContinuation,
47
+ }),
47
48
  }, async ({ continuation, view }) => {
48
49
  const params = new URLSearchParams();
49
50
  if (continuation)
@@ -54,18 +55,16 @@ export function registerAccountTools(server, deps) {
54
55
  server.registerTool('eb_org_events', {
55
56
  description: "List an organization's events (as organizer), optionally filtered by status.",
56
57
  annotations: { readOnlyHint: true },
57
- inputSchema: {
58
+ inputSchema: z.object({
58
59
  view: viewArg(),
59
60
  org_id: z.string().describe('Organization id (from eb_my_organizations)'),
60
61
  status: z
61
62
  .enum(['all', 'live', 'draft', 'started', 'ended', 'completed', 'canceled'])
62
63
  .optional()
63
64
  .describe('Event status filter (default all)'),
64
- order_by: z
65
- .enum(['start_asc', 'start_desc', 'created_asc', 'created_desc'])
66
- .optional(),
65
+ order_by: z.enum(['start_asc', 'start_desc', 'created_asc', 'created_desc']).optional(),
67
66
  continuation: schemaContinuation,
68
- },
67
+ }),
69
68
  }, async ({ org_id, status, order_by, continuation, view }) => {
70
69
  const params = new URLSearchParams();
71
70
  if (status)
@@ -80,7 +79,7 @@ export function registerAccountTools(server, deps) {
80
79
  server.registerTool('eb_org_attendees', {
81
80
  description: "List attendees across an organization's events (organizer side).",
82
81
  annotations: { readOnlyHint: true },
83
- inputSchema: {
82
+ inputSchema: z.object({
84
83
  view: viewArg(),
85
84
  org_id: z.string().describe('Organization id (from eb_my_organizations)'),
86
85
  status: z
@@ -88,7 +87,7 @@ export function registerAccountTools(server, deps) {
88
87
  .optional()
89
88
  .describe('Attendee status filter'),
90
89
  continuation: schemaContinuation,
91
- },
90
+ }),
92
91
  }, async ({ org_id, status, continuation, view }) => {
93
92
  const params = new URLSearchParams();
94
93
  if (status)
@@ -101,11 +100,11 @@ export function registerAccountTools(server, deps) {
101
100
  server.registerTool('eb_org_orders', {
102
101
  description: "List orders across an organization's events (organizer side).",
103
102
  annotations: { readOnlyHint: true },
104
- inputSchema: {
103
+ inputSchema: z.object({
105
104
  view: viewArg(),
106
105
  org_id: z.string().describe('Organization id (from eb_my_organizations)'),
107
106
  continuation: schemaContinuation,
108
- },
107
+ }),
109
108
  }, async ({ org_id, continuation, view }) => {
110
109
  const params = new URLSearchParams();
111
110
  if (continuation)
@@ -136,11 +135,11 @@ export function registerAccountTools(server, deps) {
136
135
  server.registerTool(name, {
137
136
  description,
138
137
  annotations: { readOnlyHint: true },
139
- inputSchema: {
138
+ inputSchema: z.object({
140
139
  org_id: z.string().describe('Organization id (from eb_my_organizations)'),
141
140
  continuation: schemaContinuation,
142
141
  view: viewArg(),
143
- },
142
+ }),
144
143
  }, async ({ org_id, continuation, view }) => {
145
144
  const params = new URLSearchParams();
146
145
  if (continuation)
@@ -151,7 +150,7 @@ export function registerAccountTools(server, deps) {
151
150
  server.registerTool('eb_org_report', {
152
151
  description: "Run an organization's sales or attendees report — the aggregated analytics behind its events, optionally windowed by date.",
153
152
  annotations: { readOnlyHint: true },
154
- inputSchema: {
153
+ inputSchema: z.object({
155
154
  org_id: z.string().describe('Organization id (from eb_my_organizations)'),
156
155
  kind: z.enum(['sales', 'attendees']).describe('Which report to run'),
157
156
  start_date: z.string().optional().describe('ISO date lower bound (YYYY-MM-DD)'),
@@ -163,7 +162,7 @@ export function registerAccountTools(server, deps) {
163
162
  .describe("Grouping dimension, e.g. 'event', 'day', 'ticket_class'"),
164
163
  continuation: schemaContinuation,
165
164
  view: viewArg(),
166
- },
165
+ }),
167
166
  }, async ({ org_id, kind, start_date, end_date, event_status, group_by, continuation, view }) => {
168
167
  const params = new URLSearchParams();
169
168
  if (start_date)
@@ -21,13 +21,13 @@ export async function registerDiscoveryTools(server, deps) {
21
21
  server.registerTool('eb_resolve_place', {
22
22
  description: "Resolve a location to Eventbrite's internal place id for eb_search_events. Accepts a plain location ('Charlotte, NC', 'Berlin, Germany') or a browse slug ('nc--charlotte'). A city on its own is rejected — include the state or country. Returns {placeId, name, slug, region, country} plus `shelves` — curated browse shelves (Popular, This Weekend, Online) harvested free from the same fetch.",
23
23
  annotations: { readOnlyHint: true, openWorldHint: true },
24
- inputSchema: {
24
+ inputSchema: z.object({
25
25
  view: viewArg(),
26
26
  location: z
27
27
  .string()
28
28
  .min(2)
29
29
  .describe("Location, e.g. 'Charlotte, NC', 'Berlin, Germany', or the slug 'nc--charlotte'"),
30
- },
30
+ }),
31
31
  }, async ({ location, view }) => {
32
32
  const place = await discovery.resolveLocation(location);
33
33
  return viewResponse(view, place);
@@ -35,7 +35,7 @@ export async function registerDiscoveryTools(server, deps) {
35
35
  server.registerTool('eb_search_events', {
36
36
  description: 'Search public Eventbrite events (the consumer search absent from the documented API). Resolve the location to a place id first with eb_resolve_place. Filters: keyword, dates, category/subcategory/format ids (see eb_reference), free/paid, online-only. Answers with the slim per-event projection by default; pass view:"full" for Eventbrite\'s whole search envelope.',
37
37
  annotations: { readOnlyHint: true, openWorldHint: true },
38
- inputSchema: {
38
+ inputSchema: z.object({
39
39
  q: z.string().optional().describe('Keyword query'),
40
40
  place_id: z
41
41
  .string()
@@ -53,13 +53,19 @@ export async function registerDiscoveryTools(server, deps) {
53
53
  price: z.enum(['free', 'paid']).optional(),
54
54
  online_events_only: z.boolean().optional(),
55
55
  page: z.number().int().positive().optional().describe('Page number (default 1)'),
56
- page_size: z.number().int().positive().max(50).optional().describe('Results per page (default 20)'),
56
+ page_size: z
57
+ .number()
58
+ .int()
59
+ .positive()
60
+ .max(50)
61
+ .optional()
62
+ .describe('Results per page (default 20)'),
57
63
  aggs: z
58
64
  .array(z.enum(['places_borough', 'places_neighborhood']))
59
65
  .optional()
60
66
  .describe('Facet buckets to aggregate alongside results'),
61
67
  view: viewArg(SEARCH_NOTE),
62
- },
68
+ }),
63
69
  }, async (args) => {
64
70
  const data = await discovery.search({
65
71
  q: args.q,
@@ -93,16 +99,16 @@ export async function registerDiscoveryTools(server, deps) {
93
99
  });
94
100
  });
95
101
  server.registerTool('eb_event_details', {
96
- description: "Batch-fetch public event details by id. Uses your bearer token by default, falling back to the browser bridge when no token is configured. For ticket-class detail prefer eb_ticket_classes.",
102
+ description: 'Batch-fetch public event details by id. Uses your bearer token by default, falling back to the browser bridge when no token is configured. For ticket-class detail prefer eb_ticket_classes.',
97
103
  annotations: { readOnlyHint: true, openWorldHint: true },
98
- inputSchema: {
104
+ inputSchema: z.object({
99
105
  view: viewArg(),
100
106
  event_ids: z.array(z.string()).min(1).max(20).describe('Numeric event ids'),
101
107
  expand: z
102
108
  .string()
103
109
  .optional()
104
110
  .describe('Comma-separated expansions (default primary_venue,image,ticket_availability,event_sales_status,primary_organizer)'),
105
- },
111
+ }),
106
112
  }, async ({ event_ids, expand, view }) => {
107
113
  const data = await discovery.eventsByIds(event_ids, expand ? expand.split(',').map((s) => s.trim()) : undefined);
108
114
  return viewResponse(view, data);
@@ -13,14 +13,14 @@ export function registerEventTools(server, deps) {
13
13
  server.registerTool('eb_event', {
14
14
  description: 'Get an Eventbrite event by id (works for any public event, not just yours). Event ids are the trailing digits in an event URL (…-tickets-<id>).',
15
15
  annotations: { readOnlyHint: true },
16
- inputSchema: {
16
+ inputSchema: z.object({
17
17
  view: viewArg(),
18
18
  event_id: z.string().describe('Numeric event id'),
19
19
  expand: z
20
20
  .string()
21
21
  .optional()
22
22
  .describe('Comma-separated expansions (default venue,organizer,ticket_availability)'),
23
- },
23
+ }),
24
24
  }, async ({ event_id, expand, view }) => {
25
25
  const exp = expand ?? 'venue,organizer,ticket_availability';
26
26
  const data = await client.request('GET', `/events/${encodeURIComponent(event_id)}/?expand=${encodeURIComponent(exp)}`);
@@ -29,9 +29,10 @@ export function registerEventTools(server, deps) {
29
29
  server.registerTool('eb_ticket_classes', {
30
30
  description: "List an event's ticket classes (name, cost, free/paid, on-sale status).",
31
31
  annotations: { readOnlyHint: true },
32
- inputSchema: {
33
- view: viewArg(), event_id: z.string().describe('Numeric event id')
34
- },
32
+ inputSchema: z.object({
33
+ view: viewArg(),
34
+ event_id: z.string().describe('Numeric event id'),
35
+ }),
35
36
  }, async ({ event_id, view }) => {
36
37
  const data = await client.request('GET', `/events/${encodeURIComponent(event_id)}/ticket_classes/`);
37
38
  return viewResponse(view, data);
@@ -39,9 +40,10 @@ export function registerEventTools(server, deps) {
39
40
  server.registerTool('eb_event_description', {
40
41
  description: "Get an event's full HTML description.",
41
42
  annotations: { readOnlyHint: true },
42
- inputSchema: {
43
- view: viewArg(), event_id: z.string().describe('Numeric event id')
44
- },
43
+ inputSchema: z.object({
44
+ view: viewArg(),
45
+ event_id: z.string().describe('Numeric event id'),
46
+ }),
45
47
  }, async ({ event_id, view }) => {
46
48
  const data = await client.request('GET', `/events/${encodeURIComponent(event_id)}/description/`);
47
49
  return viewResponse(view, data);
@@ -49,12 +51,12 @@ export function registerEventTools(server, deps) {
49
51
  server.registerTool('eb_reference', {
50
52
  description: 'List Eventbrite reference data: categories (103=Music, 101=Business, 110=Food & Drink, …), subcategories, formats, timezones, countries or regions. Category/subcategory/format ids feed eb_search_events filters.',
51
53
  annotations: { readOnlyHint: true },
52
- inputSchema: {
54
+ inputSchema: z.object({
53
55
  view: viewArg(),
54
56
  kind: z
55
57
  .enum(['categories', 'subcategories', 'formats', 'timezones', 'countries', 'regions'])
56
58
  .describe('Which list to fetch'),
57
- },
59
+ }),
58
60
  }, async ({ kind, view }) => {
59
61
  // timezones/countries/regions hang off /system/; the bare /countries/ and
60
62
  // /regions/ paths 404 (verified live 2026-07-30). The taxonomy lists
@@ -66,7 +68,7 @@ export function registerEventTools(server, deps) {
66
68
  server.registerTool('eb_event_attendees', {
67
69
  description: "List a single event's attendees (organizer-side; requires access to that event). Use changed_since to poll incrementally instead of re-reading the whole list.",
68
70
  annotations: { readOnlyHint: true },
69
- inputSchema: {
71
+ inputSchema: z.object({
70
72
  event_id: z.string().describe('Numeric event id'),
71
73
  status: z.enum(['attending', 'not_attending', 'unpaid']).optional(),
72
74
  changed_since: z
@@ -75,7 +77,7 @@ export function registerEventTools(server, deps) {
75
77
  .describe('ISO 8601 UTC timestamp — only attendees changed since then'),
76
78
  continuation: schemaContinuation,
77
79
  view: viewArg(),
78
- },
80
+ }),
79
81
  }, async ({ event_id, status, changed_since, continuation, view }) => {
80
82
  const params = new URLSearchParams();
81
83
  if (status)
@@ -87,18 +89,18 @@ export function registerEventTools(server, deps) {
87
89
  return viewResponse(view, await client.request('GET', `/events/${enc(event_id)}/attendees/${qs(params)}`));
88
90
  });
89
91
  server.registerTool('eb_event_attendee', {
90
- description: "Get one attendee of an event by id (barcode, profile answers, check-in state).",
92
+ description: 'Get one attendee of an event by id (barcode, profile answers, check-in state).',
91
93
  annotations: { readOnlyHint: true },
92
- inputSchema: {
94
+ inputSchema: z.object({
93
95
  event_id: z.string().describe('Numeric event id'),
94
96
  attendee_id: z.string().describe('Numeric attendee id'),
95
97
  view: viewArg(),
96
- },
98
+ }),
97
99
  }, async ({ event_id, attendee_id, view }) => viewResponse(view, await client.request('GET', `/events/${enc(event_id)}/attendees/${enc(attendee_id)}/`)));
98
100
  server.registerTool('eb_event_orders', {
99
101
  description: "List a single event's orders (organizer-side; requires access to that event).",
100
102
  annotations: { readOnlyHint: true },
101
- inputSchema: {
103
+ inputSchema: z.object({
102
104
  event_id: z.string().describe('Numeric event id'),
103
105
  status: z.enum(['all', 'placed', 'refunded']).optional(),
104
106
  changed_since: z
@@ -107,7 +109,7 @@ export function registerEventTools(server, deps) {
107
109
  .describe('ISO 8601 UTC timestamp — only orders changed since then'),
108
110
  continuation: schemaContinuation,
109
111
  view: viewArg(),
110
- },
112
+ }),
111
113
  }, async ({ event_id, status, changed_since, continuation, view }) => {
112
114
  const params = new URLSearchParams();
113
115
  if (status)
@@ -121,22 +123,22 @@ export function registerEventTools(server, deps) {
121
123
  server.registerTool('eb_ticket_class', {
122
124
  description: 'Get one ticket class of an event by id. Use eb_ticket_classes to list them first.',
123
125
  annotations: { readOnlyHint: true },
124
- inputSchema: {
126
+ inputSchema: z.object({
125
127
  event_id: z.string().describe('Numeric event id'),
126
128
  ticket_class_id: z.string().describe('Numeric ticket class id'),
127
129
  view: viewArg(),
128
- },
130
+ }),
129
131
  }, async ({ event_id, ticket_class_id, view }) => viewResponse(view, await client.request('GET', `/events/${enc(event_id)}/ticket_classes/${enc(ticket_class_id)}/`)));
130
132
  server.registerTool('eb_event_questions', {
131
133
  description: "List the registration questions an event asks its buyers. Set canned=true for Eventbrite's standard question bank instead of the event's custom ones.",
132
134
  annotations: { readOnlyHint: true },
133
- inputSchema: {
135
+ inputSchema: z.object({
134
136
  event_id: z.string().describe('Numeric event id'),
135
137
  canned: z
136
138
  .boolean()
137
139
  .optional()
138
140
  .describe("Fetch the standard question bank instead of the event's custom questions"),
139
141
  view: viewArg(),
140
- },
142
+ }),
141
143
  }, async ({ event_id, canned, view }) => viewResponse(view, await client.request('GET', `/events/${enc(event_id)}/${canned ? 'canned_questions' : 'questions'}/`)));
142
144
  }
@@ -14,14 +14,14 @@ export function registerLookupTools(server, deps) {
14
14
  server.registerTool('eb_order', {
15
15
  description: 'Get a single order by id (the buyer-side record behind a ticket). Order ids appear in eb_my_orders / eb_event_orders results.',
16
16
  annotations: { readOnlyHint: true },
17
- inputSchema: {
17
+ inputSchema: z.object({
18
18
  order_id: z.string().describe('Numeric order id'),
19
19
  expand: z
20
20
  .string()
21
21
  .optional()
22
22
  .describe("Comma-separated expansions, e.g. 'attendees,event'"),
23
23
  view: viewArg(),
24
- },
24
+ }),
25
25
  }, async ({ order_id, expand, view }) => {
26
26
  const params = new URLSearchParams();
27
27
  if (expand)
@@ -31,19 +31,20 @@ export function registerLookupTools(server, deps) {
31
31
  server.registerTool('eb_venue', {
32
32
  description: 'Get a venue by id (name, address, geo). Venue ids appear on expanded events and in eb_org_venues.',
33
33
  annotations: { readOnlyHint: true },
34
- inputSchema: { venue_id: z.string().describe('Numeric venue id'),
34
+ inputSchema: z.object({
35
+ venue_id: z.string().describe('Numeric venue id'),
35
36
  view: viewArg(),
36
- },
37
+ }),
37
38
  }, async ({ venue_id, view }) => viewResponse(view, await client.request('GET', `/venues/${enc(venue_id)}/`)));
38
39
  server.registerTool('eb_venue_events', {
39
40
  description: 'List the events held at a venue.',
40
41
  annotations: { readOnlyHint: true },
41
- inputSchema: {
42
+ inputSchema: z.object({
42
43
  venue_id: z.string().describe('Numeric venue id'),
43
44
  status: schemaEventStatus,
44
45
  continuation: schemaContinuation,
45
46
  view: viewArg(),
46
- },
47
+ }),
47
48
  }, async ({ venue_id, status, continuation, view }) => {
48
49
  const params = new URLSearchParams();
49
50
  if (status)
@@ -55,20 +56,21 @@ export function registerLookupTools(server, deps) {
55
56
  server.registerTool('eb_organizer', {
56
57
  description: "Get an organizer's public profile by id (name, description, logo, social links).",
57
58
  annotations: { readOnlyHint: true },
58
- inputSchema: { organizer_id: z.string().describe('Numeric organizer id'),
59
+ inputSchema: z.object({
60
+ organizer_id: z.string().describe('Numeric organizer id'),
59
61
  view: viewArg(),
60
- },
62
+ }),
61
63
  }, async ({ organizer_id, view }) => viewResponse(view, await client.request('GET', `/organizers/${enc(organizer_id)}/`)));
62
64
  server.registerTool('eb_organizer_events', {
63
65
  description: "List an organizer's events — the public way to see everything one organizer is running.",
64
66
  annotations: { readOnlyHint: true },
65
- inputSchema: {
67
+ inputSchema: z.object({
66
68
  organizer_id: z.string().describe('Numeric organizer id'),
67
69
  status: schemaEventStatus,
68
70
  order_by: z.enum(['start_asc', 'start_desc', 'created_asc', 'created_desc']).optional(),
69
71
  continuation: schemaContinuation,
70
72
  view: viewArg(),
71
- },
73
+ }),
72
74
  }, async ({ organizer_id, status, order_by, continuation, view }) => {
73
75
  const params = new URLSearchParams();
74
76
  if (status)
@@ -82,12 +84,12 @@ export function registerLookupTools(server, deps) {
82
84
  server.registerTool('eb_series_events', {
83
85
  description: 'List the occurrences of a recurring event series. Search results and events carry a series_id when they belong to one.',
84
86
  annotations: { readOnlyHint: true },
85
- inputSchema: {
87
+ inputSchema: z.object({
86
88
  series_id: z.string().describe('Numeric series id (from an event/search result)'),
87
89
  status: schemaEventStatus,
88
90
  continuation: schemaContinuation,
89
91
  view: viewArg(),
90
- },
92
+ }),
91
93
  }, async ({ series_id, status, continuation, view }) => {
92
94
  const params = new URLSearchParams();
93
95
  if (status)
@@ -97,10 +99,11 @@ export function registerLookupTools(server, deps) {
97
99
  return viewResponse(view, await client.request('GET', `/series/${enc(series_id)}/events/${qs(params)}`));
98
100
  });
99
101
  server.registerTool('eb_user', {
100
- description: "Get a public user profile by id. Use eb_me for the authenticated user (that call also returns private fields like emails).",
102
+ description: 'Get a public user profile by id. Use eb_me for the authenticated user (that call also returns private fields like emails).',
101
103
  annotations: { readOnlyHint: true },
102
- inputSchema: { user_id: z.string().describe('Numeric user id'),
104
+ inputSchema: z.object({
105
+ user_id: z.string().describe('Numeric user id'),
103
106
  view: viewArg(),
104
- },
107
+ }),
105
108
  }, async ({ user_id, view }) => viewResponse(view, await client.request('GET', `/users/${enc(user_id)}/`)));
106
109
  }
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.3.3'; // x-release-please-version
1
+ export const VERSION = '1.0.0'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrischall/eventbrite-mcp",
3
- "version": "0.3.3",
3
+ "version": "1.0.0",
4
4
  "mcpName": "io.github.chrischall/eventbrite-mcp",
5
5
  "description": "Eventbrite MCP server for Claude — developed and maintained by AI (Claude Code)",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -37,7 +37,7 @@
37
37
  ],
38
38
  "scripts": {
39
39
  "build": "tsc && npm run bundle",
40
- "bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --banner:js='import { createRequire as __createRequire } from \"module\"; const require = __createRequire(import.meta.url);' --outfile=dist/bundle.js",
40
+ "bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --alias:zod/v4=./node_modules/zod/v4/index.cjs --external:dotenv --banner:js='import { createRequire as __createRequire } from \"module\"; const require = __createRequire(import.meta.url);' --outfile=dist/bundle.js",
41
41
  "dev": "node dist/index.js",
42
42
  "test": "npm run typecheck && vitest run",
43
43
  "test:watch": "vitest",
@@ -45,13 +45,14 @@
45
45
  "typecheck": "tsc -p tsconfig.json --noEmit"
46
46
  },
47
47
  "dependencies": {
48
- "@chrischall/mcp-utils": "^0.26.1",
48
+ "@chrischall/mcp-utils": "^0.28.0",
49
49
  "@fetchproxy/server": "^3.0.1",
50
- "@modelcontextprotocol/sdk": "^1.30.0",
50
+ "@modelcontextprotocol/server": "^2.0.0",
51
51
  "dotenv": "^17.4.0",
52
- "zod": "^4.5.4"
52
+ "zod": "^4.6.2"
53
53
  },
54
54
  "devDependencies": {
55
+ "@modelcontextprotocol/client": "^2.0.0",
55
56
  "@types/node": "^26.0.0",
56
57
  "@vitest/coverage-v8": "^5.0.0",
57
58
  "esbuild": "^0.28.0",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/eventbrite-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.3.3",
9
+ "version": "1.0.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@chrischall/eventbrite-mcp",
14
- "version": "0.3.3",
14
+ "version": "1.0.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },