vibo-mcp 2.2.0 → 2.2.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +319 -232
- package/dist/tools/collaboration.js +3 -3
- package/dist/tools/comments.js +4 -4
- package/dist/tools/events.js +3 -3
- package/dist/tools/imports.js +1 -1
- package/dist/tools/notifications.js +1 -1
- package/dist/tools/playlists.js +2 -2
- package/dist/tools/questions.js +1 -1
- package/dist/tools/section-edit.js +1 -1
- package/dist/tools/session.js +1 -1
- package/dist/tools/song-management.js +4 -4
- package/dist/tools/songs.js +2 -2
- package/dist/tools/uploads.js +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
- package/server.json +2 -2
|
@@ -42,7 +42,7 @@ export function registerCollaborationTools(server, client) {
|
|
|
42
42
|
});
|
|
43
43
|
server.registerTool('vibo_invite_users', {
|
|
44
44
|
description: 'Invite people to an event by email (as host or guest). Confirm-gated.',
|
|
45
|
-
annotations: toolAnnotations({ title: 'Invite Vibo event users', readOnly: false }),
|
|
45
|
+
annotations: toolAnnotations({ title: 'Invite Vibo event users', readOnly: false, destructive: true }),
|
|
46
46
|
inputSchema: z.object({
|
|
47
47
|
eventId: z.string().describe('Event id.'),
|
|
48
48
|
type: z.enum(['host', 'guest']).describe('Invite as host or guest.'),
|
|
@@ -59,7 +59,7 @@ export function registerCollaborationTools(server, client) {
|
|
|
59
59
|
});
|
|
60
60
|
server.registerTool('vibo_change_user_role', {
|
|
61
61
|
description: "Change an event member's role between host and guest. Confirm-gated.",
|
|
62
|
-
annotations: toolAnnotations({ title: 'Change Vibo user role', readOnly: false }),
|
|
62
|
+
annotations: toolAnnotations({ title: 'Change Vibo user role', readOnly: false, destructive: true }),
|
|
63
63
|
inputSchema: z.object({
|
|
64
64
|
eventId: z.string().describe('Event id.'),
|
|
65
65
|
userId: z.string().describe('Id of the member to update.'),
|
|
@@ -75,7 +75,7 @@ export function registerCollaborationTools(server, client) {
|
|
|
75
75
|
});
|
|
76
76
|
server.registerTool('vibo_remove_user', {
|
|
77
77
|
description: 'Remove a member from an event. Confirm-gated.',
|
|
78
|
-
annotations: toolAnnotations({ title: 'Remove Vibo event user', readOnly: false }),
|
|
78
|
+
annotations: toolAnnotations({ title: 'Remove Vibo event user', readOnly: false, destructive: true }),
|
|
79
79
|
inputSchema: z.object({
|
|
80
80
|
eventId: z.string().describe('Event id.'),
|
|
81
81
|
userId: z.string().describe('Id of the member to remove.'),
|
package/dist/tools/comments.js
CHANGED
|
@@ -5,7 +5,7 @@ import { previewResult } from './shared.js';
|
|
|
5
5
|
export function registerCommentTools(server, client) {
|
|
6
6
|
server.registerTool('vibo_comment_on_song', {
|
|
7
7
|
description: 'Leave a comment / note for the DJ on a specific song. Confirm-gated.',
|
|
8
|
-
annotations: toolAnnotations({ title: 'Comment on Vibo song', readOnly: false }),
|
|
8
|
+
annotations: toolAnnotations({ title: 'Comment on Vibo song', readOnly: false, destructive: false }),
|
|
9
9
|
inputSchema: z.object({
|
|
10
10
|
eventId: z.string().describe('Event id.'),
|
|
11
11
|
sectionId: z.string().describe('Section id.'),
|
|
@@ -22,7 +22,7 @@ export function registerCommentTools(server, client) {
|
|
|
22
22
|
});
|
|
23
23
|
server.registerTool('vibo_delete_song_comment', {
|
|
24
24
|
description: 'Delete a comment on a song. Confirm-gated.',
|
|
25
|
-
annotations: toolAnnotations({ title: 'Delete Vibo song comment', readOnly: false }),
|
|
25
|
+
annotations: toolAnnotations({ title: 'Delete Vibo song comment', readOnly: false, destructive: true }),
|
|
26
26
|
inputSchema: z.object({
|
|
27
27
|
eventId: z.string().describe('Event id.'),
|
|
28
28
|
sectionId: z.string().describe('Section id.'),
|
|
@@ -39,7 +39,7 @@ export function registerCommentTools(server, client) {
|
|
|
39
39
|
});
|
|
40
40
|
server.registerTool('vibo_comment_on_section', {
|
|
41
41
|
description: 'Leave a comment on a timeline section. Confirm-gated.',
|
|
42
|
-
annotations: toolAnnotations({ title: 'Comment on Vibo section', readOnly: false }),
|
|
42
|
+
annotations: toolAnnotations({ title: 'Comment on Vibo section', readOnly: false, destructive: false }),
|
|
43
43
|
inputSchema: z.object({
|
|
44
44
|
eventId: z.string().describe('Event id.'),
|
|
45
45
|
sectionId: z.string().describe('Section id (from vibo_list_sections).'),
|
|
@@ -55,7 +55,7 @@ export function registerCommentTools(server, client) {
|
|
|
55
55
|
});
|
|
56
56
|
server.registerTool('vibo_delete_section_comment', {
|
|
57
57
|
description: 'Delete a comment on a timeline section. Confirm-gated.',
|
|
58
|
-
annotations: toolAnnotations({ title: 'Delete Vibo section comment', readOnly: false }),
|
|
58
|
+
annotations: toolAnnotations({ title: 'Delete Vibo section comment', readOnly: false, destructive: true }),
|
|
59
59
|
inputSchema: z.object({
|
|
60
60
|
eventId: z.string().describe('Event id.'),
|
|
61
61
|
sectionId: z.string().describe('Section id (from vibo_list_sections).'),
|
package/dist/tools/events.js
CHANGED
|
@@ -33,7 +33,7 @@ export function registerEventTools(server, client) {
|
|
|
33
33
|
});
|
|
34
34
|
server.registerTool('vibo_join_event', {
|
|
35
35
|
description: "Join an event you were invited to, via its share link or hash (e.g. a vibodj.app.link/... URL someone sent you). Returns the joined event's id. Confirm-gated.",
|
|
36
|
-
annotations: toolAnnotations({ title: 'Join Vibo event', readOnly: false }),
|
|
36
|
+
annotations: toolAnnotations({ title: 'Join Vibo event', readOnly: false, destructive: false }),
|
|
37
37
|
inputSchema: z.object({
|
|
38
38
|
link: z
|
|
39
39
|
.string()
|
|
@@ -56,7 +56,7 @@ export function registerEventTools(server, client) {
|
|
|
56
56
|
});
|
|
57
57
|
server.registerTool('vibo_leave_event', {
|
|
58
58
|
description: 'Leave an event you previously joined. Confirm-gated.',
|
|
59
|
-
annotations: toolAnnotations({ title: 'Leave Vibo event', readOnly: false }),
|
|
59
|
+
annotations: toolAnnotations({ title: 'Leave Vibo event', readOnly: false, destructive: true }),
|
|
60
60
|
inputSchema: z.object({
|
|
61
61
|
eventId: z.string().describe('Event id to leave.'),
|
|
62
62
|
confirm: schemaConfirm,
|
|
@@ -69,7 +69,7 @@ export function registerEventTools(server, client) {
|
|
|
69
69
|
});
|
|
70
70
|
server.registerTool('vibo_create_event_contact', {
|
|
71
71
|
description: 'Add a contact (host or guest) to an event with their name/email/phone. Confirm-gated.',
|
|
72
|
-
annotations: toolAnnotations({ title: 'Add Vibo event contact', readOnly: false }),
|
|
72
|
+
annotations: toolAnnotations({ title: 'Add Vibo event contact', readOnly: false, destructive: false }),
|
|
73
73
|
inputSchema: z.object({
|
|
74
74
|
eventId: z.string().describe('Event id.'),
|
|
75
75
|
role: z.enum(['host', 'guest']).describe("The contact's role in the event."),
|
package/dist/tools/imports.js
CHANGED
|
@@ -5,7 +5,7 @@ import { previewResult } from './shared.js';
|
|
|
5
5
|
export function registerImportTools(server, client) {
|
|
6
6
|
server.registerTool('vibo_import_playlist_to_section', {
|
|
7
7
|
description: 'Import selected tracks from a connected Spotify/Apple Music playlist into a section. Returns counts of added/existing/ignored. Confirm-gated.',
|
|
8
|
-
annotations: toolAnnotations({ title: 'Import playlist to section', readOnly: false }),
|
|
8
|
+
annotations: toolAnnotations({ title: 'Import playlist to section', readOnly: false, destructive: false }),
|
|
9
9
|
inputSchema: z.object({
|
|
10
10
|
eventId: z.string().describe('Event id.'),
|
|
11
11
|
sectionId: z.string().describe('Section id (from vibo_list_sections).'),
|
|
@@ -27,7 +27,7 @@ export function registerNotificationTools(server, client) {
|
|
|
27
27
|
});
|
|
28
28
|
server.registerTool('vibo_mark_notifications_read', {
|
|
29
29
|
description: 'Mark notifications as read — pass specific notificationIds, or readAll:true to clear everything. Confirm-gated.',
|
|
30
|
-
annotations: toolAnnotations({ title: 'Mark notifications read', readOnly: false }),
|
|
30
|
+
annotations: toolAnnotations({ title: 'Mark notifications read', readOnly: false, destructive: false }),
|
|
31
31
|
inputSchema: z.object({
|
|
32
32
|
notificationIds: z.array(z.string()).optional().describe('Specific notification ids to mark read.'),
|
|
33
33
|
readAll: z.boolean().optional().describe('Mark every notification as read.'),
|
package/dist/tools/playlists.js
CHANGED
|
@@ -42,7 +42,7 @@ export function registerPlaylistTools(server, client) {
|
|
|
42
42
|
});
|
|
43
43
|
server.registerTool('vibo_export_event_to_spotify', {
|
|
44
44
|
description: "Export an event's song selections to a new Spotify playlist (Spotify must be connected). Returns the playlist URL plus how many tracks exported / failed. Confirm-gated.",
|
|
45
|
-
annotations: toolAnnotations({ title: 'Export event to Spotify', readOnly: false }),
|
|
45
|
+
annotations: toolAnnotations({ title: 'Export event to Spotify', readOnly: false, destructive: false }),
|
|
46
46
|
inputSchema: z.object({
|
|
47
47
|
eventId: z.string().describe('Event id.'),
|
|
48
48
|
sectionIds: z.array(z.string()).min(1).describe('Section ids to include (from vibo_list_sections).'),
|
|
@@ -63,7 +63,7 @@ export function registerPlaylistTools(server, client) {
|
|
|
63
63
|
});
|
|
64
64
|
server.registerTool('vibo_export_event_to_apple_music', {
|
|
65
65
|
description: "Export an event's song selections to a new Apple Music playlist (Apple Music must be connected). Returns the playlist URL plus how many tracks exported / failed. Confirm-gated.",
|
|
66
|
-
annotations: toolAnnotations({ title: 'Export event to Apple Music', readOnly: false }),
|
|
66
|
+
annotations: toolAnnotations({ title: 'Export event to Apple Music', readOnly: false, destructive: false }),
|
|
67
67
|
inputSchema: z.object({
|
|
68
68
|
eventId: z.string().describe('Event id.'),
|
|
69
69
|
sectionIds: z.array(z.string()).min(1).describe('Section ids to include (from vibo_list_sections).'),
|
package/dist/tools/questions.js
CHANGED
|
@@ -25,7 +25,7 @@ export function registerQuestionTools(server, client, resolveUpload = nodeUpload
|
|
|
25
25
|
});
|
|
26
26
|
server.registerTool('vibo_answer_question', {
|
|
27
27
|
description: "Answer a section planning question. Provide the field matching the question's type: `text` for a text question, `selectedOptions` (array of option _ids from vibo_list_section_questions) for radio/checkbox/select, or `link` (array of URLs) for a link question. Use `otherOptionTitle` with the question's \"other\" option. For photo/file questions, pass local paths (`imagePaths`/`filePaths`) when the server can read your disk, or inline base64 bytes (`images`/`files`) otherwise. Confirm-gated.",
|
|
28
|
-
annotations: toolAnnotations({ title: 'Answer Vibo question', readOnly: false }),
|
|
28
|
+
annotations: toolAnnotations({ title: 'Answer Vibo question', readOnly: false, destructive: false }),
|
|
29
29
|
inputSchema: z.object({
|
|
30
30
|
eventId: z.string().describe('Event id.'),
|
|
31
31
|
sectionId: z.string().describe('Section id.'),
|
|
@@ -5,7 +5,7 @@ import { previewResult } from './shared.js';
|
|
|
5
5
|
export function registerSectionEditTools(server, client) {
|
|
6
6
|
server.registerTool('vibo_update_section', {
|
|
7
7
|
description: "Edit a timeline section's name, time, note, or description. Subject to the section's host-edit permissions. Confirm-gated.",
|
|
8
|
-
annotations: toolAnnotations({ title: 'Update Vibo section', readOnly: false }),
|
|
8
|
+
annotations: toolAnnotations({ title: 'Update Vibo section', readOnly: false, destructive: false }),
|
|
9
9
|
inputSchema: z.object({
|
|
10
10
|
eventId: z.string(),
|
|
11
11
|
sectionId: z.string(),
|
package/dist/tools/session.js
CHANGED
|
@@ -8,7 +8,7 @@ import { GET_ME } from '../gql.js';
|
|
|
8
8
|
export function registerSessionTools(server, client) {
|
|
9
9
|
server.registerTool('vibo_capture_session', {
|
|
10
10
|
description: "Capture your Vibo login from a signed-in web.vibodj.com browser tab via the fetchproxy bridge — for accounts that sign in with Apple/Google/Facebook (no password). Requires the fetchproxy browser extension installed and you signed into https://web.vibodj.com; approve the pair code shown on first use. The token is saved locally and reused on future calls.",
|
|
11
|
-
annotations: toolAnnotations({ title: 'Capture Vibo session (SSO)', readOnly: false }),
|
|
11
|
+
annotations: toolAnnotations({ title: 'Capture Vibo session (SSO)', readOnly: false, destructive: false }),
|
|
12
12
|
}, async () => {
|
|
13
13
|
const { accessToken, refreshToken } = await captureViboSession();
|
|
14
14
|
client.setTokens(accessToken, refreshToken);
|
|
@@ -5,7 +5,7 @@ import { previewResult } from './shared.js';
|
|
|
5
5
|
export function registerSongManagementTools(server, client) {
|
|
6
6
|
server.registerTool('vibo_remove_song_from_section', {
|
|
7
7
|
description: 'Remove one or more songs from a section. Confirm-gated.',
|
|
8
|
-
annotations: toolAnnotations({ title: 'Remove songs from Vibo section', readOnly: false }),
|
|
8
|
+
annotations: toolAnnotations({ title: 'Remove songs from Vibo section', readOnly: false, destructive: true }),
|
|
9
9
|
inputSchema: z.object({
|
|
10
10
|
eventId: z.string().describe('Event id.'),
|
|
11
11
|
sectionId: z.string().describe('Section id.'),
|
|
@@ -24,7 +24,7 @@ export function registerSongManagementTools(server, client) {
|
|
|
24
24
|
});
|
|
25
25
|
server.registerTool('vibo_update_song', {
|
|
26
26
|
description: 'Update songs in a section: mark must-play, flag as do-not-play, and/or set a comment. Provide at least one field. Confirm-gated.',
|
|
27
|
-
annotations: toolAnnotations({ title: 'Update Vibo section songs', readOnly: false }),
|
|
27
|
+
annotations: toolAnnotations({ title: 'Update Vibo section songs', readOnly: false, destructive: false }),
|
|
28
28
|
inputSchema: z.object({
|
|
29
29
|
eventId: z.string().describe('Event id.'),
|
|
30
30
|
sectionId: z.string().describe('Section id.'),
|
|
@@ -58,7 +58,7 @@ export function registerSongManagementTools(server, client) {
|
|
|
58
58
|
});
|
|
59
59
|
server.registerTool('vibo_move_song', {
|
|
60
60
|
description: 'Move songs from one section to another. Confirm-gated.',
|
|
61
|
-
annotations: toolAnnotations({ title: 'Move Vibo section songs', readOnly: false }),
|
|
61
|
+
annotations: toolAnnotations({ title: 'Move Vibo section songs', readOnly: false, destructive: false }),
|
|
62
62
|
inputSchema: z.object({
|
|
63
63
|
eventId: z.string().describe('Event id.'),
|
|
64
64
|
sourceSectionId: z.string().describe('Section id the songs are currently in.'),
|
|
@@ -78,7 +78,7 @@ export function registerSongManagementTools(server, client) {
|
|
|
78
78
|
});
|
|
79
79
|
server.registerTool('vibo_reorder_songs', {
|
|
80
80
|
description: 'Reorder songs within a section. Confirm-gated.',
|
|
81
|
-
annotations: toolAnnotations({ title: 'Reorder Vibo section songs', readOnly: false }),
|
|
81
|
+
annotations: toolAnnotations({ title: 'Reorder Vibo section songs', readOnly: false, destructive: false }),
|
|
82
82
|
inputSchema: z.object({
|
|
83
83
|
eventId: z.string().describe('Event id.'),
|
|
84
84
|
sectionId: z.string().describe('Section id.'),
|
package/dist/tools/songs.js
CHANGED
|
@@ -96,7 +96,7 @@ export function registerSongTools(server, client) {
|
|
|
96
96
|
'`quality.confidence`: adding a `likely-not-original` result puts a cover, karaoke ' +
|
|
97
97
|
'track or junk-metadata re-upload in front of a live DJ. If nothing looks original, ' +
|
|
98
98
|
'report the closest matches back rather than adding a best guess. Confirm-gated.',
|
|
99
|
-
annotations: toolAnnotations({ title: 'Add song to Vibo section', readOnly: false }),
|
|
99
|
+
annotations: toolAnnotations({ title: 'Add song to Vibo section', readOnly: false, destructive: false }),
|
|
100
100
|
inputSchema: z.object({
|
|
101
101
|
eventId: z.string().describe('Event id.'),
|
|
102
102
|
sectionId: z.string().describe('Section id to add the song to.'),
|
|
@@ -126,7 +126,7 @@ export function registerSongTools(server, client) {
|
|
|
126
126
|
});
|
|
127
127
|
server.registerTool('vibo_toggle_song_like', {
|
|
128
128
|
description: 'Like or unlike a song in a section. Confirm-gated.',
|
|
129
|
-
annotations: toolAnnotations({ title: 'Like/unlike Vibo song', readOnly: false }),
|
|
129
|
+
annotations: toolAnnotations({ title: 'Like/unlike Vibo song', readOnly: false, destructive: false }),
|
|
130
130
|
inputSchema: z.object({
|
|
131
131
|
eventId: z.string().describe('Event id.'),
|
|
132
132
|
sectionId: z.string().describe('Section id.'),
|
package/dist/tools/uploads.js
CHANGED
|
@@ -12,7 +12,7 @@ import { previewResult } from './shared.js';
|
|
|
12
12
|
export function registerUploadTools(server, client, resolveUpload = nodeUploadResolver) {
|
|
13
13
|
server.registerTool('vibo_set_profile_photo', {
|
|
14
14
|
description: 'Set your Vibo profile photo from an image. Pass a local file `path` if the server shares your filesystem; otherwise pass the image bytes as base64 `fileData`. Returns the uploaded image URL. Confirm-gated.',
|
|
15
|
-
annotations: toolAnnotations({ title: 'Set Vibo profile photo', readOnly: false }),
|
|
15
|
+
annotations: toolAnnotations({ title: 'Set Vibo profile photo', readOnly: false, destructive: false }),
|
|
16
16
|
inputSchema: z.object({
|
|
17
17
|
path: z.string().optional().describe('Absolute path to a local image file (jpg/png). Local/stdio server only.'),
|
|
18
18
|
fileData: z
|
package/dist/version.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
// literal on the line carrying the release marker; every manifest and the MCP
|
|
3
3
|
// server banner import VERSION from here, so there is exactly one place to keep
|
|
4
4
|
// in sync (and one release-please extra-files entry).
|
|
5
|
-
export const VERSION = '2.2.
|
|
5
|
+
export const VERSION = '2.2.2'; // x-release-please-version
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibo-mcp",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.2",
|
|
4
4
|
"mcpName": "io.github.chrischall/vibo-mcp",
|
|
5
5
|
"description": "Vibo (vibodj.com) MCP server for Claude — host/couple event music planning & management. Developed and maintained by AI (Claude Code).",
|
|
6
6
|
"author": "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@chrischall/mcp-utils": "^2.
|
|
50
|
-
"@fetchproxy/bootstrap": "^3.0
|
|
49
|
+
"@chrischall/mcp-utils": "^2.4.0",
|
|
50
|
+
"@fetchproxy/bootstrap": "^3.2.0",
|
|
51
51
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
52
|
-
"dotenv": "^
|
|
53
|
-
"zod": "^4.6.
|
|
52
|
+
"dotenv": "^18.0.1",
|
|
53
|
+
"zod": "^4.6.5"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@modelcontextprotocol/client": "^2.0.0",
|
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/chrischall/vibo-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "2.2.
|
|
9
|
+
"version": "2.2.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "vibo-mcp",
|
|
14
|
-
"version": "2.2.
|
|
14
|
+
"version": "2.2.2",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|