@mirrai/mcp-server 0.1.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.
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Carousel (카드뉴스) Tools - 6 tools
3
+ *
4
+ * Core tools for generating, rendering, and editing carousel content.
5
+ */
6
+ import { z } from 'zod';
7
+ export function registerCarouselTools(server, api, sse) {
8
+ // 1. Generate carousel
9
+ server.tool('carousel_generate', 'Generate a carousel (card news) from a topic or content. Returns the generated pages with HTML.', {
10
+ content: z.string().describe('Topic or content to generate carousel from'),
11
+ aspectRatio: z.enum(['1:1', '4:5', '16:9', '9:16', '3:4']).default('1:1').describe('Aspect ratio'),
12
+ slideCount: z.number().min(2).max(15).default(5).describe('Number of slides'),
13
+ mode: z.enum(['follow', 'creative']).default('creative').describe('Generation mode: follow (structured) or creative (freeform)'),
14
+ presetId: z.string().optional().describe('Preset template ID to use'),
15
+ customPrompt: z.string().optional().describe('Additional instructions for generation'),
16
+ enableImageSearch: z.boolean().default(true).describe('Auto-search and insert images'),
17
+ }, async (params) => {
18
+ try {
19
+ const result = await sse.consumeCarouselGeneration({
20
+ content: params.content,
21
+ aspectRatio: params.aspectRatio,
22
+ slideCount: params.slideCount,
23
+ mode: params.mode,
24
+ presetId: params.presetId,
25
+ customPrompt: params.customPrompt,
26
+ enableImageSearch: params.enableImageSearch,
27
+ });
28
+ return {
29
+ content: [{
30
+ type: 'text',
31
+ text: JSON.stringify({
32
+ generationId: result.generationId,
33
+ pageCount: result.pages.length,
34
+ pages: result.pages.map(p => ({
35
+ pageNumber: p.pageNumber,
36
+ title: p.title,
37
+ htmlLength: p.html.length,
38
+ })),
39
+ }, null, 2),
40
+ }],
41
+ };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
46
+ isError: true,
47
+ };
48
+ }
49
+ });
50
+ // 2. List carousel generations
51
+ server.tool('carousel_list', 'List carousel generation history.', {
52
+ limit: z.number().min(1).max(50).default(20).describe('Number of results'),
53
+ offset: z.number().min(0).default(0).describe('Offset for pagination'),
54
+ }, async (params) => {
55
+ try {
56
+ const result = await api.get('/api/v1/carousel-lab/generations', { limit: params.limit, offset: params.offset });
57
+ return {
58
+ content: [{
59
+ type: 'text',
60
+ text: JSON.stringify(result, null, 2),
61
+ }],
62
+ };
63
+ }
64
+ catch (error) {
65
+ return {
66
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
67
+ isError: true,
68
+ };
69
+ }
70
+ });
71
+ // 3. Get carousel generation detail
72
+ server.tool('carousel_get', 'Get full details of a carousel generation including all pages.', {
73
+ generationId: z.string().describe('Carousel generation ID'),
74
+ }, async (params) => {
75
+ try {
76
+ const result = await api.get(`/api/v1/carousel-lab/generations/${params.generationId}`);
77
+ return {
78
+ content: [{
79
+ type: 'text',
80
+ text: JSON.stringify(result, null, 2),
81
+ }],
82
+ };
83
+ }
84
+ catch (error) {
85
+ return {
86
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
87
+ isError: true,
88
+ };
89
+ }
90
+ });
91
+ // 4. Render carousel to images
92
+ server.tool('carousel_render_images', 'Render carousel pages to images (PNG). Returns URLs of rendered images.', {
93
+ generationId: z.string().describe('Carousel generation ID'),
94
+ format: z.enum(['storage', 'pdf', 'zip']).default('storage').describe('Output format'),
95
+ }, async (params) => {
96
+ try {
97
+ const gen = await api.get(`/api/v1/carousel-lab/generations/${params.generationId}`);
98
+ if (!gen.generatedPages || gen.generatedPages.length === 0) {
99
+ return {
100
+ content: [{ type: 'text', text: 'Error: No pages found in this generation' }],
101
+ isError: true,
102
+ };
103
+ }
104
+ const result = await api.post('/api/v1/carousel-lab/render-html', {
105
+ pages: gen.generatedPages,
106
+ aspectRatio: gen.aspectRatio,
107
+ format: params.format,
108
+ });
109
+ return {
110
+ content: [{
111
+ type: 'text',
112
+ text: JSON.stringify(result, null, 2),
113
+ }],
114
+ };
115
+ }
116
+ catch (error) {
117
+ return {
118
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
119
+ isError: true,
120
+ };
121
+ }
122
+ });
123
+ // 5. Open visual editor
124
+ server.tool('carousel_open_editor', 'Get a URL to open the visual carousel editor in a browser. The user can edit pages visually, then tell you when done.', {
125
+ generationId: z.string().describe('Carousel generation ID to edit'),
126
+ locale: z.string().default('en').describe('Editor UI language (en, ko, ja, etc.)'),
127
+ }, async (params) => {
128
+ try {
129
+ await api.get(`/api/v1/carousel-lab/generations/${params.generationId}`);
130
+ const editorUrl = `${api.baseUrl}/${params.locale}/embed/carousel-lab/${params.generationId}#key=${api.apiKey}`;
131
+ return {
132
+ content: [{
133
+ type: 'text',
134
+ text: JSON.stringify({
135
+ editorUrl,
136
+ generationId: params.generationId,
137
+ instruction: 'Open this URL in a browser to visually edit the carousel. Tell the AI when you are done editing. WARNING: This URL contains your API key - do not share it publicly.',
138
+ }, null, 2),
139
+ }],
140
+ };
141
+ }
142
+ catch (error) {
143
+ return {
144
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
145
+ isError: true,
146
+ };
147
+ }
148
+ });
149
+ // 6. Generate caption for carousel
150
+ server.tool('carousel_generate_caption', 'Generate a social media caption for a carousel post.', {
151
+ carouselContent: z.string().describe('Text content of the carousel'),
152
+ socialAccountId: z.string().describe('Social account ID to match persona'),
153
+ platform: z.string().optional().describe('Target platform (threads, instagram, linkedin, etc.)'),
154
+ }, async (params) => {
155
+ try {
156
+ const result = await api.post('/api/v1/carousel-lab/generate-caption', {
157
+ carouselContent: params.carouselContent,
158
+ socialAccountId: params.socialAccountId,
159
+ platform: params.platform,
160
+ });
161
+ return {
162
+ content: [{
163
+ type: 'text',
164
+ text: JSON.stringify(result, null, 2),
165
+ }],
166
+ };
167
+ }
168
+ catch (error) {
169
+ return {
170
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
171
+ isError: true,
172
+ };
173
+ }
174
+ });
175
+ }
176
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/tools/carousel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Publishing (예약발행) Tools
3
+ *
4
+ * Tools for creating, scheduling, and publishing posts to social media platforms.
5
+ */
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import type { MirraApiClient } from '../client/api-client.js';
8
+ export declare function registerPublishingTools(server: McpServer, api: MirraApiClient): void;
9
+ //# sourceMappingURL=publishing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.d.ts","sourceRoot":"","sources":["../../src/tools/publishing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,cAAc,QAmRpB"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Publishing (예약발행) Tools
3
+ *
4
+ * Tools for creating, scheduling, and publishing posts to social media platforms.
5
+ */
6
+ import { z } from 'zod';
7
+ export function registerPublishingTools(server, api) {
8
+ // 1. Create post
9
+ server.tool('post_create', 'Create a new post draft. Supports text, images, and videos for any connected social platform.', {
10
+ content: z.string().describe('Post content text'),
11
+ socialAccountId: z.string().describe('Social account ID to post from'),
12
+ images: z.array(z.string()).optional().describe('Array of image URLs'),
13
+ videos: z.array(z.string()).optional().describe('Array of video URLs'),
14
+ threadParts: z.array(z.object({
15
+ content: z.string(),
16
+ images: z.array(z.string()).optional(),
17
+ })).optional().describe('Thread reply parts (for Threads/X threads)'),
18
+ }, async (params) => {
19
+ try {
20
+ const result = await api.post('/api/v1/posts', {
21
+ content: params.content,
22
+ socialAccountId: params.socialAccountId,
23
+ images: params.images,
24
+ videos: params.videos,
25
+ replies: params.threadParts?.map((part, i) => ({
26
+ content: part.content,
27
+ images: part.images,
28
+ order: i + 1,
29
+ })),
30
+ });
31
+ return {
32
+ content: [{
33
+ type: 'text',
34
+ text: JSON.stringify(result, null, 2),
35
+ }],
36
+ };
37
+ }
38
+ catch (error) {
39
+ return {
40
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
41
+ isError: true,
42
+ };
43
+ }
44
+ });
45
+ // 2. List posts
46
+ server.tool('post_list', 'List posts with optional filters. Supports filtering by status, account, and date range.', {
47
+ status: z.string().optional().describe('Comma-separated statuses: draft,scheduled,published,failed'),
48
+ socialAccountId: z.string().optional().describe('Filter by social account'),
49
+ limit: z.number().min(1).max(50).default(20).describe('Number of results'),
50
+ page: z.number().min(1).default(1).describe('Page number'),
51
+ orderBy: z.enum(['createdAt', 'scheduledAt', 'publishedAt']).default('createdAt').describe('Sort field'),
52
+ order: z.enum(['asc', 'desc']).default('desc').describe('Sort direction'),
53
+ }, async (params) => {
54
+ try {
55
+ const result = await api.get('/api/v1/posts', {
56
+ status: params.status,
57
+ socialAccountId: params.socialAccountId,
58
+ limit: params.limit,
59
+ page: params.page,
60
+ orderBy: params.orderBy,
61
+ order: params.order,
62
+ });
63
+ return {
64
+ content: [{
65
+ type: 'text',
66
+ text: JSON.stringify(result, null, 2),
67
+ }],
68
+ };
69
+ }
70
+ catch (error) {
71
+ return {
72
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
73
+ isError: true,
74
+ };
75
+ }
76
+ });
77
+ // 3. Get post detail
78
+ server.tool('post_get', 'Get full details of a specific post including engagement metrics.', {
79
+ postId: z.string().describe('Post ID'),
80
+ }, async (params) => {
81
+ try {
82
+ const result = await api.get(`/api/v1/posts/${params.postId}`);
83
+ return {
84
+ content: [{
85
+ type: 'text',
86
+ text: JSON.stringify(result, null, 2),
87
+ }],
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
93
+ isError: true,
94
+ };
95
+ }
96
+ });
97
+ // 4. Publish now
98
+ server.tool('post_publish_now', 'Publish a post immediately to the connected social platform.', {
99
+ postId: z.string().describe('Post ID to publish'),
100
+ }, async (params) => {
101
+ try {
102
+ const result = await api.post(`/api/v1/posts/publishing/now/${params.postId}`);
103
+ return {
104
+ content: [{
105
+ type: 'text',
106
+ text: JSON.stringify(result, null, 2),
107
+ }],
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
113
+ isError: true,
114
+ };
115
+ }
116
+ });
117
+ // 5. Schedule post
118
+ server.tool('post_schedule', 'Schedule a post for future publishing.', {
119
+ postId: z.string().describe('Post ID to schedule'),
120
+ scheduledAt: z.string().describe('ISO 8601 datetime for scheduled publish (e.g., 2026-03-25T09:00:00Z)'),
121
+ }, async (params) => {
122
+ try {
123
+ const result = await api.post(`/api/v1/posts/publishing/schedule/${params.postId}`, { scheduledFor: params.scheduledAt });
124
+ return {
125
+ content: [{
126
+ type: 'text',
127
+ text: JSON.stringify(result, null, 2),
128
+ }],
129
+ };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
134
+ isError: true,
135
+ };
136
+ }
137
+ });
138
+ // 6. Repost
139
+ server.tool('post_repost', 'Repost an existing published post, optionally scheduled for later.', {
140
+ postId: z.string().describe('Post ID to repost'),
141
+ scheduledAt: z.string().optional().describe('ISO 8601 datetime for scheduled repost. If omitted, reposts immediately.'),
142
+ }, async (params) => {
143
+ try {
144
+ if (params.scheduledAt) {
145
+ const result = await api.post(`/api/v1/posts/publishing/repost/schedule/${params.postId}`, { repostScheduledAt: params.scheduledAt });
146
+ return {
147
+ content: [{
148
+ type: 'text',
149
+ text: JSON.stringify(result, null, 2),
150
+ }],
151
+ };
152
+ }
153
+ else {
154
+ const result = await api.post(`/api/v1/posts/publishing/repost/${params.postId}`);
155
+ return {
156
+ content: [{
157
+ type: 'text',
158
+ text: JSON.stringify(result, null, 2),
159
+ }],
160
+ };
161
+ }
162
+ }
163
+ catch (error) {
164
+ return {
165
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
166
+ isError: true,
167
+ };
168
+ }
169
+ });
170
+ // 7. Update post
171
+ server.tool('post_update', 'Update an existing post (content, media, etc.). Only works for draft or scheduled posts.', {
172
+ postId: z.string().describe('Post ID to update'),
173
+ content: z.string().optional().describe('New content text'),
174
+ images: z.array(z.string()).optional().describe('New image URLs (replaces existing)'),
175
+ videos: z.array(z.string()).optional().describe('New video URLs (replaces existing)'),
176
+ socialAccountId: z.string().optional().describe('Change target social account'),
177
+ }, async (params) => {
178
+ try {
179
+ const body = {};
180
+ if (params.content !== undefined)
181
+ body.content = params.content;
182
+ if (params.images !== undefined)
183
+ body.images = params.images;
184
+ if (params.videos !== undefined)
185
+ body.videos = params.videos;
186
+ if (params.socialAccountId !== undefined)
187
+ body.socialAccountId = params.socialAccountId;
188
+ const result = await api.put(`/api/v1/posts/${params.postId}`, body);
189
+ return {
190
+ content: [{
191
+ type: 'text',
192
+ text: JSON.stringify(result, null, 2),
193
+ }],
194
+ };
195
+ }
196
+ catch (error) {
197
+ return {
198
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
199
+ isError: true,
200
+ };
201
+ }
202
+ });
203
+ // 8. Delete post
204
+ server.tool('post_delete', 'Delete a post. Only works for draft or scheduled posts that have not been published.', {
205
+ postId: z.string().describe('Post ID to delete'),
206
+ }, async (params) => {
207
+ try {
208
+ const result = await api.delete(`/api/v1/posts/${params.postId}`);
209
+ return {
210
+ content: [{
211
+ type: 'text',
212
+ text: JSON.stringify(result, null, 2),
213
+ }],
214
+ };
215
+ }
216
+ catch (error) {
217
+ return {
218
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
219
+ isError: true,
220
+ };
221
+ }
222
+ });
223
+ }
224
+ //# sourceMappingURL=publishing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.js","sourceRoot":"","sources":["../../src/tools/publishing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shorts (숏츠) Tools - 7 tools
3
+ *
4
+ * Core tools for generating AI-powered short-form video content.
5
+ */
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import type { MirraApiClient } from '../client/api-client.js';
8
+ export declare function registerShortsTools(server: McpServer, api: MirraApiClient): void;
9
+ //# sourceMappingURL=shorts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shorts.d.ts","sourceRoot":"","sources":["../../src/tools/shorts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,cAAc,QA8OpB"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Shorts (숏츠) Tools - 7 tools
3
+ *
4
+ * Core tools for generating AI-powered short-form video content.
5
+ */
6
+ import { z } from 'zod';
7
+ export function registerShortsTools(server, api) {
8
+ // 1. Generate script
9
+ server.tool('shorts_generate_script', 'Generate a video script from a topic. First step in shorts creation pipeline.', {
10
+ topic: z.string().describe('Topic or idea for the short video'),
11
+ aspectRatio: z.enum(['9:16', '16:9', '1:1']).default('9:16').describe('Video aspect ratio'),
12
+ narrationLanguage: z.string().default('en').describe('Language code for narration (en, ko, ja, etc.)'),
13
+ scriptStyle: z.string().optional().describe('Script style preset'),
14
+ }, async (params) => {
15
+ try {
16
+ const result = await api.post('/api/v1/shorts-lab/generate-script', {
17
+ topic: params.topic,
18
+ aspectRatio: params.aspectRatio,
19
+ narrationLanguage: params.narrationLanguage,
20
+ scriptStylePreset: params.scriptStyle,
21
+ });
22
+ return {
23
+ content: [{
24
+ type: 'text',
25
+ text: JSON.stringify(result, null, 2),
26
+ }],
27
+ };
28
+ }
29
+ catch (error) {
30
+ return {
31
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
32
+ isError: true,
33
+ };
34
+ }
35
+ });
36
+ // 2. Confirm and initialize scenes
37
+ server.tool('shorts_confirm_generate', 'Initialize scenes from a generated script. Must be called after shorts_generate_script.', {
38
+ generationId: z.string().describe('Shorts generation ID from generate_script'),
39
+ voiceId: z.string().optional().describe('TTS voice ID to use'),
40
+ voiceProvider: z.enum(['inworld', 'fish-audio']).default('inworld').describe('TTS provider'),
41
+ }, async (params) => {
42
+ try {
43
+ const result = await api.post('/api/v1/shorts-lab/confirm-generate', {
44
+ generationId: params.generationId,
45
+ voiceId: params.voiceId,
46
+ voiceProvider: params.voiceProvider,
47
+ });
48
+ return {
49
+ content: [{
50
+ type: 'text',
51
+ text: JSON.stringify(result, null, 2),
52
+ }],
53
+ };
54
+ }
55
+ catch (error) {
56
+ return {
57
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
58
+ isError: true,
59
+ };
60
+ }
61
+ });
62
+ // 3. Generate individual scene
63
+ server.tool('shorts_generate_scene', 'Generate a single scene (TTS audio + visual code). Call after confirm_generate for each scene.', {
64
+ generationId: z.string().describe('Shorts generation ID'),
65
+ sceneIndex: z.number().min(0).describe('Scene index (0-based)'),
66
+ }, async (params) => {
67
+ try {
68
+ const result = await api.post('/api/v1/shorts-lab/generate-single-scene', {
69
+ generationId: params.generationId,
70
+ sceneIndex: params.sceneIndex,
71
+ });
72
+ return {
73
+ content: [{
74
+ type: 'text',
75
+ text: JSON.stringify(result, null, 2),
76
+ }],
77
+ };
78
+ }
79
+ catch (error) {
80
+ return {
81
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
82
+ isError: true,
83
+ };
84
+ }
85
+ });
86
+ // 4. Get shorts generation detail
87
+ server.tool('shorts_get', 'Get full details of a shorts generation including all scenes.', {
88
+ generationId: z.string().describe('Shorts generation ID'),
89
+ }, async (params) => {
90
+ try {
91
+ const result = await api.get(`/api/v1/shorts-lab/generations/${params.generationId}`);
92
+ return {
93
+ content: [{
94
+ type: 'text',
95
+ text: JSON.stringify(result, null, 2),
96
+ }],
97
+ };
98
+ }
99
+ catch (error) {
100
+ return {
101
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ // 5. Final render (async)
107
+ server.tool('shorts_final_render', 'Trigger final video render. This is async - use shorts_check_status to monitor progress.', {
108
+ generationId: z.string().describe('Shorts generation ID'),
109
+ bgmUrl: z.string().optional().describe('Background music URL'),
110
+ bgmVolume: z.number().min(0).max(1).default(0.3).describe('BGM volume'),
111
+ }, async (params) => {
112
+ try {
113
+ const result = await api.post('/api/v1/shorts-lab/final-render', {
114
+ generationId: params.generationId,
115
+ bgmUrl: params.bgmUrl,
116
+ bgmVolume: params.bgmVolume,
117
+ });
118
+ return {
119
+ content: [{
120
+ type: 'text',
121
+ text: JSON.stringify({
122
+ ...result,
123
+ message: 'Render started. Use shorts_check_status to monitor progress.',
124
+ }, null, 2),
125
+ }],
126
+ };
127
+ }
128
+ catch (error) {
129
+ return {
130
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
131
+ isError: true,
132
+ };
133
+ }
134
+ });
135
+ // 6. Check render status
136
+ server.tool('shorts_check_status', 'Check the status of a shorts generation/render. Use after final_render to monitor progress.', {
137
+ generationId: z.string().describe('Shorts generation ID'),
138
+ }, async (params) => {
139
+ try {
140
+ const result = await api.get(`/api/v1/shorts-lab/generations/${params.generationId}`);
141
+ return {
142
+ content: [{
143
+ type: 'text',
144
+ text: JSON.stringify({
145
+ status: result.status,
146
+ finalVideoUrl: result.finalVideoUrl,
147
+ thumbnailUrl: result.thumbnailUrl,
148
+ totalDuration: result.totalDuration,
149
+ scenes: result.scenes?.map(s => ({
150
+ sceneNumber: s.sceneNumber,
151
+ status: s.status,
152
+ })),
153
+ }, null, 2),
154
+ }],
155
+ };
156
+ }
157
+ catch (error) {
158
+ return {
159
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
160
+ isError: true,
161
+ };
162
+ }
163
+ });
164
+ // 7. Open visual editor
165
+ server.tool('shorts_open_editor', 'Get a URL to open the visual shorts editor in a browser. The user can edit scenes, subtitles, and audio visually.', {
166
+ generationId: z.string().describe('Shorts generation ID to edit'),
167
+ locale: z.string().default('en').describe('Editor UI language (en, ko, ja, etc.)'),
168
+ }, async (params) => {
169
+ try {
170
+ await api.get(`/api/v1/shorts-lab/generations/${params.generationId}`);
171
+ const editorUrl = `${api.baseUrl}/${params.locale}/embed/shorts-lab/${params.generationId}#key=${api.apiKey}`;
172
+ return {
173
+ content: [{
174
+ type: 'text',
175
+ text: JSON.stringify({
176
+ editorUrl,
177
+ generationId: params.generationId,
178
+ instruction: 'Open this URL in a browser to visually edit the shorts video. Tell the AI when you are done editing. WARNING: This URL contains your API key - do not share it publicly.',
179
+ }, null, 2),
180
+ }],
181
+ };
182
+ }
183
+ catch (error) {
184
+ return {
185
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
186
+ isError: true,
187
+ };
188
+ }
189
+ });
190
+ }
191
+ //# sourceMappingURL=shorts.js.map