@vibeframe/mcp-server 0.104.1 → 0.104.2
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/index.js +44 -31
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -7688,6 +7688,25 @@ consult this file \u2014 run the generate command directly.
|
|
|
7688
7688
|
Browse named styles: \`vibe scene list-styles\`. Re-seed from one with
|
|
7689
7689
|
\`vibe scene init . --visual-style "Swiss Pulse"\` (idempotent).
|
|
7690
7690
|
|
|
7691
|
+
## Provider keys and project scope
|
|
7692
|
+
|
|
7693
|
+
Use VibeFrame CLI generation for project assets:
|
|
7694
|
+
\`vibe generate image|video|speech ...\`. This lets VibeFrame use keys
|
|
7695
|
+
from \`vibe setup --scope project\`.
|
|
7696
|
+
|
|
7697
|
+
Project-scope keys may live in a parent directory, for example
|
|
7698
|
+
\`../.vibeframe/config.yaml\` when this scene was created by
|
|
7699
|
+
\`vibe init launch\`. The \`vibe\` CLI searches upward automatically, so do
|
|
7700
|
+
not decide keys are missing just because \`.vibeframe/config.yaml\` is not
|
|
7701
|
+
inside this scene folder.
|
|
7702
|
+
|
|
7703
|
+
To verify scope without exposing secrets, run \`vibe doctor --json\` from
|
|
7704
|
+
this directory and inspect \`data.scope.activeScope\` plus
|
|
7705
|
+
\`data.scope.project.configPath\`. Never print config contents. Do not use
|
|
7706
|
+
a host agent's built-in image/audio generation tool for VibeFrame project
|
|
7707
|
+
assets unless the user explicitly requests an external, non-VibeFrame
|
|
7708
|
+
asset.
|
|
7709
|
+
|
|
7691
7710
|
## Skills \u2014 USE THESE FIRST
|
|
7692
7711
|
|
|
7693
7712
|
@SKILL.md
|
|
@@ -25916,21 +25935,8 @@ async function prompt(question, hidden = false) {
|
|
|
25916
25935
|
});
|
|
25917
25936
|
}
|
|
25918
25937
|
async function getApiKey(envVar, providerName, optionValue) {
|
|
25919
|
-
|
|
25920
|
-
|
|
25921
|
-
}
|
|
25922
|
-
const providerKey = providerKeyForEnvVar(envVar);
|
|
25923
|
-
if (providerKey) {
|
|
25924
|
-
const configKey = await getApiKeyFromConfig(providerKey);
|
|
25925
|
-
if (configKey) {
|
|
25926
|
-
return configKey;
|
|
25927
|
-
}
|
|
25928
|
-
}
|
|
25929
|
-
loadEnv();
|
|
25930
|
-
const envValue = getEnvValue2(envVar);
|
|
25931
|
-
if (envValue) {
|
|
25932
|
-
return envValue;
|
|
25933
|
-
}
|
|
25938
|
+
const configuredKey = await getConfiguredApiKey(envVar, optionValue);
|
|
25939
|
+
if (configuredKey) return configuredKey;
|
|
25934
25940
|
if (!process.stdin.isTTY) {
|
|
25935
25941
|
return null;
|
|
25936
25942
|
}
|
|
@@ -25951,6 +25957,19 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25951
25957
|
}
|
|
25952
25958
|
return apiKey.trim();
|
|
25953
25959
|
}
|
|
25960
|
+
async function getConfiguredApiKey(envVar, optionValue, options = {}) {
|
|
25961
|
+
if (optionValue) return optionValue;
|
|
25962
|
+
const providerKey = providerKeyForEnvVar(envVar);
|
|
25963
|
+
if (providerKey) {
|
|
25964
|
+
const configKey = await getApiKeyFromConfig(providerKey, { cwd: options.cwd });
|
|
25965
|
+
if (configKey) return configKey;
|
|
25966
|
+
}
|
|
25967
|
+
loadEnv();
|
|
25968
|
+
return getEnvValue2(envVar);
|
|
25969
|
+
}
|
|
25970
|
+
async function hasConfiguredApiKey(envVar, optionValue, options = {}) {
|
|
25971
|
+
return Boolean(await getConfiguredApiKey(envVar, optionValue, options));
|
|
25972
|
+
}
|
|
25954
25973
|
function hasApiKey(envVar) {
|
|
25955
25974
|
loadEnv();
|
|
25956
25975
|
return !!getEnvValue2(envVar);
|
|
@@ -26047,7 +26066,7 @@ var init_api_key = __esm({
|
|
|
26047
26066
|
|
|
26048
26067
|
// ../cli/src/commands/_shared/tts-resolve.ts
|
|
26049
26068
|
async function resolveTtsProvider(preferred = "auto") {
|
|
26050
|
-
const choice = preferred === "auto" ?
|
|
26069
|
+
const choice = preferred === "auto" ? await getConfiguredApiKey("ELEVENLABS_API_KEY") ? "elevenlabs" : "kokoro" : preferred;
|
|
26051
26070
|
if (choice === "elevenlabs") {
|
|
26052
26071
|
return buildElevenLabs();
|
|
26053
26072
|
}
|
|
@@ -26091,7 +26110,6 @@ var init_tts_resolve = __esm({
|
|
|
26091
26110
|
"use strict";
|
|
26092
26111
|
init_dist();
|
|
26093
26112
|
init_api_key();
|
|
26094
|
-
init_api_key();
|
|
26095
26113
|
TtsKeyMissingError = class extends Error {
|
|
26096
26114
|
constructor(provider) {
|
|
26097
26115
|
super(
|
|
@@ -452436,7 +452454,7 @@ async function executeVideoGenerate(options) {
|
|
|
452436
452454
|
fal: "FAL_API_KEY"
|
|
452437
452455
|
};
|
|
452438
452456
|
const envKey = envKeyMap[provider] || "";
|
|
452439
|
-
const key2 =
|
|
452457
|
+
const key2 = await getConfiguredApiKey(envKey, apiKey);
|
|
452440
452458
|
if (!key2) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
|
|
452441
452459
|
let referenceImage;
|
|
452442
452460
|
let referenceImageBuffer;
|
|
@@ -452868,7 +452886,7 @@ var init_validate = __esm({
|
|
|
452868
452886
|
// ../cli/src/commands/generate/music-status.ts
|
|
452869
452887
|
async function executeMusicStatus(options) {
|
|
452870
452888
|
try {
|
|
452871
|
-
const apiKey =
|
|
452889
|
+
const apiKey = await getConfiguredApiKey("REPLICATE_API_TOKEN", options.apiKey);
|
|
452872
452890
|
if (!apiKey)
|
|
452873
452891
|
return { success: false, error: "REPLICATE_API_TOKEN required for music status" };
|
|
452874
452892
|
const replicate = new ReplicateProvider();
|
|
@@ -452941,7 +452959,6 @@ var init_music_status = __esm({
|
|
|
452941
452959
|
init_source();
|
|
452942
452960
|
init_dist();
|
|
452943
452961
|
init_api_key();
|
|
452944
|
-
init_config();
|
|
452945
452962
|
init_output();
|
|
452946
452963
|
}
|
|
452947
452964
|
});
|
|
@@ -453741,7 +453758,7 @@ async function executeMusic(options) {
|
|
|
453741
453758
|
try {
|
|
453742
453759
|
const provider = options.provider || "elevenlabs";
|
|
453743
453760
|
if (provider === "elevenlabs") {
|
|
453744
|
-
const apiKey2 =
|
|
453761
|
+
const apiKey2 = await getConfiguredApiKey("ELEVENLABS_API_KEY");
|
|
453745
453762
|
if (!apiKey2)
|
|
453746
453763
|
return {
|
|
453747
453764
|
success: false,
|
|
@@ -453761,7 +453778,7 @@ async function executeMusic(options) {
|
|
|
453761
453778
|
await writeFile18(outputPath2, result2.audioBuffer);
|
|
453762
453779
|
return { success: true, outputPath: outputPath2, provider: "elevenlabs", duration: duration2 };
|
|
453763
453780
|
}
|
|
453764
|
-
const apiKey =
|
|
453781
|
+
const apiKey = await getConfiguredApiKey("REPLICATE_API_TOKEN");
|
|
453765
453782
|
if (!apiKey)
|
|
453766
453783
|
return {
|
|
453767
453784
|
success: false,
|
|
@@ -453996,7 +454013,6 @@ var init_music = __esm({
|
|
|
453996
454013
|
init_ora();
|
|
453997
454014
|
init_dist();
|
|
453998
454015
|
init_api_key();
|
|
453999
|
-
init_config();
|
|
454000
454016
|
init_output();
|
|
454001
454017
|
init_validate();
|
|
454002
454018
|
init_status_jobs();
|
|
@@ -462409,7 +462425,7 @@ import { resolve as resolve54 } from "node:path";
|
|
|
462409
462425
|
import { writeFile as writeFile32 } from "node:fs/promises";
|
|
462410
462426
|
async function executeSoundEffect(options) {
|
|
462411
462427
|
try {
|
|
462412
|
-
const apiKey =
|
|
462428
|
+
const apiKey = await getConfiguredApiKey("ELEVENLABS_API_KEY");
|
|
462413
462429
|
if (!apiKey)
|
|
462414
462430
|
return {
|
|
462415
462431
|
success: false,
|
|
@@ -462508,7 +462524,6 @@ var init_sound_effect = __esm({
|
|
|
462508
462524
|
init_ora();
|
|
462509
462525
|
init_dist();
|
|
462510
462526
|
init_api_key();
|
|
462511
|
-
init_config();
|
|
462512
462527
|
init_output();
|
|
462513
462528
|
init_validate();
|
|
462514
462529
|
}
|
|
@@ -462590,7 +462605,7 @@ import { resolve as resolve55, dirname as dirname30 } from "node:path";
|
|
|
462590
462605
|
import { writeFile as writeFile33, mkdir as mkdir23 } from "node:fs/promises";
|
|
462591
462606
|
async function executeBackground(options) {
|
|
462592
462607
|
try {
|
|
462593
|
-
const apiKey =
|
|
462608
|
+
const apiKey = await getConfiguredApiKey("OPENAI_API_KEY", options.apiKey);
|
|
462594
462609
|
if (!apiKey)
|
|
462595
462610
|
return { success: false, error: "OPENAI_API_KEY required for background generation" };
|
|
462596
462611
|
const openaiImage = new OpenAIImageProvider();
|
|
@@ -462721,7 +462736,6 @@ var init_background = __esm({
|
|
|
462721
462736
|
init_ora();
|
|
462722
462737
|
init_dist();
|
|
462723
462738
|
init_api_key();
|
|
462724
|
-
init_config();
|
|
462725
462739
|
init_output();
|
|
462726
462740
|
init_validate();
|
|
462727
462741
|
}
|
|
@@ -462962,7 +462976,7 @@ import { resolve as resolve57 } from "node:path";
|
|
|
462962
462976
|
import { writeFile as writeFile35 } from "node:fs/promises";
|
|
462963
462977
|
async function executeSpeech(options) {
|
|
462964
462978
|
try {
|
|
462965
|
-
const apiKey =
|
|
462979
|
+
const apiKey = await getConfiguredApiKey("ELEVENLABS_API_KEY");
|
|
462966
462980
|
if (!apiKey)
|
|
462967
462981
|
return {
|
|
462968
462982
|
success: false,
|
|
@@ -463177,7 +463191,6 @@ var init_speech = __esm({
|
|
|
463177
463191
|
init_dist();
|
|
463178
463192
|
init_api_key();
|
|
463179
463193
|
init_tty();
|
|
463180
|
-
init_config();
|
|
463181
463194
|
init_output();
|
|
463182
463195
|
init_validate();
|
|
463183
463196
|
}
|
|
@@ -463978,7 +463991,7 @@ Examples:
|
|
|
463978
463991
|
)
|
|
463979
463992
|
);
|
|
463980
463993
|
}
|
|
463981
|
-
if (providerEnvMap[provider] && !
|
|
463994
|
+
if (providerEnvMap[provider] && !await hasConfiguredApiKey(providerEnvMap[provider], options.apiKey)) {
|
|
463982
463995
|
const resolved = resolveProvider("image");
|
|
463983
463996
|
if (resolved) {
|
|
463984
463997
|
log(source_default.dim(` ${provider} key not found. Using ${resolved.label} instead.`));
|
|
@@ -465418,7 +465431,7 @@ Examples:
|
|
|
465418
465431
|
);
|
|
465419
465432
|
provider = "seedance";
|
|
465420
465433
|
}
|
|
465421
|
-
if (videoEnvMap[provider] && !
|
|
465434
|
+
if (videoEnvMap[provider] && !await hasConfiguredApiKey(videoEnvMap[provider], options.apiKey)) {
|
|
465422
465435
|
const resolved = resolveProvider("video");
|
|
465423
465436
|
if (resolved) {
|
|
465424
465437
|
log(source_default.dim(` ${provider} key not found. Using ${resolved.label} instead.`));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/mcp-server",
|
|
3
|
-
"version": "0.104.
|
|
3
|
+
"version": "0.104.2",
|
|
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/
|
|
61
|
-
"@vibeframe/
|
|
60
|
+
"@vibeframe/core": "0.104.2",
|
|
61
|
+
"@vibeframe/cli": "0.104.2"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|