#!/usr/bin/env node
/**
* MCP Adobe Premiere Pro Server
*
* This server enables AI-powered video editing through natural language prompts
* by providing Model Context Protocol tools for Adobe Premiere Pro.
*
* Features:
* - Project management (create, open, save)
* - Media import and management
* - Timeline and sequence operations
* - Video/audio editing operations
* - Effects and transitions
* - Rendering and export
* - Metadata management
*/
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ErrorCode,
GetPromptRequestSchema,
ReadResourceRequestSchema,
ListPromptsRequestSchema,
ListResourcesRequestSchema,
ListToolsRequestSchema,
McpError,
} from '@modelcontextprotocol/sdk/types.js';
import { PremiereProTools } from './tools/index.js';
import { PremiereProResources } from './resources/index.js';
import { PremiereProPrompts } from './prompts/index.js';
import { PremiereProBridge } from './bridge/index.js';
import { Logger } from './utils/logger.js';
import { zodToJsonSchema } from 'zod-to-json-schema';
class MCPPremiereProServer {
private server: Server;
private tools: PremiereProTools;
private resources: PremiereProResources;
private prompts: PremiereProPrompts;
private bridge: PremiereProBridge;
private logger: Logger;
constructor() {
this.logger = new Logger('MCPPremiereProServer');
this.server = new Server(
{
name: 'mcp-adobe-premiere-pro',
version: '1.0.0',
description: 'Model Context Protocol tools for Adobe Premiere Pro - AI-powered video editing'
},
{
capabilities: {
tools: {},
resources: {},
prompts: {},
logging: {}
}
}
);
this.bridge = new PremiereProBridge();
this.tools = new PremiereProTools(this.bridge);
this.resources = new PremiereProResources(this.bridge);
this.prompts = new PremiereProPrompts();
this.setupHandlers();
}
private setupHandlers(): void {
// List available tools
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
const tools = this.tools.getAvailableTools().map((tool) => ({
name: tool.name,
description: tool.description,
inputSchema: zodToJsonSchema(tool.inputSchema, { $refStrategy: 'none' })
}));
return { tools };
});
// Execute tool calls
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
const result = await this.tools.executeTool(name, args || {});
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(result, null, 2)
}
]
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
this.logger.error(`Tool execution failed: ${errorMessage}`);
throw new McpError(
ErrorCode.InternalError,
`Failed to execute tool '${name}': ${errorMessage}`
);
}
});
// List available resources
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: this.resources.getAvailableResources()
};
});
// Read resource content
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
const { uri } = request.params;
try {
const content = await this.resources.readResource(uri);
return {
contents: [
{
uri,
mimeType: 'application/json',
text: JSON.stringify(content, null, 2)
}
]
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
this.logger.error(`Resource read failed: ${errorMessage}`);
throw new McpError(
ErrorCode.InternalError,
`Failed to read resource '${uri}': ${errorMessage}`
);
}
});
// List available prompts
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
return {
prompts: this.prompts.getAvailablePrompts()
};
});
// Get prompt content
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
const prompt = await this.prompts.getPrompt(name, args || {});
return {
description: prompt.description,
messages: prompt.messages
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
this.logger.error(`Prompt generation failed: ${errorMessage}`);
throw new McpError(
ErrorCode.InternalError,
`Failed to generate prompt '${name}': ${errorMessage}`
);
}
});
// Error handling
this.server.onerror = (error) => {
this.logger.error('Server error:', error);
};
}
async start(): Promise<void> {
try {
await this.bridge.initialize();
this.logger.info('Adobe Premiere Pro bridge initialized');
const transport = new StdioServerTransport();
await this.server.connect(transport);
this.logger.info('MCP Adobe Premiere Pro Server started successfully');
} catch (error) {
this.logger.error('Failed to start server:', error);
throw error;
}
}
async stop(): Promise<void> {
try {
await this.bridge.cleanup();
this.logger.info('MCP Adobe Premiere Pro Server stopped');
} catch (error) {
this.logger.error('Error stopping server:', error);
throw error;
}
}
}
// Start the server
const server = new MCPPremiereProServer();
// Handle graceful shutdown
process.on('SIGINT', async () => {
console.error('\nShutting down MCP Adobe Premiere Pro Server...');
await server.stop();
process.exit(0);
});
process.on('SIGTERM', async () => {
console.error('\nShutting down MCP Adobe Premiere Pro Server...');
await server.stop();
process.exit(0);
});
// Start the server
server.start().catch((error) => {
console.error('Failed to start MCP Adobe Premiere Pro Server:', error);
process.exit(1);
});