Prepare Platform Publish Package
platform_prepare_packageGenerates video publishing metadata for multiple short video platforms, including title, description, tags, and platform-specific formatting, based on a provided video file and job ID.
Instructions
Generate publishing metadata for different short video platforms.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | ||
| finalVideoPath | Yes | ||
| title | Yes | ||
| description | No | ||
| tags | No | ||
| platforms | Yes |
Implementation Reference
- src/tools/pipeline.ts:64-96 (handler)Handler function for 'platform_prepare_package' tool. Generates publish metadata packages for each platform (douyin, xiaohongshu, bilibili, youtube_shorts, tiktok). For each platform, it creates a package entry with platform-specific title modifications (e.g., '#Shorts' suffix for youtube_shorts), platform-specific tags (e.g., extra AI tags for xiaohongshu), aspect ratio (9:16 for vertical platforms, 16:9 for bilibili), and writes all packages to jobs/{jobId}/publish/packages.json.
server.registerTool( 'platform_prepare_package', { title: 'Prepare Platform Publish Package', description: 'Generate publishing metadata for different short video platforms.', inputSchema: z.object({ jobId: z.string(), finalVideoPath: z.string(), title: z.string(), description: z.string().default(''), tags: z.array(z.string()).default([]), platforms: z.array(z.enum(['douyin', 'xiaohongshu', 'bilibili', 'youtube_shorts', 'tiktok'])) }) }, async ({ jobId, finalVideoPath, title, description, tags, platforms }) => { try { safePath(finalVideoPath); const packages = platforms.map((platform) => ({ platform, video: finalVideoPath, title: platform === 'youtube_shorts' ? `${title} #Shorts` : title, description, tags: platform === 'xiaohongshu' ? [...tags, 'AI视频', '视觉灵感'] : tags, aspect: ['douyin', 'xiaohongshu', 'youtube_shorts', 'tiktok'].includes(platform) ? '9:16' : '16:9', status: 'ready_for_manual_or_api_publish' })); const outputPath = safePath(`jobs/${jobId}/publish/packages.json`); await writeJsonFile(outputPath, packages); return textResult({ ok: true, outputPath: `jobs/${jobId}/publish/packages.json`, packages }); } catch (err) { return errorResult('Failed to prepare publish package', String(err)); } } - src/tools/pipeline.ts:66-77 (schema)Input schema for 'platform_prepare_package'. Required fields: jobId (string), finalVideoPath (string), title (string), platforms (array of 'douyin'|'xiaohongshu'|'bilibili'|'youtube_shorts'|'tiktok'). Optional fields with defaults: description (empty string), tags (empty array).
{ title: 'Prepare Platform Publish Package', description: 'Generate publishing metadata for different short video platforms.', inputSchema: z.object({ jobId: z.string(), finalVideoPath: z.string(), title: z.string(), description: z.string().default(''), tags: z.array(z.string()).default([]), platforms: z.array(z.enum(['douyin', 'xiaohongshu', 'bilibili', 'youtube_shorts', 'tiktok'])) }) }, - src/tools/pipeline.ts:64-97 (registration)Tool registration within registerPipelineTools(). The tool is registered on the McpServer instance via server.registerTool() with the name 'platform_prepare_package'.
server.registerTool( 'platform_prepare_package', { title: 'Prepare Platform Publish Package', description: 'Generate publishing metadata for different short video platforms.', inputSchema: z.object({ jobId: z.string(), finalVideoPath: z.string(), title: z.string(), description: z.string().default(''), tags: z.array(z.string()).default([]), platforms: z.array(z.enum(['douyin', 'xiaohongshu', 'bilibili', 'youtube_shorts', 'tiktok'])) }) }, async ({ jobId, finalVideoPath, title, description, tags, platforms }) => { try { safePath(finalVideoPath); const packages = platforms.map((platform) => ({ platform, video: finalVideoPath, title: platform === 'youtube_shorts' ? `${title} #Shorts` : title, description, tags: platform === 'xiaohongshu' ? [...tags, 'AI视频', '视觉灵感'] : tags, aspect: ['douyin', 'xiaohongshu', 'youtube_shorts', 'tiktok'].includes(platform) ? '9:16' : '16:9', status: 'ready_for_manual_or_api_publish' })); const outputPath = safePath(`jobs/${jobId}/publish/packages.json`); await writeJsonFile(outputPath, packages); return textResult({ ok: true, outputPath: `jobs/${jobId}/publish/packages.json`, packages }); } catch (err) { return errorResult('Failed to prepare publish package', String(err)); } } ); - src/index.ts:23-23 (registration)Top-level entry point where registerPipelineTools is called with the McpServer instance, which registers platform_prepare_package among other pipeline tools.
registerPipelineTools(server); - src/config.ts:28-35 (helper)Helper function safePath() used within the tool handler to validate and resolve file paths against VIDEO_FACTORY_ROOT, preventing directory traversal.
export function safePath(input: string) { ensureRoot(); const resolved = path.resolve(config.root, input); if (!resolved.startsWith(config.root)) { throw new Error(`Path escapes VIDEO_FACTORY_ROOT: ${input}`); } return resolved; }