vibo-mcp 2.3.1 → 2.4.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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "MCP server for Vibo (vibodj.com) — plan & manage event music, song requests, ideas, guests, and playlists via natural language",
10
- "version": "2.3.1"
10
+ "version": "2.4.0"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "Vibo",
16
16
  "source": "./",
17
17
  "description": "MCP server for Vibo — browse & manage events, timeline, songs, the DJ song ideas/questions, guests, and exports to Spotify/Apple Music",
18
- "version": "2.3.1",
18
+ "version": "2.4.0",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vibo-mcp",
3
3
  "displayName": "Vibo",
4
- "version": "2.3.1",
4
+ "version": "2.4.0",
5
5
  "description": "MCP server for Vibo (vibodj.com) — plan & manage event music, song requests, ideas, guests, and playlists via natural language",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/README.md CHANGED
@@ -33,11 +33,31 @@ Choose one method:
33
33
  |--------|----------|------|
34
34
  | Email + password (recommended) | `VIBO_EMAIL`, `VIBO_PASSWORD` | You sign in to Vibo with an email/password. |
35
35
  | Captured token | `VIBO_ACCESS_TOKEN` (+ `VIBO_REFRESH_TOKEN`) | Your account uses Apple/Google/Facebook sign-in (no password). Capture `x-token`/`x-refresh-token` from a signed-in `web.vibodj.com` session. |
36
- | Browser capture (SSO) | run `vibo_capture_session` | With the fetchproxy browser extension installed and signed into `web.vibodj.com`, capture the token automatically (saved to `~/.vibo-mcp/session.json`). |
36
+ | Browser capture (SSO) | run `vibo_capture_session` | With the [ContextMint Bridge](#contextmint-bridge-for-sso-capture) browser extension installed and signed into `web.vibodj.com`, capture the token automatically (saved to `~/.vibo-mcp/session.json`). |
37
37
 
38
38
  The server boots without credentials; the config error only surfaces on the
39
39
  first tool call.
40
40
 
41
+ ### ContextMint Bridge (for SSO capture)
42
+
43
+ `vibo_capture_session` reads your signed-in tab through the ContextMint Bridge
44
+ browser extension. Install it from
45
+ [github.com/nullnet-app/contextmint-bridge/releases](https://github.com/nullnet-app/contextmint-bridge/releases):
46
+
47
+ - **Chrome:** download the Chrome zip, unzip it, and load it unpacked at
48
+ `chrome://extensions` (Developer mode → Load unpacked).
49
+ - **Safari:** not available yet — it will ship inside the ContextMint app,
50
+ which has no public download. Use Chrome for now.
51
+
52
+ Approve the pair code the extension shows on first use.
53
+
54
+ ContextMint Bridge is the fetchproxy browser extension under its new name, from
55
+ the same maintainer — fetchproxy's own README
56
+ (https://github.com/chrischall/fetchproxy#extension) points to it. Its source is
57
+ public at https://github.com/nullnet-app/contextmint-bridge: build it yourself,
58
+ or check a release zip against the `.sha256` file published beside it
59
+ (`shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).
60
+
41
61
  ### Uploads
42
62
 
43
63
  `vibo_set_profile_photo` and photo/file answers to `vibo_answer_question` only
@@ -46,6 +66,35 @@ read local files from the upload directory — `VIBO_UPLOAD_DIR`, default
46
66
  Hidden files, symlinks that lead outside the directory, and files over 25 MiB
47
67
  are refused, and photo slots need an image file.
48
68
 
69
+ ### Timeline sections and limits
70
+
71
+ - `vibo_create_section` adds a section and can place it (`afterSectionId` or a
72
+ 0-based `position`). The web app only appends new sections to the end.
73
+ Visibility is `host` (default, "Me and DJ") or `public` (guests too).
74
+ - `vibo_delete_section` previews the section's name, its song count and its
75
+ answered questions before deleting. It refuses the DJ's do-not-play list
76
+ (`dontPlay`) and timeline dividers (`headline`) unless you pass `force: true`.
77
+ - `vibo_reorder_sections` moves one or more sections to directly after another
78
+ section, or to the start. `vibo_reorder_songs` does the same for songs within
79
+ a section.
80
+
81
+ Vibo's limits, checked before anything is sent:
82
+
83
+ | What | Limit |
84
+ |---|---|
85
+ | Section name | 45 characters (the web app's limit) |
86
+ | Song comment (`vibo_update_song`) | 90 characters (an emoji counts as 2) |
87
+
88
+ A host can only do some things when the DJ's settings allow it: adding or
89
+ reordering sections (event settings), or reordering one section's songs (that
90
+ section's "hosts can order songs"). Vibo turns "hosts can order songs" **off**
91
+ for every section a host creates, and only the DJ can turn it on. When a
92
+ setting blocks you, the tool says which one instead of returning Vibo's bare
93
+ "Action is not allowed for user".
94
+
95
+ Vibo doesn't store a section description set by a host, so
96
+ `vibo_create_section` takes a note (for the DJ) instead.
97
+
49
98
  ### Confirmations
50
99
 
51
100
  Every write (adding or removing songs, comments, invites, exports, answers,
package/dist/auth.js CHANGED
@@ -21,7 +21,7 @@ const SERVER_NAME = 'vibo-mcp';
21
21
  /**
22
22
  * Capture the signed-in user's Vibo token pair from their browser via the
23
23
  * fetchproxy bridge and return it (the caller persists after verifying).
24
- * Preconditions: the fetchproxy browser
24
+ * Preconditions: the ContextMint Bridge browser
25
25
  * extension is installed and the user is signed into https://web.vibodj.com.
26
26
  */
27
27
  export async function captureViboSession(deps = {}) {
@@ -52,8 +52,12 @@ export async function captureViboSession(deps = {}) {
52
52
  }
53
53
  catch (err) {
54
54
  const msg = err instanceof Error ? err.message : String(err);
55
+ // @fetchproxy errors that know their own remedy (FetchproxyHintedError —
56
+ // e.g. capability_unavailable: this browser can't do that) carry a `hint`;
57
+ // keep it rather than telling the user to (re)install the extension.
58
+ const bridgeHint = err?.hint;
55
59
  throw new McpToolError(`Vibo browser token capture failed: ${msg}`, {
56
- hint: 'Install the fetchproxy browser extension, sign into https://web.vibodj.com, approve the pair code, then retry.',
60
+ hint: typeof bridgeHint === 'string' && bridgeHint ? bridgeHint : 'Install the ContextMint Bridge browser extension (https://github.com/nullnet-app/contextmint-bridge/releases), sign into https://web.vibodj.com, approve the pair code, then retry.',
57
61
  cause: err,
58
62
  });
59
63
  }
@@ -61,7 +65,7 @@ export async function captureViboSession(deps = {}) {
61
65
  const refreshToken = session.localStorage?.['x-refresh-token'] ?? null;
62
66
  if (!accessToken) {
63
67
  throw new McpToolError('No Vibo token found in the signed-in browser tab.', {
64
- hint: 'Make sure you are signed into https://web.vibodj.com in the browser with the fetchproxy extension, then retry.',
68
+ hint: 'Make sure you are signed into https://web.vibodj.com in the browser with ContextMint Bridge, then retry.',
65
69
  });
66
70
  }
67
71
  // Return the captured pair WITHOUT persisting — the caller verifies it