@vibeframe/mcp-server 0.92.0 → 0.94.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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +52 -33
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -235,7 +235,7 @@ API keys are read from the host's environment (`~/.zshrc`, MCP config `env` bloc
235
235
  | `GOOGLE_API_KEY` | Gemini (analyze, review, silence-cut, narrate) |
236
236
  | `ELEVENLABS_API_KEY` | TTS, voice-clone, dubbing, SFX |
237
237
  | `XAI_API_KEY` | Grok |
238
- | `FAL_KEY` | Seedance image-to-video |
238
+ | `FAL_API_KEY` | Seedance image-to-video |
239
239
  | `RUNWAY_API_SECRET` | Runway video |
240
240
  | `KLING_API_KEY` | Kling video |
241
241
  | `VIBE_PROJECT_PATH` | Default timeline JSON path for resources |
package/dist/index.js CHANGED
@@ -13996,6 +13996,9 @@ function getProvidersFor(kind) {
13996
13996
  function getProviderEnvVars() {
13997
13997
  return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
13998
13998
  }
13999
+ function getProviderEnvAliases() {
14000
+ return Object.fromEntries([...apiKeyRegistry.values()].filter((k) => k.envAliases && k.envAliases.length > 0).map((k) => [k.envVar, k.envAliases ?? []]));
14001
+ }
13999
14002
  function getCommandKeyMap() {
14000
14003
  const map3 = {};
14001
14004
  for (const p of providerRegistry2.values()) {
@@ -14103,7 +14106,7 @@ var init_api_keys = __esm({
14103
14106
  });
14104
14107
  defineApiKey({
14105
14108
  configKey: "fal",
14106
- envVar: "FAL_KEY",
14109
+ envVar: "FAL_API_KEY",
14107
14110
  label: "fal.ai",
14108
14111
  showInSetup: true,
14109
14112
  setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
@@ -14120,7 +14123,7 @@ var init_api_keys = __esm({
14120
14123
  label: "xAI",
14121
14124
  showInSetup: true,
14122
14125
  setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14123
- envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14126
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
14124
14127
  envExampleUrl: "https://console.x.ai/",
14125
14128
  keyFormat: { prefix: /^xai-/, example: "xai-..." }
14126
14129
  });
@@ -24177,7 +24180,7 @@ var init_FalProvider = __esm({
24177
24180
  return {
24178
24181
  id: "",
24179
24182
  status: "failed",
24180
- error: "fal.ai API key not configured. Set FAL_KEY in .env."
24183
+ error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
24181
24184
  };
24182
24185
  }
24183
24186
  const variant = options?.model ?? DEFAULT_VARIANT;
@@ -24954,6 +24957,7 @@ __export(dist_exports, {
24954
24957
  getCommandKeyMap: () => getCommandKeyMap,
24955
24958
  getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
24956
24959
  getKeyFormat: () => getKeyFormat,
24960
+ getProviderEnvAliases: () => getProviderEnvAliases,
24957
24961
  getProviderEnvVars: () => getProviderEnvVars,
24958
24962
  getProvidersFor: () => getProvidersFor,
24959
24963
  getSetupProviders: () => getSetupProviders,
@@ -25413,7 +25417,7 @@ function createDefaultConfig() {
25413
25417
  }
25414
25418
  };
25415
25419
  }
25416
- var PROVIDER_NAMES, PROVIDER_ENV_VARS;
25420
+ var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
25417
25421
  var init_schema = __esm({
25418
25422
  "../cli/src/config/schema.ts"() {
25419
25423
  "use strict";
@@ -25427,6 +25431,7 @@ var init_schema = __esm({
25427
25431
  openrouter: "OpenRouter"
25428
25432
  };
25429
25433
  PROVIDER_ENV_VARS = getProviderEnvVars();
25434
+ PROVIDER_ENV_ALIASES = getProviderEnvAliases();
25430
25435
  }
25431
25436
  });
25432
25437
 
@@ -25435,6 +25440,7 @@ var config_exports = {};
25435
25440
  __export(config_exports, {
25436
25441
  CONFIG_DIR: () => CONFIG_DIR,
25437
25442
  CONFIG_PATH: () => CONFIG_PATH,
25443
+ PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
25438
25444
  PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
25439
25445
  PROVIDER_NAMES: () => PROVIDER_NAMES,
25440
25446
  USER_CONFIG_DIR: () => USER_CONFIG_DIR,
@@ -25549,7 +25555,7 @@ async function isConfigured() {
25549
25555
  return true;
25550
25556
  }
25551
25557
  const envVar = PROVIDER_ENV_VARS[providerKey];
25552
- if (envVar && process.env[envVar]) {
25558
+ if (envVar && getEnvValue(envVar)) {
25553
25559
  return true;
25554
25560
  }
25555
25561
  return false;
@@ -25560,9 +25566,12 @@ async function getApiKeyFromConfig(providerKey) {
25560
25566
  return config4.providers[providerKey];
25561
25567
  }
25562
25568
  const envVar = PROVIDER_ENV_VARS[providerKey];
25563
- if (envVar) return process.env[envVar];
25569
+ if (envVar) return getEnvValue(envVar);
25564
25570
  return void 0;
25565
25571
  }
25572
+ function getEnvValue(envVar) {
25573
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25574
+ }
25566
25575
  async function updateProviderKey(providerKey, apiKey, options = {}) {
25567
25576
  const scope = options.scope ?? await getActiveScope(options.cwd);
25568
25577
  let config4 = await loadConfig({ scope, cwd: options.cwd });
@@ -25588,6 +25597,12 @@ var init_config = __esm({
25588
25597
  import { createInterface } from "node:readline";
25589
25598
  import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
25590
25599
  import { resolve as resolve3 } from "node:path";
25600
+ function providerKeyForEnvVar(envVar) {
25601
+ return PROVIDER_KEY_BY_ENV_VAR[envVar];
25602
+ }
25603
+ function getEnvValue2(envVar) {
25604
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25605
+ }
25591
25606
  function loadEnv() {
25592
25607
  (0, import_dotenv.config)({ path: resolve3(process.cwd(), ".env"), debug: false, quiet: true });
25593
25608
  const monorepoRoot = findMonorepoRoot();
@@ -25650,19 +25665,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25650
25665
  if (optionValue) {
25651
25666
  return optionValue;
25652
25667
  }
25653
- const providerKeyMap = {
25654
- ANTHROPIC_API_KEY: "anthropic",
25655
- OPENAI_API_KEY: "openai",
25656
- GOOGLE_API_KEY: "google",
25657
- XAI_API_KEY: "xai",
25658
- ELEVENLABS_API_KEY: "elevenlabs",
25659
- RUNWAY_API_SECRET: "runway",
25660
- KLING_API_KEY: "kling",
25661
- OPENROUTER_API_KEY: "openrouter",
25662
- IMGBB_API_KEY: "imgbb",
25663
- REPLICATE_API_TOKEN: "replicate"
25664
- };
25665
- const providerKey = providerKeyMap[envVar];
25668
+ const providerKey = providerKeyForEnvVar(envVar);
25666
25669
  if (providerKey) {
25667
25670
  const configKey = await getApiKeyFromConfig(providerKey);
25668
25671
  if (configKey) {
@@ -25670,7 +25673,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25670
25673
  }
25671
25674
  }
25672
25675
  loadEnv();
25673
- const envValue = process.env[envVar];
25676
+ const envValue = getEnvValue2(envVar);
25674
25677
  if (envValue) {
25675
25678
  return envValue;
25676
25679
  }
@@ -25696,7 +25699,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25696
25699
  }
25697
25700
  function hasApiKey(envVar) {
25698
25701
  loadEnv();
25699
- return !!process.env[envVar];
25702
+ return !!getEnvValue2(envVar);
25700
25703
  }
25701
25704
  async function requireApiKey(envVar, providerName, cliOverride) {
25702
25705
  const key2 = await getApiKey(envVar, providerName, cliOverride);
@@ -25725,19 +25728,33 @@ async function saveApiKeyToEnv(envVar, apiKey) {
25725
25728
  }
25726
25729
  await writeFile3(envPath, content, "utf-8");
25727
25730
  }
25728
- var import_dotenv, API_KEY_URLS, ApiKeyError;
25731
+ var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
25729
25732
  var init_api_key = __esm({
25730
25733
  "../cli/src/utils/api-key.ts"() {
25731
25734
  "use strict";
25732
25735
  import_dotenv = __toESM(require_main(), 1);
25733
25736
  init_source();
25734
25737
  init_config();
25738
+ PROVIDER_KEY_BY_ENV_VAR = {
25739
+ ANTHROPIC_API_KEY: "anthropic",
25740
+ OPENAI_API_KEY: "openai",
25741
+ GOOGLE_API_KEY: "google",
25742
+ XAI_API_KEY: "xai",
25743
+ ELEVENLABS_API_KEY: "elevenlabs",
25744
+ FAL_API_KEY: "fal",
25745
+ RUNWAY_API_SECRET: "runway",
25746
+ KLING_API_KEY: "kling",
25747
+ OPENROUTER_API_KEY: "openrouter",
25748
+ IMGBB_API_KEY: "imgbb",
25749
+ REPLICATE_API_TOKEN: "replicate"
25750
+ };
25735
25751
  API_KEY_URLS = {
25736
25752
  GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
25737
25753
  OPENAI_API_KEY: "https://platform.openai.com/api-keys",
25738
25754
  ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
25739
25755
  XAI_API_KEY: "https://console.x.ai",
25740
25756
  ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
25757
+ FAL_API_KEY: "https://fal.ai/dashboard/keys",
25741
25758
  RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
25742
25759
  KLING_API_KEY: "https://klingai.com/dev",
25743
25760
  REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
@@ -457798,7 +457815,7 @@ async function loadProviderDefaults() {
457798
457815
  configProviderKeys = null;
457799
457816
  }
457800
457817
  }
457801
- function providerKeyForEnvVar(envVar) {
457818
+ function providerKeyForEnvVar2(envVar) {
457802
457819
  const envVars = getProviderEnvVars();
457803
457820
  for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
457804
457821
  if (candidateEnvVar === envVar) return providerKey;
@@ -457808,7 +457825,7 @@ function providerKeyForEnvVar(envVar) {
457808
457825
  function hasCandidateKey(candidate) {
457809
457826
  if (candidate.envVar === null) return true;
457810
457827
  if (hasApiKey(candidate.envVar)) return true;
457811
- const providerKey = providerKeyForEnvVar(candidate.envVar);
457828
+ const providerKey = providerKeyForEnvVar2(candidate.envVar);
457812
457829
  return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
457813
457830
  }
457814
457831
  function resolveProvider(category) {
@@ -459610,7 +459627,7 @@ function registerVideoCommand(parent) {
459610
459627
  "Provider: seedance (ByteDance Seedance 2.0 via fal.ai), grok, kling, runway, veo. `fal` is a deprecated v0.x alias for seedance and will be removed in 1.0."
459611
459628
  ).option(
459612
459629
  "-k, --api-key <key>",
459613
- "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
459630
+ "API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
459614
459631
  ).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
459615
459632
  "-d, --duration <sec>",
459616
459633
  "Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
@@ -459633,7 +459650,7 @@ function registerVideoCommand(parent) {
459633
459650
  "after",
459634
459651
  `
459635
459652
  Examples:
459636
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
459653
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
459637
459654
  $ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
459638
459655
  $ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
459639
459656
  $ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -459676,7 +459693,7 @@ Examples:
459676
459693
  veo: "GOOGLE_API_KEY",
459677
459694
  kling: "KLING_API_KEY",
459678
459695
  runway: "RUNWAY_API_SECRET",
459679
- seedance: "FAL_KEY"
459696
+ seedance: "FAL_API_KEY"
459680
459697
  };
459681
459698
  let provider;
459682
459699
  if (options.provider) {
@@ -459779,7 +459796,7 @@ Examples:
459779
459796
  kling: "KLING_API_KEY",
459780
459797
  veo: "GOOGLE_API_KEY",
459781
459798
  grok: "XAI_API_KEY",
459782
- seedance: "FAL_KEY"
459799
+ seedance: "FAL_API_KEY"
459783
459800
  };
459784
459801
  const providerNameMap = {
459785
459802
  runway: "Runway",
@@ -460158,7 +460175,7 @@ var init_generate = __esm({
460158
460175
  Examples:
460159
460176
  $ vibe generate image "a sunset over the ocean" -o sunset.png
460160
460177
  $ vibe generate image "logo design" -o logo.png -p openai
460161
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
460178
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
460162
460179
  $ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
460163
460180
  $ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
460164
460181
  $ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -460169,7 +460186,7 @@ Examples:
460169
460186
  API Keys (per provider):
460170
460187
  GOOGLE_API_KEY Image (default), Veo video
460171
460188
  OPENAI_API_KEY Image (-p openai)
460172
- FAL_KEY Seedance video (-p seedance, default video)
460189
+ FAL_API_KEY Seedance video (-p seedance, default video)
460173
460190
  XAI_API_KEY Grok image/video
460174
460191
  KLING_API_KEY Kling video (-p kling)
460175
460192
  RUNWAY_API_SECRET Runway video (-p runway)
@@ -460242,10 +460259,11 @@ async function executeVideoGenerate(options) {
460242
460259
  runway: "RUNWAY_API_SECRET",
460243
460260
  kling: "KLING_API_KEY",
460244
460261
  veo: "GOOGLE_API_KEY",
460245
- seedance: "FAL_KEY",
460246
- fal: "FAL_KEY"
460262
+ seedance: "FAL_API_KEY",
460263
+ fal: "FAL_API_KEY"
460247
460264
  };
460248
- const key2 = apiKey || process.env[envKeyMap[provider] || ""];
460265
+ const envKey = envKeyMap[provider] || "";
460266
+ const key2 = apiKey || (hasApiKey(envKey) ? process.env[envKey] : void 0);
460249
460267
  if (!key2) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
460250
460268
  let referenceImage;
460251
460269
  let referenceImageBuffer;
@@ -460642,6 +460660,7 @@ var init_ai_video = __esm({
460642
460660
  init_dist();
460643
460661
  init_upload_host();
460644
460662
  init_ai_helpers();
460663
+ init_api_key();
460645
460664
  }
460646
460665
  });
460647
460666
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.92.0",
3
+ "version": "0.94.0",
4
4
  "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,8 +57,8 @@
57
57
  "tsx": "^4.21.0",
58
58
  "typescript": "^5.3.3",
59
59
  "vitest": "^1.2.2",
60
- "@vibeframe/core": "0.92.0",
61
- "@vibeframe/cli": "0.92.0"
60
+ "@vibeframe/core": "0.94.0",
61
+ "@vibeframe/cli": "0.94.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"