video-context-mcp-server 0.26.1-beta → 0.27.1-beta

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/README.md CHANGED
@@ -415,7 +415,7 @@ When a free-tier limit is reached, the tool falls back gracefully with a notice
415
415
 
416
416
  ### Getting a License
417
417
 
418
- License keys are valid for **1 year** and verified **offline** (no network calls at runtime). Contact the author to obtain one.
418
+ License keys are valid for **1 year**. Validation uses a hybrid approach: fast offline Ed25519 verification runs first, then a brief online heartbeat registers your device (up to **5 devices per key**) and enables revocation. The online check has a 5-second timeout; if the server is unreachable, the offline result is used as a fallback — you are never blocked by network issues. Contact the author to obtain a key.
419
419
 
420
420
  Add `VIDEO_MCP_LICENSE_KEY` to your MCP config `env` block and restart the server:
421
421
 
@@ -427,7 +427,7 @@ Add `VIDEO_MCP_LICENSE_KEY` to your MCP config `env` block and restart the serve
427
427
  }
428
428
  ```
429
429
 
430
- > No registration, no internet check, no extra setup.
430
+ > No account registration required. Validation is offline-first — the brief online heartbeat enforces the device limit and enables revocation, but if the server is unreachable you are never blocked.
431
431
 
432
432
  ---
433
433
 
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.26.1-beta";
1
+ export declare const VERSION = "0.27.1-beta";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by scripts/sync-version.ts — do not edit
2
- export const VERSION = '0.26.1-beta';
2
+ export const VERSION = '0.27.1-beta';
3
3
  //# sourceMappingURL=version.js.map
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import { searchTimestampTool } from './tools/searchTimestamp.js';
9
9
  import { getVideoInfoTool } from './tools/getVideoInfo.js';
10
10
  import { transcribeVideoTool } from './tools/transcribeVideo.js';
11
11
  import { setLoggerServer } from './utils/logger.js';
12
+ import { initLicenseValidation } from './utils/license.js';
12
13
  import { triggerUpdateCheck, waitForUpdateCheck, wrapWithUpdateNotice, } from './utils/updateCheck.js';
13
14
  import { VERSION } from './generated/version.js';
14
15
  import { analyzeVideoSchema, summarizeVideoSchema, extractFramesSchema, searchTimestampSchema, getVideoInfoSchema, transcribeVideoSchema, } from './tools/schemas.js';
@@ -28,6 +29,8 @@ async function main() {
28
29
  });
29
30
  // Wire up the logger so tools can emit progress notifications
30
31
  setLoggerServer(server);
32
+ // Validate the pro license (offline Ed25519 + online heartbeat if key is set)
33
+ await initLicenseValidation();
31
34
  /**
32
35
  * Wrap a tool handler to:
33
36
  * 1. Trigger the background update-check on the first call (fire-and-forget)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,12 @@
9
9
  * The license key is read from the VIDEO_MCP_LICENSE_KEY environment variable.
10
10
  *
11
11
  * Tokens are valid for 1 year from issuance (exp = iat + 365 days).
12
+ *
13
+ * Hybrid validation: offline Ed25519 check runs first (fast path). When a key
14
+ * is present, `initLicenseValidation()` also performs an online heartbeat to
15
+ * register this device and enforce the 5-device-per-license limit. The online
16
+ * check has a 5-second timeout; on failure the offline result is used as a
17
+ * fallback so legitimate users are never blocked by network issues.
12
18
  */
13
19
  export interface LicensePayload {
14
20
  email: string;
@@ -22,6 +28,19 @@ export interface LicenseInfo {
22
28
  email?: string;
23
29
  expiresAt?: Date;
24
30
  reason?: string;
31
+ /** Reason returned by the online validation server (e.g. 'device_limit_exceeded', 'revoked') */
32
+ onlineReason?: string;
33
+ /** Number of devices currently consuming this license (from online check) */
34
+ devicesUsed?: number;
35
+ /** Maximum devices allowed for this license (from online check) */
36
+ deviceLimit?: number;
37
+ }
38
+ /** Result returned by the online validation endpoint */
39
+ export interface OnlineValidationResult {
40
+ valid: boolean;
41
+ reason?: string;
42
+ devicesUsed?: number;
43
+ deviceLimit?: number;
25
44
  }
26
45
  /**
27
46
  * Resets the cached license validation result.
@@ -29,6 +48,26 @@ export interface LicenseInfo {
29
48
  * @internal
30
49
  */
31
50
  export declare function _resetLicenseCache(): void;
51
+ /**
52
+ * Directly sets the license cache for testing purposes.
53
+ * Allows simulating a pre-validated cache state (e.g. stale online check).
54
+ * @internal
55
+ */
56
+ export declare function _setLicenseCacheForTesting(result: LicenseInfo, validatedAt: number, onlineChecked: boolean): void;
57
+ /**
58
+ * Returns a stable, non-PII 16-character hex device identifier.
59
+ * Computed as the first 16 hex chars of:
60
+ * SHA-256(hostname + platform + arch + username)
61
+ */
62
+ export declare function getDeviceFingerprint(): string;
63
+ /**
64
+ * Sends a heartbeat to the license validation server.
65
+ *
66
+ * @param token - The raw license token string
67
+ * @param fingerprint - Device fingerprint from `getDeviceFingerprint()`
68
+ * @returns - Online validation result (valid + metadata)
69
+ */
70
+ export declare function validateOnline(token: string, fingerprint: string): Promise<OnlineValidationResult>;
32
71
  /**
33
72
  * Validates a raw license token string and returns detailed info.
34
73
  *
@@ -36,14 +75,30 @@ export declare function _resetLicenseCache(): void;
36
75
  * @param nowSec - Current time in Unix seconds (overridable for testing)
37
76
  */
38
77
  export declare function validateLicenseToken(token: string, nowSec?: number): LicenseInfo;
78
+ /**
79
+ * Initializes the license validation cache by running both offline and
80
+ * (if a key is present and offline passes) online validation.
81
+ *
82
+ * Must be called once at process startup before the first `isPro()` call.
83
+ * Subsequent `isPro()` calls return the cached result synchronously.
84
+ *
85
+ * Worst-case startup delay: 5 s (only when online check times out).
86
+ */
87
+ export declare function initLicenseValidation(): Promise<void>;
39
88
  /**
40
89
  * Returns detailed license validation info.
41
- * The result is cached after the first call (per process lifetime).
90
+ *
91
+ * Uses the cache populated by `initLicenseValidation()`. If the cache is stale
92
+ * (> 24 h since last online check), the last known result is returned and a
93
+ * background refresh is triggered for the next call.
94
+ *
95
+ * Falls back to a synchronous offline check if the cache was never populated
96
+ * (e.g. in tests or if `initLicenseValidation()` was not called).
42
97
  */
43
98
  export declare function getLicenseInfo(): LicenseInfo;
44
99
  /**
45
100
  * Returns true if the current process has a valid (non-expired) pro license.
46
- * The result is cached after the first call (per process lifetime).
101
+ * Synchronous relies on the cache populated by `initLicenseValidation()`.
47
102
  */
48
103
  export declare function isPro(): boolean;
49
104
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAmBD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAsC,GAC7C,WAAW,CA4Db;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjD"}
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA0BH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA4BD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,IAAI,CAEN;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAQ7C;AAMD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAgDjC;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAsC,GAC7C,WAAW,CA4Db;AAMD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgE3D;AAuCD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAoB5C;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBjD"}
@@ -9,8 +9,16 @@
9
9
  * The license key is read from the VIDEO_MCP_LICENSE_KEY environment variable.
10
10
  *
11
11
  * Tokens are valid for 1 year from issuance (exp = iat + 365 days).
12
+ *
13
+ * Hybrid validation: offline Ed25519 check runs first (fast path). When a key
14
+ * is present, `initLicenseValidation()` also performs an online heartbeat to
15
+ * register this device and enforce the 5-device-per-license limit. The online
16
+ * check has a 5-second timeout; on failure the offline result is used as a
17
+ * fallback so legitimate users are never blocked by network issues.
12
18
  */
13
19
  import * as crypto from 'node:crypto';
20
+ import * as os from 'node:os';
21
+ import { logProgress } from './logger.js';
14
22
  // ---------------------------------------------------------------------------
15
23
  // Embedded public key (Ed25519, PEM format)
16
24
  // Replace this with the real public key generated by scripts/generate-license.ts
@@ -18,6 +26,10 @@ import * as crypto from 'node:crypto';
18
26
  const PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
19
27
  MCowBQYDK2VwAyEA92GHVIXluVRurAJ8C20JIQi8vezWgKcZ8HsFYvtRtmY=
20
28
  -----END PUBLIC KEY-----`;
29
+ /** Default license validation server. Set VIDEO_MCP_LICENSE_SERVER='' to disable. */
30
+ const DEFAULT_LICENSE_SERVER = 'https://video-mcp-license.video-context-mcp.workers.dev';
31
+ /** Online result cache TTL: 24 hours in milliseconds */
32
+ const ONLINE_TTL_MS = 24 * 60 * 60 * 1000;
21
33
  // ---------------------------------------------------------------------------
22
34
  // Base64url helpers (no external deps)
23
35
  // ---------------------------------------------------------------------------
@@ -28,19 +40,100 @@ function base64urlDecode(str) {
28
40
  return Buffer.from(base64 + '='.repeat(pad), 'base64');
29
41
  }
30
42
  // ---------------------------------------------------------------------------
31
- // Cached result validated once per process lifetime
43
+ // Cachericher than before to support TTL-based refresh
32
44
  // ---------------------------------------------------------------------------
33
- let cachedResult = null;
45
+ let licenseCache = null;
34
46
  /**
35
47
  * Resets the cached license validation result.
36
48
  * Exposed for testing purposes only.
37
49
  * @internal
38
50
  */
39
51
  export function _resetLicenseCache() {
40
- cachedResult = null;
52
+ licenseCache = null;
53
+ }
54
+ /**
55
+ * Directly sets the license cache for testing purposes.
56
+ * Allows simulating a pre-validated cache state (e.g. stale online check).
57
+ * @internal
58
+ */
59
+ export function _setLicenseCacheForTesting(result, validatedAt, onlineChecked) {
60
+ licenseCache = { result, validatedAt, onlineChecked };
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Device fingerprint
64
+ // ---------------------------------------------------------------------------
65
+ /**
66
+ * Returns a stable, non-PII 16-character hex device identifier.
67
+ * Computed as the first 16 hex chars of:
68
+ * SHA-256(hostname + platform + arch + username)
69
+ */
70
+ export function getDeviceFingerprint() {
71
+ const raw = [
72
+ os.hostname(),
73
+ os.platform(),
74
+ os.arch(),
75
+ os.userInfo().username,
76
+ ].join('|');
77
+ return crypto.createHash('sha256').update(raw).digest('hex').slice(0, 16);
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Online validation
81
+ // ---------------------------------------------------------------------------
82
+ /**
83
+ * Sends a heartbeat to the license validation server.
84
+ *
85
+ * @param token - The raw license token string
86
+ * @param fingerprint - Device fingerprint from `getDeviceFingerprint()`
87
+ * @returns - Online validation result (valid + metadata)
88
+ */
89
+ export async function validateOnline(token, fingerprint) {
90
+ const serverUrl = process.env.VIDEO_MCP_LICENSE_SERVER ?? DEFAULT_LICENSE_SERVER;
91
+ // Allow disabling online validation by setting the var to empty string
92
+ if (!serverUrl) {
93
+ return { valid: true, reason: 'online_disabled' };
94
+ }
95
+ const controller = new AbortController();
96
+ const timeout = setTimeout(() => controller.abort(), 5000);
97
+ try {
98
+ const response = await fetch(`${serverUrl}/v1/validate`, {
99
+ method: 'POST',
100
+ headers: { 'Content-Type': 'application/json' },
101
+ body: JSON.stringify({
102
+ token,
103
+ fingerprint,
104
+ metadata: {
105
+ os: os.platform(),
106
+ arch: os.arch(),
107
+ nodeVersion: process.version,
108
+ },
109
+ }),
110
+ signal: controller.signal,
111
+ });
112
+ if (!response.ok) {
113
+ const text = await response.text().catch(() => '');
114
+ try {
115
+ const json = JSON.parse(text);
116
+ return json;
117
+ }
118
+ catch {
119
+ return { valid: false, reason: `server_error_${response.status}` };
120
+ }
121
+ }
122
+ const json = (await response.json());
123
+ return json;
124
+ }
125
+ catch (err) {
126
+ if (err instanceof Error && err.name === 'AbortError') {
127
+ return { valid: false, reason: 'timeout' };
128
+ }
129
+ return { valid: false, reason: 'network_error' };
130
+ }
131
+ finally {
132
+ clearTimeout(timeout);
133
+ }
41
134
  }
42
135
  // ---------------------------------------------------------------------------
43
- // Core validation
136
+ // Core offline validation
44
137
  // ---------------------------------------------------------------------------
45
138
  /**
46
139
  * Validates a raw license token string and returns detailed info.
@@ -102,22 +195,131 @@ export function validateLicenseToken(token, nowSec = Math.floor(Date.now() / 100
102
195
  };
103
196
  }
104
197
  // ---------------------------------------------------------------------------
198
+ // Hybrid validation — run once at startup
199
+ // ---------------------------------------------------------------------------
200
+ /**
201
+ * Initializes the license validation cache by running both offline and
202
+ * (if a key is present and offline passes) online validation.
203
+ *
204
+ * Must be called once at process startup before the first `isPro()` call.
205
+ * Subsequent `isPro()` calls return the cached result synchronously.
206
+ *
207
+ * Worst-case startup delay: 5 s (only when online check times out).
208
+ */
209
+ export async function initLicenseValidation() {
210
+ const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
211
+ // Step 1: Offline check
212
+ const offlineResult = validateLicenseToken(token);
213
+ // No key or offline failure → cache immediately, skip online
214
+ if (!offlineResult.valid) {
215
+ licenseCache = {
216
+ result: offlineResult,
217
+ validatedAt: 0,
218
+ onlineChecked: false,
219
+ };
220
+ return;
221
+ }
222
+ // Step 2: Online check (token is offline-valid)
223
+ const serverUrl = process.env.VIDEO_MCP_LICENSE_SERVER ?? DEFAULT_LICENSE_SERVER;
224
+ if (!serverUrl) {
225
+ // Online validation explicitly disabled
226
+ licenseCache = {
227
+ result: offlineResult,
228
+ validatedAt: Date.now(),
229
+ onlineChecked: false,
230
+ };
231
+ return;
232
+ }
233
+ const fingerprint = getDeviceFingerprint();
234
+ const onlineResult = await validateOnline(token, fingerprint);
235
+ if (onlineResult.reason === 'timeout' ||
236
+ onlineResult.reason === 'network_error') {
237
+ // Network failure → fall back to offline result with a warning
238
+ logProgress(`[video-mcp] License online check failed (${onlineResult.reason}). ` +
239
+ 'Falling back to offline validation.');
240
+ licenseCache = {
241
+ result: offlineResult,
242
+ validatedAt: 0,
243
+ onlineChecked: false,
244
+ };
245
+ return;
246
+ }
247
+ // Online result takes precedence
248
+ const finalResult = {
249
+ ...offlineResult,
250
+ valid: onlineResult.valid,
251
+ onlineReason: onlineResult.reason,
252
+ devicesUsed: onlineResult.devicesUsed,
253
+ deviceLimit: onlineResult.deviceLimit,
254
+ };
255
+ licenseCache = {
256
+ result: finalResult,
257
+ validatedAt: Date.now(),
258
+ onlineChecked: true,
259
+ };
260
+ }
261
+ /**
262
+ * Fires a background (non-blocking) online re-validation to refresh a stale
263
+ * cache entry. Updates `licenseCache` in place when the response arrives.
264
+ */
265
+ function _refreshOnlineAsync() {
266
+ const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
267
+ const fingerprint = getDeviceFingerprint();
268
+ validateOnline(token, fingerprint)
269
+ .then((onlineResult) => {
270
+ if (onlineResult.reason === 'timeout' ||
271
+ onlineResult.reason === 'network_error') {
272
+ return; // Keep stale cached result
273
+ }
274
+ if (licenseCache) {
275
+ licenseCache.result = {
276
+ ...licenseCache.result,
277
+ valid: onlineResult.valid,
278
+ onlineReason: onlineResult.reason,
279
+ devicesUsed: onlineResult.devicesUsed,
280
+ deviceLimit: onlineResult.deviceLimit,
281
+ };
282
+ licenseCache.validatedAt = Date.now();
283
+ licenseCache.onlineChecked = true;
284
+ }
285
+ })
286
+ .catch(() => {
287
+ // Silently ignore — stale cache result is fine
288
+ });
289
+ }
290
+ // ---------------------------------------------------------------------------
105
291
  // Public API
106
292
  // ---------------------------------------------------------------------------
107
293
  /**
108
294
  * Returns detailed license validation info.
109
- * The result is cached after the first call (per process lifetime).
295
+ *
296
+ * Uses the cache populated by `initLicenseValidation()`. If the cache is stale
297
+ * (> 24 h since last online check), the last known result is returned and a
298
+ * background refresh is triggered for the next call.
299
+ *
300
+ * Falls back to a synchronous offline check if the cache was never populated
301
+ * (e.g. in tests or if `initLicenseValidation()` was not called).
110
302
  */
111
303
  export function getLicenseInfo() {
112
- if (cachedResult)
113
- return cachedResult;
114
- const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
115
- cachedResult = validateLicenseToken(token);
116
- return cachedResult;
304
+ if (!licenseCache) {
305
+ // Fallback: synchronous offline-only check (no initLicenseValidation called)
306
+ const token = process.env.VIDEO_MCP_LICENSE_KEY ?? '';
307
+ const result = validateLicenseToken(token);
308
+ licenseCache = { result, validatedAt: 0, onlineChecked: false };
309
+ return result;
310
+ }
311
+ // Check if online result has gone stale
312
+ const onlineTTLExpired = licenseCache.onlineChecked &&
313
+ Date.now() - licenseCache.validatedAt > ONLINE_TTL_MS;
314
+ if (onlineTTLExpired) {
315
+ // Return last known result and kick off background refresh
316
+ _refreshOnlineAsync();
317
+ }
318
+ return licenseCache.result;
117
319
  }
118
320
  /**
119
321
  * Returns true if the current process has a valid (non-expired) pro license.
120
- * The result is cached after the first call (per process lifetime).
322
+ * Synchronous relies on the cache populated by `initLicenseValidation()`.
121
323
  */
122
324
  export function isPro() {
123
325
  return getLicenseInfo().valid;
@@ -128,6 +330,13 @@ export function isPro() {
128
330
  * @param feature - Human-readable name of the pro feature
129
331
  */
130
332
  export function proNotice(feature) {
333
+ const info = getLicenseInfo();
334
+ // Device limit exceeded — give a specific, actionable message
335
+ if (info.onlineReason === 'device_limit_exceeded') {
336
+ const used = info.devicesUsed ?? '?';
337
+ const limit = info.deviceLimit ?? 5;
338
+ return `⚡ License device limit reached (${used}/${limit} devices).`;
339
+ }
131
340
  return (`⚡ Pro feature: ${feature}. ` +
132
341
  'Using free-tier limit instead. ' +
133
342
  'Set VIDEO_MCP_LICENSE_KEY to unlock. ' +
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/utils/license.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "video-context-mcp-server",
3
- "version": "0.26.1-beta",
3
+ "version": "0.27.1-beta",
4
4
  "description": "A Model Context Protocol server that gives GitHub Copilot the ability to understand and analyze video content",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",