@chrischall/eventbrite-mcp 0.1.1 → 0.1.2

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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "MCP server for Eventbrite — your tickets and orders, organizer data, and public event discovery",
10
- "version": "0.1.1"
10
+ "version": "0.1.2"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "Eventbrite",
16
16
  "source": "./",
17
17
  "description": "MCP server for Eventbrite — tickets, orders, organizer data, and public event search. Account tools use a personal API token; discovery search routes through the user's signed-in eventbrite.com tab via the fetchproxy bridge, reusing their authenticated session.",
18
- "version": "0.1.1",
18
+ "version": "0.1.2",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eventbrite-mcp",
3
3
  "displayName": "Eventbrite",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "description": "MCP server for Eventbrite — your tickets and orders, organizer data, and public event discovery",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/README.md CHANGED
@@ -79,20 +79,12 @@ Search flow: `eb_resolve_place {location: "Charlotte, NC"}` →
79
79
  `eb_resolve_place` also accepts a raw slug (`nc--charlotte`). A bare city with
80
80
  no state or country is rejected rather than guessed.
81
81
 
82
- ## Hosted connector
83
-
84
- `src/worker.ts` deploys the token-API tools as a Cloudflare Worker remote
85
- connector for claude.ai (OAuth login collects your Eventbrite token). The
86
- discovery tools are **excluded** there — the browser bridge doesn't exist in a
87
- Worker. See `docs/DEPLOY-CONNECTOR.md`.
88
-
89
82
  ## Development
90
83
 
91
84
  ```sh
92
85
  npm install
93
86
  npm test # node suite
94
87
  npm run build # tsc + esbuild bundle
95
- npm run worker:test
96
88
  ```
97
89
 
98
90
  API shape notes (captured + verified): `docs/EVENTBRITE-API.md`. A
package/dist/bundle.js CHANGED
@@ -39725,7 +39725,7 @@ var pageSchema = {
39725
39725
  init_errors();
39726
39726
 
39727
39727
  // src/version.ts
39728
- var VERSION = "0.1.1";
39728
+ var VERSION = "0.1.2";
39729
39729
 
39730
39730
  // src/client.ts
39731
39731
  import { dirname, join } from "path";
@@ -39746,10 +39746,10 @@ var EventbriteClient = class {
39746
39746
  * host's install-time smoke test) when EVENTBRITE_TOKEN isn't set yet.
39747
39747
  * Tool calls re-raise the error at request time.
39748
39748
  *
39749
- * Optional constructor seam: the hosted Cloudflare connector builds one
39749
+ * Optional constructor seam: a hosted per-user deployment builds one
39750
39750
  * client per request with that user's `token` injected. The stdio path
39751
39751
  * passes no options, so the token resolves from the environment.
39752
- * The constructor is PURE (no I/O, no randomness) — it is run in Worker
39752
+ * The constructor is PURE (no I/O, no randomness) — it may run in module
39753
39753
  * global scope via the module singleton below.
39754
39754
  */
39755
39755
  constructor(opts) {
@@ -39970,7 +39970,7 @@ var DiscoveryClient = class {
39970
39970
  * 1. `api` — `POST eventbriteapi.com/v3/destination/search/` with a bearer
39971
39971
  * token. Verified live 2026-07-30: works with a private OR public token,
39972
39972
  * no WAF, no CSRF, no cookies. This is the default because it needs no
39973
- * browser and therefore works inside a Worker.
39973
+ * browser and therefore works without the bridge.
39974
39974
  * 2. `transport` — the fetchproxy bridge through a signed-in tab. Retained as
39975
39975
  * a fallback for when no token is configured, or the API route refuses.
39976
39976
  *
package/dist/client.js CHANGED
@@ -4,9 +4,9 @@ import { loadDotenvSafely, readEnvVar, createApiClient } from '@chrischall/mcp-u
4
4
  // Load .env for local dev; silently skip if dotenv is unavailable (e.g. mcpb
5
5
  // bundle). `loadDotenvSafely` swallows a missing dotenv module and never lets
6
6
  // .env override a host-provided value.
7
- // The try/catch guards the Cloudflare Worker runtime, where `import.meta.url`
7
+ // The try/catch guards a non-Node runtime, where `import.meta.url`
8
8
  // is undefined and `fileURLToPath(undefined)` would throw at module init
9
- // (Worker startup validation) — there is no filesystem / .env to load there.
9
+ // startup validation in such a runtime and there is no .env to load there.
10
10
  try {
11
11
  const dir = dirname(fileURLToPath(import.meta.url));
12
12
  await loadDotenvSafely({ path: join(dir, '..', '.env'), override: false });
@@ -32,10 +32,10 @@ export class EventbriteClient {
32
32
  * host's install-time smoke test) when EVENTBRITE_TOKEN isn't set yet.
33
33
  * Tool calls re-raise the error at request time.
34
34
  *
35
- * Optional constructor seam: the hosted Cloudflare connector builds one
35
+ * Optional constructor seam: a hosted per-user deployment builds one
36
36
  * client per request with that user's `token` injected. The stdio path
37
37
  * passes no options, so the token resolves from the environment.
38
- * The constructor is PURE (no I/O, no randomness) — it is run in Worker
38
+ * The constructor is PURE (no I/O, no randomness) — it may run in module
39
39
  * global scope via the module singleton below.
40
40
  */
41
41
  constructor(opts) {
package/dist/discovery.js CHANGED
@@ -19,7 +19,7 @@ function isUsableBrowsePage(result) {
19
19
  return false;
20
20
  return typeof result.body === 'string' && PLACE_ID_RE.test(result.body);
21
21
  }
22
- /** `fetch` with an AbortController deadline; called directly for workerd. */
22
+ /** `fetch` with an AbortController deadline. */
23
23
  async function fetchWithTimeout(url, ms) {
24
24
  const controller = new AbortController();
25
25
  const timer = setTimeout(() => controller.abort(), ms);
@@ -219,7 +219,7 @@ export class DiscoveryClient {
219
219
  * 1. `api` — `POST eventbriteapi.com/v3/destination/search/` with a bearer
220
220
  * token. Verified live 2026-07-30: works with a private OR public token,
221
221
  * no WAF, no CSRF, no cookies. This is the default because it needs no
222
- * browser and therefore works inside a Worker.
222
+ * browser and therefore works without the bridge.
223
223
  * 2. `transport` — the fetchproxy bridge through a signed-in tab. Retained as
224
224
  * a fallback for when no token is configured, or the API route refuses.
225
225
  *
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ import { registerDiscoveryTools } from './tools/discovery.js';
15
15
  // documented host serves the consumer search at
16
16
  // POST /destination/search/ with a plain bearer token — no WAF, no CSRF,
17
17
  // no browser. That is now the primary route, so discovery works in a
18
- // Worker too. The fetchproxy bridge (port 37149, bound lazily) is kept as
18
+ // a bridge-less deployment too. The bridge (port 37149, bound lazily) is kept as
19
19
  // a FALLBACK for when no token is configured or the API route refuses.
20
20
  const transport = new FetchproxyTransport({
21
21
  version: VERSION,
@@ -3,7 +3,7 @@ import { textResult } from '@chrischall/mcp-utils';
3
3
  import { enc, qs, schemaContinuation } from './params.js';
4
4
  /**
5
5
  * Account-side tools on the documented API (`eventbriteapi.com/v3`, bearer
6
- * token). Transport-neutral: the hosted connector registers these with a
6
+ * token). Transport-neutral: a hosted deployment registers these with a
7
7
  * per-user client.
8
8
  */
9
9
  export function registerAccountTools(server, deps) {
@@ -5,7 +5,7 @@ import { toCompactEvent } from '../discovery.js';
5
5
  * Public event discovery. Verified live 2026-07-30: the documented host serves
6
6
  * the consumer search at POST /destination/search/ with a plain bearer token —
7
7
  * no WAF, no CSRF, no cookies — so these tools no longer require a browser and
8
- * ARE registered by the hosted connector. The fetchproxy bridge remains a
8
+ * ARE registered without a bridge. The fetchproxy bridge remains a
9
9
  * fallback on the stdio path.
10
10
  */
11
11
  export async function registerDiscoveryTools(server, deps) {
@@ -99,13 +99,13 @@ export async function registerDiscoveryTools(server, deps) {
99
99
  const data = await discovery.eventsByIds(event_ids, expand ? expand.split(',').map((s) => s.trim()) : undefined);
100
100
  return textResult(data);
101
101
  });
102
- // eb_healthcheck diagnoses the BRIDGE. With no bridge (the Worker connector)
102
+ // eb_healthcheck diagnoses the BRIDGE. With no bridge
103
103
  // there is nothing for it to report on, so it is not registered at all —
104
104
  // better than a tool that always answers "no transport".
105
105
  if (!transport)
106
106
  return;
107
107
  // Imported lazily, AFTER the guard: a static import would drag the fetchproxy
108
- // helper into the Worker bundle where it can never run.
108
+ // helper into a bundle where it can never run.
109
109
  const { registerBridgeHealthcheckTool } = await import('@chrischall/mcp-utils/fetchproxy');
110
110
  // The categories endpoint answers 200 JSON on the www host regardless of
111
111
  // login state, so it isolates bridge problems from Eventbrite-side problems.
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.1.1'; // x-release-please-version
1
+ export const VERSION = '0.1.2'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrischall/eventbrite-mcp",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
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>",
@@ -40,10 +40,7 @@
40
40
  "dev": "node dist/index.js",
41
41
  "test": "vitest run",
42
42
  "test:watch": "vitest",
43
- "test:coverage": "vitest run --coverage",
44
- "worker:dev": "wrangler dev",
45
- "worker:deploy": "wrangler deploy",
46
- "worker:test": "vitest run --config vitest.workers.config.ts"
43
+ "test:coverage": "vitest run --coverage"
47
44
  },
48
45
  "dependencies": {
49
46
  "@chrischall/mcp-utils": "^0.14.0",
@@ -53,20 +50,13 @@
53
50
  "zod": "^4.4.2"
54
51
  },
55
52
  "devDependencies": {
56
- "@chrischall/mcp-connector": "^1.1.1",
57
- "@cloudflare/vitest-pool-workers": "^0.19.0",
58
- "@cloudflare/workers-oauth-provider": "^0.8.1",
59
- "@cloudflare/workers-types": "^5.20260708.1",
60
53
  "@types/node": "^26.0.0",
61
54
  "@vitest/coverage-v8": "^4.1.2",
62
- "agents": "^0.19.0",
63
55
  "esbuild": "^0.28.0",
64
56
  "typescript": "^7.0.2",
65
- "vitest": "^4.1.2",
66
- "wrangler": "^4.110.0"
57
+ "vitest": "^4.1.2"
67
58
  },
68
59
  "allowScripts": {
69
- "esbuild@0.28.1": true,
70
- "workerd@1.20260722.1": true
60
+ "esbuild@0.28.1": true
71
61
  }
72
62
  }
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.1.1",
9
+ "version": "0.1.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@chrischall/eventbrite-mcp",
14
- "version": "0.1.1",
14
+ "version": "0.1.2",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -1,18 +0,0 @@
1
- import { EventbriteClient } from './client.js';
2
- /**
3
- * `ConnectorAuth` for the Eventbrite remote connector: the login page collects
4
- * the user's personal Eventbrite token (eventbrite.com/platform/api-keys),
5
- * verifies it against the current-user endpoint (a bad token throws, which
6
- * the connector surfaces back on the login page), and stores `{ token }`.
7
- */
8
- export const eventbriteAuth = {
9
- service: 'Eventbrite',
10
- accent: '#F05537',
11
- privacyNote: 'Your Eventbrite private token is stored encrypted and used only to call the Eventbrite API on your behalf.',
12
- fields: [{ name: 'token', label: 'Eventbrite private token', type: 'password' }],
13
- async login(fields) {
14
- const client = new EventbriteClient({ token: fields.token });
15
- await client.request('GET', '/users/me/');
16
- return { token: fields.token };
17
- },
18
- };