@chrischall/eventbrite-mcp 0.1.1 → 0.1.3
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +0 -8
- package/dist/bundle.js +55 -13
- package/dist/client.js +4 -4
- package/dist/discovery.js +2 -2
- package/dist/index.js +1 -1
- package/dist/tools/account.js +1 -1
- package/dist/tools/discovery.js +3 -3
- package/dist/version.js +1 -1
- package/mint.yaml +47 -0
- package/package.json +9 -17
- package/server.json +2 -2
- package/dist/eventbrite-auth.js +0 -18
|
@@ -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.
|
|
10
|
+
"version": "0.1.3"
|
|
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.
|
|
18
|
+
"version": "0.1.3",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
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
|
@@ -12836,6 +12836,17 @@ var init_classify_bridge_error = __esm({
|
|
|
12836
12836
|
});
|
|
12837
12837
|
|
|
12838
12838
|
// node_modules/@fetchproxy/server/dist/ws-server.js
|
|
12839
|
+
function envWsPort() {
|
|
12840
|
+
const raw = process.env.FETCHPROXY_WS_PORT;
|
|
12841
|
+
if (raw === void 0 || raw.trim() === "")
|
|
12842
|
+
return void 0;
|
|
12843
|
+
if (!/^\d+$/.test(raw.trim()))
|
|
12844
|
+
return void 0;
|
|
12845
|
+
const port = Number(raw.trim());
|
|
12846
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
12847
|
+
return void 0;
|
|
12848
|
+
return port;
|
|
12849
|
+
}
|
|
12839
12850
|
function protocolErrorFrom(error51) {
|
|
12840
12851
|
if (SCOPE_REJECTION.test(error51))
|
|
12841
12852
|
return new FetchproxyScopeError(error51);
|
|
@@ -13094,7 +13105,7 @@ var init_ws_server = __esm({
|
|
|
13094
13105
|
}
|
|
13095
13106
|
}
|
|
13096
13107
|
this.opts = {
|
|
13097
|
-
port: opts.port ?? 37149,
|
|
13108
|
+
port: opts.port ?? envWsPort() ?? 37149,
|
|
13098
13109
|
host: opts.host ?? "127.0.0.1",
|
|
13099
13110
|
serverName: opts.serverName,
|
|
13100
13111
|
version: opts.version,
|
|
@@ -39396,8 +39407,47 @@ var StdioServerTransport = class {
|
|
|
39396
39407
|
};
|
|
39397
39408
|
|
|
39398
39409
|
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
39410
|
+
init_errors();
|
|
39411
|
+
|
|
39412
|
+
// node_modules/@chrischall/mcp-utils/dist/response/index.js
|
|
39413
|
+
init_errors();
|
|
39414
|
+
function textResult(data) {
|
|
39415
|
+
return {
|
|
39416
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
|
|
39417
|
+
};
|
|
39418
|
+
}
|
|
39419
|
+
function errorResult(message) {
|
|
39420
|
+
return {
|
|
39421
|
+
content: [{ type: "text", text: redactSecrets(message) }],
|
|
39422
|
+
isError: true
|
|
39423
|
+
};
|
|
39424
|
+
}
|
|
39425
|
+
|
|
39426
|
+
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
39427
|
+
function hintResultOrRethrow(err) {
|
|
39428
|
+
if (err instanceof McpToolError && err.hint) {
|
|
39429
|
+
return errorResult(`${err.message}
|
|
39430
|
+
|
|
39431
|
+
Hint: ${err.hint}`);
|
|
39432
|
+
}
|
|
39433
|
+
throw err;
|
|
39434
|
+
}
|
|
39435
|
+
function surfaceToolHints(server) {
|
|
39436
|
+
const register = server.registerTool.bind(server);
|
|
39437
|
+
server.registerTool = (name, config2, cb) => register(name, config2, (...args) => {
|
|
39438
|
+
let result;
|
|
39439
|
+
try {
|
|
39440
|
+
result = cb(...args);
|
|
39441
|
+
} catch (err) {
|
|
39442
|
+
return hintResultOrRethrow(err);
|
|
39443
|
+
}
|
|
39444
|
+
return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
|
|
39445
|
+
});
|
|
39446
|
+
}
|
|
39399
39447
|
async function createMcpServer(opts) {
|
|
39400
39448
|
const server = new McpServer({ name: opts.name, version: opts.version });
|
|
39449
|
+
if (opts.surfaceHints !== false)
|
|
39450
|
+
surfaceToolHints(server);
|
|
39401
39451
|
if (opts.banner !== void 0) {
|
|
39402
39452
|
console.error(opts.banner);
|
|
39403
39453
|
}
|
|
@@ -39442,14 +39492,6 @@ async function runMcp(opts) {
|
|
|
39442
39492
|
return server;
|
|
39443
39493
|
}
|
|
39444
39494
|
|
|
39445
|
-
// node_modules/@chrischall/mcp-utils/dist/response/index.js
|
|
39446
|
-
init_errors();
|
|
39447
|
-
function textResult(data) {
|
|
39448
|
-
return {
|
|
39449
|
-
content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
|
|
39450
|
-
};
|
|
39451
|
-
}
|
|
39452
|
-
|
|
39453
39495
|
// node_modules/@chrischall/mcp-utils/dist/index.js
|
|
39454
39496
|
init_errors();
|
|
39455
39497
|
|
|
@@ -39725,7 +39767,7 @@ var pageSchema = {
|
|
|
39725
39767
|
init_errors();
|
|
39726
39768
|
|
|
39727
39769
|
// src/version.ts
|
|
39728
|
-
var VERSION = "0.1.
|
|
39770
|
+
var VERSION = "0.1.3";
|
|
39729
39771
|
|
|
39730
39772
|
// src/client.ts
|
|
39731
39773
|
import { dirname, join } from "path";
|
|
@@ -39746,10 +39788,10 @@ var EventbriteClient = class {
|
|
|
39746
39788
|
* host's install-time smoke test) when EVENTBRITE_TOKEN isn't set yet.
|
|
39747
39789
|
* Tool calls re-raise the error at request time.
|
|
39748
39790
|
*
|
|
39749
|
-
* Optional constructor seam:
|
|
39791
|
+
* Optional constructor seam: a hosted per-user deployment builds one
|
|
39750
39792
|
* client per request with that user's `token` injected. The stdio path
|
|
39751
39793
|
* passes no options, so the token resolves from the environment.
|
|
39752
|
-
* The constructor is PURE (no I/O, no randomness) — it
|
|
39794
|
+
* The constructor is PURE (no I/O, no randomness) — it may run in module
|
|
39753
39795
|
* global scope via the module singleton below.
|
|
39754
39796
|
*/
|
|
39755
39797
|
constructor(opts) {
|
|
@@ -39970,7 +40012,7 @@ var DiscoveryClient = class {
|
|
|
39970
40012
|
* 1. `api` — `POST eventbriteapi.com/v3/destination/search/` with a bearer
|
|
39971
40013
|
* token. Verified live 2026-07-30: works with a private OR public token,
|
|
39972
40014
|
* no WAF, no CSRF, no cookies. This is the default because it needs no
|
|
39973
|
-
* browser and therefore works
|
|
40015
|
+
* browser and therefore works without the bridge.
|
|
39974
40016
|
* 2. `transport` — the fetchproxy bridge through a signed-in tab. Retained as
|
|
39975
40017
|
* a fallback for when no token is configured, or the API route refuses.
|
|
39976
40018
|
*
|
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
|
|
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
|
-
//
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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,
|
package/dist/tools/account.js
CHANGED
|
@@ -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:
|
|
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) {
|
package/dist/tools/discovery.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
+
export const VERSION = '0.1.3'; // x-release-please-version
|
package/mint.yaml
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
name: Eventbrite
|
|
3
|
+
slug: eventbrite
|
|
4
|
+
summary: >-
|
|
5
|
+
Eventbrite for Claude — your tickets and orders, organizer data, and
|
|
6
|
+
public event discovery BROWSER-BRIDGE MCP: it reaches its site through the
|
|
7
|
+
user's signed-in tab via the fetchproxy bridge, so a registration also
|
|
8
|
+
needs runtime fly-shared, bridge: true and a bridgePortEnv — registration
|
|
9
|
+
fields this manifest has no schema for. state.dataDir below is required
|
|
10
|
+
for bridge and is why it is declared.
|
|
11
|
+
env:
|
|
12
|
+
- name: EVENTBRITE_TOKEN
|
|
13
|
+
secret: true
|
|
14
|
+
required: false
|
|
15
|
+
help: >-
|
|
16
|
+
Personal OAuth token (eventbrite.com/platform/api-keys); needed for
|
|
17
|
+
account tools
|
|
18
|
+
- name: EVENTBRITE_WS_PORT
|
|
19
|
+
required: false
|
|
20
|
+
help: >-
|
|
21
|
+
Concentrator port for the fetchproxy browser bridge (defaults to the
|
|
22
|
+
fleet-shared 37149). The runner injects a per-registration port for a
|
|
23
|
+
hosted bridged child, so this is the name to give bridgePortEnv at
|
|
24
|
+
registration.
|
|
25
|
+
state:
|
|
26
|
+
dataDir: true
|
|
27
|
+
reason: >-
|
|
28
|
+
The fetchproxy identity lives at $HOME/.fetchproxy/identity/<name>.json
|
|
29
|
+
and the pair code derives from it. Without a persistent $HOME every cold
|
|
30
|
+
start mints a fresh identity and re-prompts pairing in the browser; the
|
|
31
|
+
API refuses bridge without it.
|
|
32
|
+
egress:
|
|
33
|
+
allow:
|
|
34
|
+
# Only hosts the SERVER process actually fetches; hosts that appear
|
|
35
|
+
# solely in a URL this server builds and returns are excluded. Matching
|
|
36
|
+
# is exact (an apex entry does not cover subdomains), and the proxy
|
|
37
|
+
# follows no redirects — neither host below redirects (checked 2026-08-28).
|
|
38
|
+
# Token API (src/client.ts): every account/organizer/lookup tool is a
|
|
39
|
+
# direct server-side fetch of the documented API.
|
|
40
|
+
- www.eventbriteapi.com
|
|
41
|
+
# SSR browse pages (src/discovery.ts fetchBrowsePage): resolvePlace GETs
|
|
42
|
+
# `/d/<slug>/events/` directly first and only falls back to the bridge
|
|
43
|
+
# when the WAF blocks. The destination-search API on the same host is
|
|
44
|
+
# bridge-only — dialled by the user's tab, not by this process — so it
|
|
45
|
+
# adds no host; the bare apex `eventbrite.com` is the bridge's declared
|
|
46
|
+
# domain / cookie scope, never a dial, and is deliberately absent.
|
|
47
|
+
- www.eventbrite.com
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chrischall/eventbrite-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
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>",
|
|
@@ -32,41 +32,33 @@
|
|
|
32
32
|
".claude-plugin",
|
|
33
33
|
"skills/",
|
|
34
34
|
".mcp.json",
|
|
35
|
-
"server.json"
|
|
35
|
+
"server.json",
|
|
36
|
+
"mint.yaml"
|
|
36
37
|
],
|
|
37
38
|
"scripts": {
|
|
38
39
|
"build": "tsc && npm run bundle",
|
|
39
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
41
|
"dev": "node dist/index.js",
|
|
41
|
-
"test": "vitest run",
|
|
42
|
+
"test": "npm run typecheck && vitest run",
|
|
42
43
|
"test:watch": "vitest",
|
|
43
|
-
"test:coverage": "vitest run --coverage",
|
|
44
|
-
"
|
|
45
|
-
"worker:deploy": "wrangler deploy",
|
|
46
|
-
"worker:test": "vitest run --config vitest.workers.config.ts"
|
|
44
|
+
"test:coverage": "npm run typecheck && vitest run --coverage",
|
|
45
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
47
46
|
},
|
|
48
47
|
"dependencies": {
|
|
49
|
-
"@chrischall/mcp-utils": "^0.
|
|
48
|
+
"@chrischall/mcp-utils": "^0.15.0",
|
|
50
49
|
"@fetchproxy/server": "^2.0.0",
|
|
51
50
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
52
51
|
"dotenv": "^17.4.0",
|
|
53
52
|
"zod": "^4.4.2"
|
|
54
53
|
},
|
|
55
54
|
"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
55
|
"@types/node": "^26.0.0",
|
|
61
56
|
"@vitest/coverage-v8": "^4.1.2",
|
|
62
|
-
"agents": "^0.19.0",
|
|
63
57
|
"esbuild": "^0.28.0",
|
|
64
58
|
"typescript": "^7.0.2",
|
|
65
|
-
"vitest": "^4.1.2"
|
|
66
|
-
"wrangler": "^4.110.0"
|
|
59
|
+
"vitest": "^4.1.2"
|
|
67
60
|
},
|
|
68
61
|
"allowScripts": {
|
|
69
|
-
"esbuild@0.28.1": true
|
|
70
|
-
"workerd@1.20260722.1": true
|
|
62
|
+
"esbuild@0.28.1": true
|
|
71
63
|
}
|
|
72
64
|
}
|
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.
|
|
9
|
+
"version": "0.1.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@chrischall/eventbrite-mcp",
|
|
14
|
-
"version": "0.1.
|
|
14
|
+
"version": "0.1.3",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
package/dist/eventbrite-auth.js
DELETED
|
@@ -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
|
-
};
|