vibo-mcp 1.5.4 → 1.6.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 +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +76 -48
- package/dist/version.js +1 -1
- package/mint.yaml +65 -0
- package/package.json +8 -6
- package/server.json +2 -2
|
@@ -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": "1.
|
|
10
|
+
"version": "1.6.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": "1.
|
|
18
|
+
"version": "1.6.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": "1.
|
|
4
|
+
"version": "1.6.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/dist/bundle.js
CHANGED
|
@@ -31000,53 +31000,6 @@ var StdioServerTransport = class {
|
|
|
31000
31000
|
}
|
|
31001
31001
|
};
|
|
31002
31002
|
|
|
31003
|
-
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
31004
|
-
async function createMcpServer(opts) {
|
|
31005
|
-
const server = new McpServer({ name: opts.name, version: opts.version });
|
|
31006
|
-
if (opts.banner !== void 0) {
|
|
31007
|
-
console.error(opts.banner);
|
|
31008
|
-
}
|
|
31009
|
-
const deps = opts.deps;
|
|
31010
|
-
for (const register of opts.tools) {
|
|
31011
|
-
await register(server, deps);
|
|
31012
|
-
}
|
|
31013
|
-
return server;
|
|
31014
|
-
}
|
|
31015
|
-
function withGracefulShutdown(server, opts = {}) {
|
|
31016
|
-
const shouldExit = opts.exit ?? true;
|
|
31017
|
-
let shuttingDown = false;
|
|
31018
|
-
const handler = (signal) => {
|
|
31019
|
-
if (shuttingDown)
|
|
31020
|
-
return;
|
|
31021
|
-
shuttingDown = true;
|
|
31022
|
-
void (async () => {
|
|
31023
|
-
try {
|
|
31024
|
-
if (opts.onSignal)
|
|
31025
|
-
await opts.onSignal(signal);
|
|
31026
|
-
await server.close();
|
|
31027
|
-
} catch (err) {
|
|
31028
|
-
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
31029
|
-
} finally {
|
|
31030
|
-
if (shouldExit)
|
|
31031
|
-
process.exit(0);
|
|
31032
|
-
}
|
|
31033
|
-
})();
|
|
31034
|
-
};
|
|
31035
|
-
process.on("SIGINT", () => handler("SIGINT"));
|
|
31036
|
-
process.on("SIGTERM", () => handler("SIGTERM"));
|
|
31037
|
-
}
|
|
31038
|
-
async function runMcp(opts) {
|
|
31039
|
-
const server = await createMcpServer(opts);
|
|
31040
|
-
const shutdown = opts.shutdown ?? true;
|
|
31041
|
-
if (shutdown !== false) {
|
|
31042
|
-
withGracefulShutdown(server, shutdown === true ? {} : shutdown);
|
|
31043
|
-
}
|
|
31044
|
-
const spec = opts.transport ?? "stdio";
|
|
31045
|
-
const transport = spec === "stdio" ? new StdioServerTransport() : spec;
|
|
31046
|
-
await server.connect(transport);
|
|
31047
|
-
return server;
|
|
31048
|
-
}
|
|
31049
|
-
|
|
31050
31003
|
// node_modules/@chrischall/mcp-utils/dist/errors/index.js
|
|
31051
31004
|
var DEFAULT_ERROR_MESSAGE_MAX = 500;
|
|
31052
31005
|
var McpToolError = class extends Error {
|
|
@@ -31109,6 +31062,81 @@ function textResult(data) {
|
|
|
31109
31062
|
content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
|
|
31110
31063
|
};
|
|
31111
31064
|
}
|
|
31065
|
+
function errorResult(message) {
|
|
31066
|
+
return {
|
|
31067
|
+
content: [{ type: "text", text: redactSecrets(message) }],
|
|
31068
|
+
isError: true
|
|
31069
|
+
};
|
|
31070
|
+
}
|
|
31071
|
+
|
|
31072
|
+
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
31073
|
+
function hintResultOrRethrow(err) {
|
|
31074
|
+
if (err instanceof McpToolError && err.hint) {
|
|
31075
|
+
return errorResult(`${err.message}
|
|
31076
|
+
|
|
31077
|
+
Hint: ${err.hint}`);
|
|
31078
|
+
}
|
|
31079
|
+
throw err;
|
|
31080
|
+
}
|
|
31081
|
+
function surfaceToolHints(server) {
|
|
31082
|
+
const register = server.registerTool.bind(server);
|
|
31083
|
+
server.registerTool = (name, config2, cb) => register(name, config2, (...args) => {
|
|
31084
|
+
let result;
|
|
31085
|
+
try {
|
|
31086
|
+
result = cb(...args);
|
|
31087
|
+
} catch (err) {
|
|
31088
|
+
return hintResultOrRethrow(err);
|
|
31089
|
+
}
|
|
31090
|
+
return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
|
|
31091
|
+
});
|
|
31092
|
+
}
|
|
31093
|
+
async function createMcpServer(opts) {
|
|
31094
|
+
const server = new McpServer({ name: opts.name, version: opts.version });
|
|
31095
|
+
if (opts.surfaceHints !== false)
|
|
31096
|
+
surfaceToolHints(server);
|
|
31097
|
+
if (opts.banner !== void 0) {
|
|
31098
|
+
console.error(opts.banner);
|
|
31099
|
+
}
|
|
31100
|
+
const deps = opts.deps;
|
|
31101
|
+
for (const register of opts.tools) {
|
|
31102
|
+
await register(server, deps);
|
|
31103
|
+
}
|
|
31104
|
+
return server;
|
|
31105
|
+
}
|
|
31106
|
+
function withGracefulShutdown(server, opts = {}) {
|
|
31107
|
+
const shouldExit = opts.exit ?? true;
|
|
31108
|
+
let shuttingDown = false;
|
|
31109
|
+
const handler = (signal) => {
|
|
31110
|
+
if (shuttingDown)
|
|
31111
|
+
return;
|
|
31112
|
+
shuttingDown = true;
|
|
31113
|
+
void (async () => {
|
|
31114
|
+
try {
|
|
31115
|
+
if (opts.onSignal)
|
|
31116
|
+
await opts.onSignal(signal);
|
|
31117
|
+
await server.close();
|
|
31118
|
+
} catch (err) {
|
|
31119
|
+
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
31120
|
+
} finally {
|
|
31121
|
+
if (shouldExit)
|
|
31122
|
+
process.exit(0);
|
|
31123
|
+
}
|
|
31124
|
+
})();
|
|
31125
|
+
};
|
|
31126
|
+
process.on("SIGINT", () => handler("SIGINT"));
|
|
31127
|
+
process.on("SIGTERM", () => handler("SIGTERM"));
|
|
31128
|
+
}
|
|
31129
|
+
async function runMcp(opts) {
|
|
31130
|
+
const server = await createMcpServer(opts);
|
|
31131
|
+
const shutdown = opts.shutdown ?? true;
|
|
31132
|
+
if (shutdown !== false) {
|
|
31133
|
+
withGracefulShutdown(server, shutdown === true ? {} : shutdown);
|
|
31134
|
+
}
|
|
31135
|
+
const spec = opts.transport ?? "stdio";
|
|
31136
|
+
const transport = spec === "stdio" ? new StdioServerTransport() : spec;
|
|
31137
|
+
await server.connect(transport);
|
|
31138
|
+
return server;
|
|
31139
|
+
}
|
|
31112
31140
|
|
|
31113
31141
|
// node_modules/@chrischall/mcp-utils/dist/config/index.js
|
|
31114
31142
|
var PLACEHOLDER_RE = /^\$\{[^}]*\}$/;
|
|
@@ -31168,7 +31196,7 @@ function toolAnnotations(opts = {}) {
|
|
|
31168
31196
|
}
|
|
31169
31197
|
|
|
31170
31198
|
// src/version.ts
|
|
31171
|
-
var VERSION = "1.
|
|
31199
|
+
var VERSION = "1.6.0";
|
|
31172
31200
|
|
|
31173
31201
|
// src/client.ts
|
|
31174
31202
|
import { dirname as dirname2, join as join2 } from "path";
|
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 = '1.
|
|
5
|
+
export const VERSION = '1.6.0'; // x-release-please-version
|
package/mint.yaml
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
name: Vibo
|
|
3
|
+
slug: vibo
|
|
4
|
+
summary: >-
|
|
5
|
+
Plan and manage your event music in Vibo (vibodj.com) — events, timeline,
|
|
6
|
+
song requests, the DJ's song ideas and planning questions,
|
|
7
|
+
must-play/do-not-play, comments, guests, and exports to Spotify/Apple
|
|
8
|
+
Music, via natural language.
|
|
9
|
+
#
|
|
10
|
+
# Hosting note (a comment, not user-facing summary text): this is a
|
|
11
|
+
# BROWSER-BRIDGE MCP — it reaches its site through the user's signed-in
|
|
12
|
+
# tab via the fetchproxy bridge. A bridged registration also needs runtime
|
|
13
|
+
# `fly-shared`, `bridge: true` and a `bridgePortEnv`, which are registration
|
|
14
|
+
# fields this manifest has no schema for (set them over the control API).
|
|
15
|
+
# `state.dataDir` below is required for `bridge`.
|
|
16
|
+
env:
|
|
17
|
+
- name: VIBO_EMAIL
|
|
18
|
+
required: false
|
|
19
|
+
help: >-
|
|
20
|
+
Vibo account email (or use VIBO_ACCESS_TOKEN for SSO accounts)
|
|
21
|
+
- name: VIBO_PASSWORD
|
|
22
|
+
secret: true
|
|
23
|
+
required: false
|
|
24
|
+
help: >-
|
|
25
|
+
Vibo account password
|
|
26
|
+
- name: VIBO_ACCESS_TOKEN
|
|
27
|
+
secret: true
|
|
28
|
+
required: false
|
|
29
|
+
help: >-
|
|
30
|
+
Captured x-token from a signed-in web.vibodj.com session (SSO alternative)
|
|
31
|
+
- name: VIBO_REFRESH_TOKEN
|
|
32
|
+
secret: true
|
|
33
|
+
required: false
|
|
34
|
+
help: >-
|
|
35
|
+
Matching x-refresh-token so the session can renew
|
|
36
|
+
- name: VIBO_API_URL
|
|
37
|
+
required: false
|
|
38
|
+
help: >-
|
|
39
|
+
Overrides the upstream API base URL. Leave unset for the default; if you
|
|
40
|
+
change it, update egress.allow to match.
|
|
41
|
+
- name: VIBO_SESSION_FILE
|
|
42
|
+
required: false
|
|
43
|
+
help: >-
|
|
44
|
+
Filesystem path/flag for saved state or output. Relates to state.dataDir;
|
|
45
|
+
leave unset for the default.
|
|
46
|
+
state:
|
|
47
|
+
dataDir: true
|
|
48
|
+
reason: >-
|
|
49
|
+
The fetchproxy identity lives at $HOME/.fetchproxy/identity/<name>.json
|
|
50
|
+
and the pair code derives from it. Without a persistent $HOME every cold
|
|
51
|
+
start mints a fresh identity and re-prompts pairing in the browser; the
|
|
52
|
+
API refuses bridge without it.
|
|
53
|
+
egress:
|
|
54
|
+
allow:
|
|
55
|
+
# Only hosts the SERVER process actually fetches. Hosts that appear
|
|
56
|
+
# solely in a URL this server BUILDS and returns are excluded.
|
|
57
|
+
#
|
|
58
|
+
# Every mode (email/password signIn, captured token, refresh, uploads)
|
|
59
|
+
# POSTs to the GraphQL endpoint from the process itself
|
|
60
|
+
# (src/client.ts DEFAULT_API_URL); no redirect hop. `vibo_capture_session`
|
|
61
|
+
# lifts x-token/x-refresh-token from the signed-in web.vibodj.com tab over
|
|
62
|
+
# the fetchproxy bridge — that is the browser's dial, not the process's, so
|
|
63
|
+
# web.vibodj.com and vibodj.com are NOT listed. A VIBO_API_URL override
|
|
64
|
+
# names a host this list cannot know; add it here if you set one.
|
|
65
|
+
- api.vibodj.com
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibo-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
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>",
|
|
@@ -33,19 +33,21 @@
|
|
|
33
33
|
".claude-plugin",
|
|
34
34
|
"skills",
|
|
35
35
|
".mcp.json",
|
|
36
|
-
"server.json"
|
|
36
|
+
"server.json",
|
|
37
|
+
"mint.yaml"
|
|
37
38
|
],
|
|
38
39
|
"scripts": {
|
|
39
40
|
"build": "tsc && npm run bundle",
|
|
40
41
|
"bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --external:@fetchproxy/bootstrap --outfile=dist/bundle.js",
|
|
41
42
|
"dev": "node dist/index.js",
|
|
42
|
-
"test": "vitest run",
|
|
43
|
+
"test": "npm run typecheck && vitest run",
|
|
43
44
|
"test:watch": "vitest",
|
|
44
|
-
"test:coverage": "vitest run --coverage"
|
|
45
|
+
"test:coverage": "npm run typecheck && vitest run --coverage",
|
|
46
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
45
47
|
},
|
|
46
48
|
"dependencies": {
|
|
47
|
-
"@chrischall/mcp-utils": "^0.
|
|
48
|
-
"@fetchproxy/bootstrap": "^2.
|
|
49
|
+
"@chrischall/mcp-utils": "^0.15.0",
|
|
50
|
+
"@fetchproxy/bootstrap": "^2.2.0",
|
|
49
51
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
50
52
|
"dotenv": "^17.4.0",
|
|
51
53
|
"zod": "^4.4.2"
|
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": "1.
|
|
9
|
+
"version": "1.6.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "vibo-mcp",
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.6.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|