aimakeall-mcp 0.5.0 → 0.6.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/README.md +3 -2
- package/lib/cloud-tools.mjs +21 -3
- package/lib/config.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Claude Code·Codex 같은 MCP 클라이언트에서 자연어로 AImakeAll 영
|
|
|
16
16
|
"mcpServers": {
|
|
17
17
|
"aimakeall": {
|
|
18
18
|
"command": "npx",
|
|
19
|
-
"args": ["-y", "aimakeall-mcp@0.
|
|
19
|
+
"args": ["-y", "aimakeall-mcp@0.6.0"],
|
|
20
20
|
"env": { "AIMAKEALL_PAT": "aio_pat_..." }
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -36,7 +36,7 @@ Claude Code·Codex 같은 MCP 클라이언트에서 자연어로 AImakeAll 영
|
|
|
36
36
|
|
|
37
37
|
```
|
|
38
38
|
plan_shorts_video → (씬마다) generate_scene_image → generate_scene_video_prompt → generate_scene_video
|
|
39
|
-
→ (보이스 미지정 시) recommend_voice → tts_narration → stitch_timeline → render_start → render_status(폴링) → render_result
|
|
39
|
+
→ (보이스 미지정 시) recommend_voice → tts_narration_with_captions(하단자막·강조용) 또는 tts_narration → stitch_timeline → render_start → render_status(폴링) → render_result
|
|
40
40
|
→ ai_publish_metadata → publish_youtube
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -44,6 +44,7 @@ plan_shorts_video → (씬마다) generate_scene_image → generate_scene_video_
|
|
|
44
44
|
- 렌더 잡은 `~/.aimakeall/render-jobs.json`에 기록되어 프록시 재시작 후 `list_render_jobs`로 복구할 수 있습니다.
|
|
45
45
|
- 대용량 산출물(TTS mp3, 스티치 매니페스트)은 파일 경로로 주고받아 모델 컨텍스트를 오염시키지 않습니다.
|
|
46
46
|
- `recommend_voice`는 주제·샘플 영상(유튜브)에 맞는 보이스를 자동 선정합니다 — 샘플 화자 분석은 컴패니언 앱이 실행 중일 때만 동작합니다.
|
|
47
|
+
- 하단자막 강조: `tts_narration_with_captions`의 `subtitleLines`와 `plan_shorts_video`의 `emphasisKeywords`를 `stitch_timeline`에 함께 넘기면 자막 안 해당 단어만 노랑/큰 글씨로 강조됩니다(최신 컴패니언 런타임 필요 — 구버전은 일반 자막으로 안전 강등).
|
|
47
48
|
|
|
48
49
|
## 한도
|
|
49
50
|
|
package/lib/cloud-tools.mjs
CHANGED
|
@@ -150,7 +150,7 @@ export function registerCloudTools(server, config, api) {
|
|
|
150
150
|
|
|
151
151
|
server.tool(
|
|
152
152
|
"plan_shorts_video",
|
|
153
|
-
"쇼츠 영상 기획(시나리오·씬별 이미지 프롬프트·내레이션)을 생성합니다. topic 또는 copy 중 하나는 필수. 결과 scenes의 imagePrompt는 generate_scene_image로, skill은 씬 영상 프롬프트의 videoStylePreset
|
|
153
|
+
"쇼츠 영상 기획(시나리오·씬별 이미지 프롬프트·내레이션)을 생성합니다. topic 또는 copy 중 하나는 필수. 결과 scenes의 imagePrompt는 generate_scene_image로, skill은 씬 영상 프롬프트의 videoStylePreset으로, emphasisKeywords는 stitch_timeline의 emphasisKeywords로 이어집니다(하단자막 단어 강조).",
|
|
154
154
|
{
|
|
155
155
|
topic: z.string().optional().describe("영상 주제"),
|
|
156
156
|
copy: z.string().optional().describe("핵심 카피/대사"),
|
|
@@ -180,6 +180,7 @@ export function registerCloudTools(server, config, api) {
|
|
|
180
180
|
});
|
|
181
181
|
return jsonResult({
|
|
182
182
|
ctaText: payload?.ctaText,
|
|
183
|
+
emphasisKeywords: Array.isArray(payload?.emphasisKeywords) ? payload.emphasisKeywords : [],
|
|
183
184
|
narrationScript: payload?.narrationScript,
|
|
184
185
|
ok: payload?.ok,
|
|
185
186
|
scenes: trimPlanScenes(payload?.scenes),
|
|
@@ -579,7 +580,7 @@ export function registerCloudTools(server, config, api) {
|
|
|
579
580
|
|
|
580
581
|
server.tool(
|
|
581
582
|
"stitch_timeline",
|
|
582
|
-
"씬 영상들과 오디오를 서버에서 타임라인 매니페스트로 합칩니다. 결과는 파일 핸들(payloadPath)로 반환되며, 이를 render_start에 넘기면 이 PC에서 mp4가 렌더됩니다. 서버는 렌더하지 않습니다.",
|
|
583
|
+
"씬 영상들과 오디오를 서버에서 타임라인 매니페스트로 합칩니다. 결과는 파일 핸들(payloadPath)로 반환되며, 이를 render_start에 넘기면 이 PC에서 mp4가 렌더됩니다. 서버는 렌더하지 않습니다. 하단자막 강조: emphasisKeywords 를 주면 자막 라인 안의 해당 단어만 다른 색/크기로 강조되고, subtitleLines[].style 로 라인별 디자인도 바꿀 수 있습니다.",
|
|
583
584
|
{
|
|
584
585
|
sceneVideos: z.array(z.object({
|
|
585
586
|
durationSec: z.number(),
|
|
@@ -600,10 +601,24 @@ export function registerCloudTools(server, config, api) {
|
|
|
600
601
|
endSec: z.number(),
|
|
601
602
|
startSec: z.number(),
|
|
602
603
|
text: z.string(),
|
|
604
|
+
style: z.object({
|
|
605
|
+
fontSize: z.number().optional(),
|
|
606
|
+
fontWeight: z.enum(["bold", "normal"]).optional(),
|
|
607
|
+
strokeColor: z.string().regex(/^#[0-9a-fA-F]{6}$/, "#RRGGBB 형식").optional(),
|
|
608
|
+
strokeWidth: z.number().optional(),
|
|
609
|
+
textBackgroundColor: z.string().regex(/^#[0-9a-fA-F]{6}$/, "#RRGGBB 형식").optional(),
|
|
610
|
+
textBackgroundEnabled: z.boolean().optional(),
|
|
611
|
+
textBackgroundOpacity: z.number().optional(),
|
|
612
|
+
textColor: z.string().regex(/^#[0-9a-fA-F]{6}$/, "#RRGGBB 형식").optional(),
|
|
613
|
+
textEffectVariant: z.string().optional(),
|
|
614
|
+
}).optional().describe("이 라인만의 디자인 오버라이드 (내용에 따라 라인별 디자인을 달리할 때)"),
|
|
603
615
|
})).optional().describe("자막 타이밍 (쇼츠 하단자막) — tts_narration_with_captions의 subtitleLines를 그대로 사용"),
|
|
616
|
+
emphasisKeywords: z.array(z.string()).max(12).optional().describe("강조 단어 목록 — 자막 라인 안에서 해당 단어만 다른 색/크기로 렌더 (plan_shorts_video의 emphasisKeywords 를 그대로 전달)"),
|
|
617
|
+
emphasisColor: z.string().regex(/^#[0-9a-fA-F]{6}$/, "#RRGGBB 형식").optional().describe("강조 색 #RRGGBB (기본 #facc15 노랑)"),
|
|
618
|
+
emphasisSizeScale: z.number().optional().describe("강조 크기 배율 0.5~2 (기본 1.2)"),
|
|
604
619
|
transitionMode: z.enum(["fade", "none"]).optional().describe("기본 fade"),
|
|
605
620
|
},
|
|
606
|
-
wrapCloudHandler(config, async ({ sceneVideos, featureKey = "commerceVideo", projectTitle = "aimakeall-mcp", aspectRatio = "9:16", ttsAudioPath = "", bgmAudioPath = "", audioDurationSec = 0, bgmVolume = null, muteVideoAudio = true, titleText = "", subtitleLines = [], transitionMode = "fade" }) => {
|
|
621
|
+
wrapCloudHandler(config, async ({ sceneVideos, featureKey = "commerceVideo", projectTitle = "aimakeall-mcp", aspectRatio = "9:16", ttsAudioPath = "", bgmAudioPath = "", audioDurationSec = 0, bgmVolume = null, muteVideoAudio = true, titleText = "", subtitleLines = [], emphasisKeywords = [], emphasisColor = "", emphasisSizeScale = 0, transitionMode = "fade" }) => {
|
|
607
622
|
// 오디오 확장자 검증 + 합산 크기 예산(서버 413 사전 차단).
|
|
608
623
|
if (ttsAudioPath) assertAllowedInputFile(ttsAudioPath, new Set([".mp3", ".wav"]), { kind: "TTS 오디오" });
|
|
609
624
|
if (bgmAudioPath) assertAllowedInputFile(bgmAudioPath, new Set([".mp3", ".wav"]), { kind: "BGM 오디오" });
|
|
@@ -626,6 +641,9 @@ export function registerCloudTools(server, config, api) {
|
|
|
626
641
|
label: scene.label || `scene-${index + 1}`,
|
|
627
642
|
url: scene.url,
|
|
628
643
|
})),
|
|
644
|
+
emphasisColor,
|
|
645
|
+
emphasisKeywords,
|
|
646
|
+
emphasisSizeScale,
|
|
629
647
|
subtitleLines,
|
|
630
648
|
titleText,
|
|
631
649
|
transitionMode,
|
package/lib/config.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
|
|
4
4
|
// 프록시 버전 — 서버가 X-AImakeAll-MCP-Version 으로 하한을 강제(426)할 수 있다.
|
|
5
|
-
export const MCP_PROXY_VERSION = "0.
|
|
5
|
+
export const MCP_PROXY_VERSION = "0.6.0";
|
|
6
6
|
|
|
7
7
|
export const DEFAULT_API_BASE = "https://aimakeall.com";
|
|
8
8
|
export const DEFAULT_COMPANION_URL = "http://127.0.0.1:9876";
|