@vibeframe/mcp-server 0.92.0 → 0.93.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 +55 -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,8 @@ var init_api_keys = __esm({
14103
14106
  });
14104
14107
  defineApiKey({
14105
14108
  configKey: "fal",
14106
- envVar: "FAL_KEY",
14109
+ envVar: "FAL_API_KEY",
14110
+ envAliases: ["FAL_KEY"],
14107
14111
  label: "fal.ai",
14108
14112
  showInSetup: true,
14109
14113
  setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
@@ -14120,7 +14124,7 @@ var init_api_keys = __esm({
14120
14124
  label: "xAI",
14121
14125
  showInSetup: true,
14122
14126
  setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14123
- envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14127
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
14124
14128
  envExampleUrl: "https://console.x.ai/",
14125
14129
  keyFormat: { prefix: /^xai-/, example: "xai-..." }
14126
14130
  });
@@ -24177,7 +24181,7 @@ var init_FalProvider = __esm({
24177
24181
  return {
24178
24182
  id: "",
24179
24183
  status: "failed",
24180
- error: "fal.ai API key not configured. Set FAL_KEY in .env."
24184
+ error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
24181
24185
  };
24182
24186
  }
24183
24187
  const variant = options?.model ?? DEFAULT_VARIANT;
@@ -24954,6 +24958,7 @@ __export(dist_exports, {
24954
24958
  getCommandKeyMap: () => getCommandKeyMap,
24955
24959
  getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
24956
24960
  getKeyFormat: () => getKeyFormat,
24961
+ getProviderEnvAliases: () => getProviderEnvAliases,
24957
24962
  getProviderEnvVars: () => getProviderEnvVars,
24958
24963
  getProvidersFor: () => getProvidersFor,
24959
24964
  getSetupProviders: () => getSetupProviders,
@@ -25413,7 +25418,7 @@ function createDefaultConfig() {
25413
25418
  }
25414
25419
  };
25415
25420
  }
25416
- var PROVIDER_NAMES, PROVIDER_ENV_VARS;
25421
+ var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
25417
25422
  var init_schema = __esm({
25418
25423
  "../cli/src/config/schema.ts"() {
25419
25424
  "use strict";
@@ -25427,6 +25432,7 @@ var init_schema = __esm({
25427
25432
  openrouter: "OpenRouter"
25428
25433
  };
25429
25434
  PROVIDER_ENV_VARS = getProviderEnvVars();
25435
+ PROVIDER_ENV_ALIASES = getProviderEnvAliases();
25430
25436
  }
25431
25437
  });
25432
25438
 
@@ -25435,6 +25441,7 @@ var config_exports = {};
25435
25441
  __export(config_exports, {
25436
25442
  CONFIG_DIR: () => CONFIG_DIR,
25437
25443
  CONFIG_PATH: () => CONFIG_PATH,
25444
+ PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
25438
25445
  PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
25439
25446
  PROVIDER_NAMES: () => PROVIDER_NAMES,
25440
25447
  USER_CONFIG_DIR: () => USER_CONFIG_DIR,
@@ -25549,7 +25556,7 @@ async function isConfigured() {
25549
25556
  return true;
25550
25557
  }
25551
25558
  const envVar = PROVIDER_ENV_VARS[providerKey];
25552
- if (envVar && process.env[envVar]) {
25559
+ if (envVar && getEnvValue(envVar)) {
25553
25560
  return true;
25554
25561
  }
25555
25562
  return false;
@@ -25560,9 +25567,12 @@ async function getApiKeyFromConfig(providerKey) {
25560
25567
  return config4.providers[providerKey];
25561
25568
  }
25562
25569
  const envVar = PROVIDER_ENV_VARS[providerKey];
25563
- if (envVar) return process.env[envVar];
25570
+ if (envVar) return getEnvValue(envVar);
25564
25571
  return void 0;
25565
25572
  }
25573
+ function getEnvValue(envVar) {
25574
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25575
+ }
25566
25576
  async function updateProviderKey(providerKey, apiKey, options = {}) {
25567
25577
  const scope = options.scope ?? await getActiveScope(options.cwd);
25568
25578
  let config4 = await loadConfig({ scope, cwd: options.cwd });
@@ -25588,6 +25598,12 @@ var init_config = __esm({
25588
25598
  import { createInterface } from "node:readline";
25589
25599
  import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
25590
25600
  import { resolve as resolve3 } from "node:path";
25601
+ function providerKeyForEnvVar(envVar) {
25602
+ return PROVIDER_KEY_BY_ENV_VAR[envVar];
25603
+ }
25604
+ function getEnvValue2(envVar) {
25605
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25606
+ }
25591
25607
  function loadEnv() {
25592
25608
  (0, import_dotenv.config)({ path: resolve3(process.cwd(), ".env"), debug: false, quiet: true });
25593
25609
  const monorepoRoot = findMonorepoRoot();
@@ -25650,19 +25666,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25650
25666
  if (optionValue) {
25651
25667
  return optionValue;
25652
25668
  }
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];
25669
+ const providerKey = providerKeyForEnvVar(envVar);
25666
25670
  if (providerKey) {
25667
25671
  const configKey = await getApiKeyFromConfig(providerKey);
25668
25672
  if (configKey) {
@@ -25670,7 +25674,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25670
25674
  }
25671
25675
  }
25672
25676
  loadEnv();
25673
- const envValue = process.env[envVar];
25677
+ const envValue = getEnvValue2(envVar);
25674
25678
  if (envValue) {
25675
25679
  return envValue;
25676
25680
  }
@@ -25696,7 +25700,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25696
25700
  }
25697
25701
  function hasApiKey(envVar) {
25698
25702
  loadEnv();
25699
- return !!process.env[envVar];
25703
+ return !!getEnvValue2(envVar);
25700
25704
  }
25701
25705
  async function requireApiKey(envVar, providerName, cliOverride) {
25702
25706
  const key2 = await getApiKey(envVar, providerName, cliOverride);
@@ -25725,19 +25729,35 @@ async function saveApiKeyToEnv(envVar, apiKey) {
25725
25729
  }
25726
25730
  await writeFile3(envPath, content, "utf-8");
25727
25731
  }
25728
- var import_dotenv, API_KEY_URLS, ApiKeyError;
25732
+ var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
25729
25733
  var init_api_key = __esm({
25730
25734
  "../cli/src/utils/api-key.ts"() {
25731
25735
  "use strict";
25732
25736
  import_dotenv = __toESM(require_main(), 1);
25733
25737
  init_source();
25734
25738
  init_config();
25739
+ PROVIDER_KEY_BY_ENV_VAR = {
25740
+ ANTHROPIC_API_KEY: "anthropic",
25741
+ OPENAI_API_KEY: "openai",
25742
+ GOOGLE_API_KEY: "google",
25743
+ XAI_API_KEY: "xai",
25744
+ ELEVENLABS_API_KEY: "elevenlabs",
25745
+ FAL_API_KEY: "fal",
25746
+ FAL_KEY: "fal",
25747
+ RUNWAY_API_SECRET: "runway",
25748
+ KLING_API_KEY: "kling",
25749
+ OPENROUTER_API_KEY: "openrouter",
25750
+ IMGBB_API_KEY: "imgbb",
25751
+ REPLICATE_API_TOKEN: "replicate"
25752
+ };
25735
25753
  API_KEY_URLS = {
25736
25754
  GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
25737
25755
  OPENAI_API_KEY: "https://platform.openai.com/api-keys",
25738
25756
  ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
25739
25757
  XAI_API_KEY: "https://console.x.ai",
25740
25758
  ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
25759
+ FAL_API_KEY: "https://fal.ai/dashboard/keys",
25760
+ FAL_KEY: "https://fal.ai/dashboard/keys",
25741
25761
  RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
25742
25762
  KLING_API_KEY: "https://klingai.com/dev",
25743
25763
  REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
@@ -457798,7 +457818,7 @@ async function loadProviderDefaults() {
457798
457818
  configProviderKeys = null;
457799
457819
  }
457800
457820
  }
457801
- function providerKeyForEnvVar(envVar) {
457821
+ function providerKeyForEnvVar2(envVar) {
457802
457822
  const envVars = getProviderEnvVars();
457803
457823
  for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
457804
457824
  if (candidateEnvVar === envVar) return providerKey;
@@ -457808,7 +457828,7 @@ function providerKeyForEnvVar(envVar) {
457808
457828
  function hasCandidateKey(candidate) {
457809
457829
  if (candidate.envVar === null) return true;
457810
457830
  if (hasApiKey(candidate.envVar)) return true;
457811
- const providerKey = providerKeyForEnvVar(candidate.envVar);
457831
+ const providerKey = providerKeyForEnvVar2(candidate.envVar);
457812
457832
  return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
457813
457833
  }
457814
457834
  function resolveProvider(category) {
@@ -459610,7 +459630,7 @@ function registerVideoCommand(parent) {
459610
459630
  "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
459631
  ).option(
459612
459632
  "-k, --api-key <key>",
459613
- "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
459633
+ "API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
459614
459634
  ).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
459615
459635
  "-d, --duration <sec>",
459616
459636
  "Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
@@ -459633,7 +459653,7 @@ function registerVideoCommand(parent) {
459633
459653
  "after",
459634
459654
  `
459635
459655
  Examples:
459636
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
459656
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
459637
459657
  $ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
459638
459658
  $ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
459639
459659
  $ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -459676,7 +459696,7 @@ Examples:
459676
459696
  veo: "GOOGLE_API_KEY",
459677
459697
  kling: "KLING_API_KEY",
459678
459698
  runway: "RUNWAY_API_SECRET",
459679
- seedance: "FAL_KEY"
459699
+ seedance: "FAL_API_KEY"
459680
459700
  };
459681
459701
  let provider;
459682
459702
  if (options.provider) {
@@ -459779,7 +459799,7 @@ Examples:
459779
459799
  kling: "KLING_API_KEY",
459780
459800
  veo: "GOOGLE_API_KEY",
459781
459801
  grok: "XAI_API_KEY",
459782
- seedance: "FAL_KEY"
459802
+ seedance: "FAL_API_KEY"
459783
459803
  };
459784
459804
  const providerNameMap = {
459785
459805
  runway: "Runway",
@@ -460158,7 +460178,7 @@ var init_generate = __esm({
460158
460178
  Examples:
460159
460179
  $ vibe generate image "a sunset over the ocean" -o sunset.png
460160
460180
  $ 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
460181
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
460162
460182
  $ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
460163
460183
  $ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
460164
460184
  $ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -460169,7 +460189,7 @@ Examples:
460169
460189
  API Keys (per provider):
460170
460190
  GOOGLE_API_KEY Image (default), Veo video
460171
460191
  OPENAI_API_KEY Image (-p openai)
460172
- FAL_KEY Seedance video (-p seedance, default video)
460192
+ FAL_API_KEY Seedance video (-p seedance, default video)
460173
460193
  XAI_API_KEY Grok image/video
460174
460194
  KLING_API_KEY Kling video (-p kling)
460175
460195
  RUNWAY_API_SECRET Runway video (-p runway)
@@ -460242,10 +460262,11 @@ async function executeVideoGenerate(options) {
460242
460262
  runway: "RUNWAY_API_SECRET",
460243
460263
  kling: "KLING_API_KEY",
460244
460264
  veo: "GOOGLE_API_KEY",
460245
- seedance: "FAL_KEY",
460246
- fal: "FAL_KEY"
460265
+ seedance: "FAL_API_KEY",
460266
+ fal: "FAL_API_KEY"
460247
460267
  };
460248
- const key2 = apiKey || process.env[envKeyMap[provider] || ""];
460268
+ const envKey = envKeyMap[provider] || "";
460269
+ const key2 = apiKey || (hasApiKey(envKey) ? process.env[envKey] || (envKey === "FAL_API_KEY" ? process.env.FAL_KEY : void 0) : void 0);
460249
460270
  if (!key2) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
460250
460271
  let referenceImage;
460251
460272
  let referenceImageBuffer;
@@ -460642,6 +460663,7 @@ var init_ai_video = __esm({
460642
460663
  init_dist();
460643
460664
  init_upload_host();
460644
460665
  init_ai_helpers();
460666
+ init_api_key();
460645
460667
  }
460646
460668
  });
460647
460669
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.92.0",
3
+ "version": "0.93.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.93.0",
61
+ "@vibeframe/cli": "0.93.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"