vibo-mcp 1.1.0 → 1.3.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/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +2 -2
- package/README.md +1 -0
- package/SKILL.md +15 -1
- package/dist/auth.js +71 -0
- package/dist/bundle.js +764 -12
- package/dist/client.js +110 -3
- package/dist/gql.js +124 -0
- package/dist/index.js +16 -0
- package/dist/session-store.js +45 -0
- package/dist/tools/collaboration.js +87 -0
- package/dist/tools/comments.js +73 -0
- package/dist/tools/ideas.js +43 -0
- package/dist/tools/imports.js +38 -0
- package/dist/tools/questions.js +31 -5
- package/dist/tools/section-edit.js +40 -0
- package/dist/tools/session.js +24 -0
- package/dist/tools/song-management.js +103 -0
- package/dist/tools/uploads.js +20 -0
- package/dist/version.js +1 -1
- package/package.json +4 -3
- package/server.json +3 -3
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
"email": "chris.c.hall@gmail.com"
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
|
-
"description": "MCP server for Vibo (vibodj.com) — plan event music, song requests, and playlists via natural language",
|
|
10
|
-
"version": "1.
|
|
9
|
+
"description": "MCP server for Vibo (vibodj.com) — plan & manage event music, song requests, ideas, guests, and playlists via natural language",
|
|
10
|
+
"version": "1.3.0"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
14
14
|
"name": "vibo-mcp",
|
|
15
15
|
"displayName": "Vibo",
|
|
16
16
|
"source": "./",
|
|
17
|
-
"description": "MCP server for Vibo — browse events
|
|
18
|
-
"version": "1.
|
|
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": "1.3.0",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibo-mcp",
|
|
3
3
|
"displayName": "Vibo",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"description": "MCP server for Vibo (vibodj.com) — plan event music, song requests, and playlists via natural language",
|
|
4
|
+
"version": "1.3.0",
|
|
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",
|
|
8
8
|
"email": "chris.c.hall@gmail.com"
|
package/README.md
CHANGED
|
@@ -33,6 +33,7 @@ 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
37
|
|
|
37
38
|
The server boots without credentials; the config error only surfaces on the
|
|
38
39
|
first tool call.
|
package/SKILL.md
CHANGED
|
@@ -40,6 +40,10 @@ Pick one:
|
|
|
40
40
|
- **Captured token (for Apple/Google/Facebook accounts):** set
|
|
41
41
|
`VIBO_ACCESS_TOKEN` (and `VIBO_REFRESH_TOKEN`) with values captured from a
|
|
42
42
|
signed-in `web.vibodj.com` session — no password needed.
|
|
43
|
+
- **Browser capture (SSO, automatic):** with the fetchproxy browser extension
|
|
44
|
+
installed and yourself signed into https://web.vibodj.com, run
|
|
45
|
+
`vibo_capture_session` once — it grabs the token from your tab (approve the
|
|
46
|
+
pair code), saves it to `~/.vibo-mcp/session.json`, and reuses it thereafter.
|
|
43
47
|
|
|
44
48
|
The server boots without credentials (so it can be installed and probed); the
|
|
45
49
|
config error only appears on the first tool call.
|
|
@@ -54,7 +58,9 @@ config error only appears on the first tool call.
|
|
|
54
58
|
- `vibo_get_section_songs` — songs requested in a section, with likes/flags/comments.
|
|
55
59
|
- `vibo_list_section_questions` — the DJ's planning questions for a section (type, options, current answer).
|
|
56
60
|
- `vibo_search_songs` — find songs to add (Vibo catalog or connected Spotify).
|
|
61
|
+
- `vibo_list_section_song_ideas` / `vibo_list_song_ideas_songs` — browse the DJ's suggested song collections per section.
|
|
57
62
|
- `vibo_get_playlists` / `vibo_get_playlist_songs` — your connected-service playlists.
|
|
63
|
+
- `vibo_list_event_users` — the hosts and guests on an event.
|
|
58
64
|
- `vibo_list_notifications` / `vibo_get_notifications_count`.
|
|
59
65
|
- `vibo_healthcheck` — confirm connectivity + auth.
|
|
60
66
|
|
|
@@ -63,11 +69,19 @@ Each mutating tool makes **no** network call unless `confirm: true`; without it
|
|
|
63
69
|
you get a dry-run preview of exactly what would be sent.
|
|
64
70
|
|
|
65
71
|
- `vibo_add_song_to_section` — add a searched song to a section.
|
|
72
|
+
- `vibo_remove_song_from_section` / `vibo_move_song` / `vibo_reorder_songs`.
|
|
73
|
+
- `vibo_update_song` — mark must-play / do-not-play, or set a comment.
|
|
66
74
|
- `vibo_toggle_song_like` — like/unlike a song.
|
|
75
|
+
- `vibo_comment_on_song` / `vibo_comment_on_section` (+ delete) — leave the DJ notes.
|
|
76
|
+
- `vibo_import_playlist_to_section` — pull tracks from a connected Spotify/Apple playlist.
|
|
67
77
|
- `vibo_join_event` — join via a share link/hash (e.g. a `vibodj.app.link/...` URL).
|
|
68
78
|
- `vibo_leave_event`.
|
|
69
79
|
- `vibo_create_event_contact` — add a host/guest contact.
|
|
70
|
-
- `
|
|
80
|
+
- `vibo_invite_users` / `vibo_change_user_role` / `vibo_remove_user` — manage who's on the event.
|
|
81
|
+
- `vibo_update_section` — edit a section's name, time, or note.
|
|
82
|
+
- `vibo_answer_question` — answer a planning question (text / option ids / link / image+file uploads).
|
|
83
|
+
- `vibo_set_profile_photo` — set your profile photo from a local image.
|
|
84
|
+
- `vibo_capture_session` — capture your login from a signed-in browser tab (SSO accounts).
|
|
71
85
|
- `vibo_mark_notifications_read`.
|
|
72
86
|
- `vibo_export_event_to_spotify` / `vibo_export_event_to_apple_music`.
|
|
73
87
|
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// SSO browser token auto-capture (fetchproxy bootstrap).
|
|
2
|
+
//
|
|
3
|
+
// Accounts that sign into Vibo only via Apple/Google/Facebook have no password
|
|
4
|
+
// to put in VIBO_PASSWORD. Instead of asking the user to dig the token out of
|
|
5
|
+
// DevTools and paste VIBO_ACCESS_TOKEN, this captures it once from their
|
|
6
|
+
// signed-in web.vibodj.com tab via the fetchproxy browser bridge, then operates
|
|
7
|
+
// from Node thereafter (the bridge touches only the one-time handshake).
|
|
8
|
+
//
|
|
9
|
+
// The Vibo web app stores its tokens as plain localStorage keys `x-token`
|
|
10
|
+
// (access) and `x-refresh-token` on the web.vibodj.com origin (verified live
|
|
11
|
+
// against a signed-in tab). We snapshot those two keys and return them; the caller verifies
|
|
12
|
+
// them (GET_ME) and only then persists via session-store. The client then uses
|
|
13
|
+
// them like any other token pair (with refresh-on-expiry).
|
|
14
|
+
//
|
|
15
|
+
// `@fetchproxy/bootstrap` is imported lazily so the default credential paths
|
|
16
|
+
// never load it — the .mcpb bundle externalizes it, and an eager import would
|
|
17
|
+
// crash the server at load. Tests inject a fake `bootstrap` via `deps`.
|
|
18
|
+
import { McpToolError } from '@chrischall/mcp-utils';
|
|
19
|
+
import { VERSION } from './version.js';
|
|
20
|
+
const SERVER_NAME = 'vibo-mcp';
|
|
21
|
+
/**
|
|
22
|
+
* Capture the signed-in user's Vibo token pair from their browser via the
|
|
23
|
+
* fetchproxy bridge and return it (the caller persists after verifying).
|
|
24
|
+
* Preconditions: the fetchproxy browser
|
|
25
|
+
* extension is installed and the user is signed into https://web.vibodj.com.
|
|
26
|
+
*/
|
|
27
|
+
export async function captureViboSession(deps = {}) {
|
|
28
|
+
let bootstrap = deps.bootstrap;
|
|
29
|
+
if (!bootstrap) {
|
|
30
|
+
try {
|
|
31
|
+
const mod = (await import('@fetchproxy/bootstrap'));
|
|
32
|
+
bootstrap = mod.bootstrap;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
throw new McpToolError('Browser token capture is unavailable in this build.', {
|
|
36
|
+
hint: 'Run vibo-mcp from npm (npx vibo-mcp) — the packaged .mcpb omits @fetchproxy/bootstrap. Or set VIBO_ACCESS_TOKEN instead.',
|
|
37
|
+
cause: err,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
let session;
|
|
42
|
+
try {
|
|
43
|
+
session = await bootstrap({
|
|
44
|
+
serverName: SERVER_NAME,
|
|
45
|
+
version: VERSION,
|
|
46
|
+
domains: ['vibodj.com'],
|
|
47
|
+
storageSubdomain: 'web', // tokens live on web.vibodj.com
|
|
48
|
+
declare: { cookies: [], localStorage: ['x-token', 'x-refresh-token'], sessionStorage: [], captureHeaders: [] },
|
|
49
|
+
onPairCode: (code) => process.stderr.write(`[vibo-mcp] fetchproxy pair code: ${code}\n`),
|
|
50
|
+
onWaiting: (hint) => process.stderr.write(`[vibo-mcp] ${hint}\n`),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
+
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.',
|
|
57
|
+
cause: err,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const accessToken = session.localStorage?.['x-token'];
|
|
61
|
+
const refreshToken = session.localStorage?.['x-refresh-token'] ?? null;
|
|
62
|
+
if (!accessToken) {
|
|
63
|
+
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.',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Return the captured pair WITHOUT persisting — the caller verifies it
|
|
68
|
+
// (GET_ME) before writing it to disk, so a stale snapshot never lands in
|
|
69
|
+
// session.json.
|
|
70
|
+
return { accessToken, refreshToken };
|
|
71
|
+
}
|