vibo-mcp 2.0.0 → 2.2.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/dist/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { dirname, join } from 'path';
2
2
  import { fileURLToPath } from 'url';
3
- import { loadDotenvSafely, readEnvVar, McpToolError, SessionNotAuthenticatedError, truncateErrorMessage, } from '@chrischall/mcp-utils';
3
+ import { loadDotenvSafely, readEnvVar, McpToolError, SessionNotAuthenticatedError, truncateErrorMessage, withAmbientCancellation, } from '@chrischall/mcp-utils';
4
4
  import { loadSession, saveSession } from './session-store.js';
5
5
  // Load .env for local dev; silently skip if dotenv is unavailable (e.g. the
6
6
  // mcpb bundle, which externalizes dotenv). `override: false` means a
@@ -40,6 +40,25 @@ const REFRESH = `
40
40
  // Error codes Vibo (and conventional GraphQL servers) use for an expired /
41
41
  // missing session — these should trigger a token refresh + replay.
42
42
  const AUTH_ERROR_CODES = new Set(['UNAUTHORIZED', 'UNAUTHENTICATED', 'FORBIDDEN']);
43
+ /**
44
+ * The signal every Vibo request is made with: our timeout, and the caller's
45
+ * cancellation if there is one (mcp-utils `cancel`).
46
+ *
47
+ * Until this, only the timeout could stop a request — a cancelled tool call
48
+ * held it open for the full budget while the child burned the CPU mcp-host
49
+ * meters it on. Measured on that fleet: claude.ai sent 101 cancellations in
50
+ * the week to 2026-09-20.
51
+ *
52
+ * ONE definition for both request paths, which is not tidiness: the two are
53
+ * the multipart upload and the plain query, they had the same seven lines
54
+ * copied between them, and the next person to add a third path is the one
55
+ * this saves. The `TimeoutError` checks at both call sites still name a real
56
+ * timeout — an abort from the caller arrives as `AbortError` and falls
57
+ * through to 'failed'.
58
+ */
59
+ function requestSignal() {
60
+ return withAmbientCancellation(AbortSignal.timeout(REQUEST_TIMEOUT_MS));
61
+ }
43
62
  export class ViboClient {
44
63
  apiUrl;
45
64
  email;
@@ -172,7 +191,7 @@ export class ViboClient {
172
191
  method: 'POST',
173
192
  headers, // NB: no content-type — fetch sets the multipart boundary
174
193
  body: form,
175
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
194
+ signal: requestSignal(),
176
195
  });
177
196
  }
178
197
  catch (err) {
@@ -265,7 +284,7 @@ export class ViboClient {
265
284
  method: 'POST',
266
285
  headers,
267
286
  body: JSON.stringify({ query, variables }),
268
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
287
+ signal: requestSignal(),
269
288
  });
270
289
  }
271
290
  catch (err) {
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.0.0'; // x-release-please-version
5
+ export const VERSION = '2.2.0'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibo-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.2.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>",
@@ -38,7 +38,7 @@
38
38
  ],
39
39
  "scripts": {
40
40
  "build": "tsc && npm run bundle",
41
- "bundle": "esbuild src/index.ts --bundle --alias:zod/v4=./node_modules/zod/v4/index.cjs --platform=node --format=esm --external:dotenv --external:@fetchproxy/bootstrap --outfile=dist/bundle.js",
41
+ "bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --external:@fetchproxy/bootstrap --outfile=dist/bundle.js",
42
42
  "dev": "node dist/index.js",
43
43
  "test": "npm run typecheck && vitest run",
44
44
  "test:watch": "vitest",
@@ -46,7 +46,7 @@
46
46
  "typecheck": "tsc -p tsconfig.json --noEmit"
47
47
  },
48
48
  "dependencies": {
49
- "@chrischall/mcp-utils": "^0.28.0",
49
+ "@chrischall/mcp-utils": "^2.0.0",
50
50
  "@fetchproxy/bootstrap": "^3.0.1",
51
51
  "@modelcontextprotocol/server": "^2.0.0",
52
52
  "dotenv": "^17.4.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.0.0",
9
+ "version": "2.2.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "vibo-mcp",
14
- "version": "2.0.0",
14
+ "version": "2.2.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },