apply-effect
Apply effects to specific layers in After Effects compositions by specifying layer index, effect name or match name, and optional settings. Works with the mcp-after-effects server for streamlined automation.
Instructions
Apply an effect to a layer in After Effects
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| compIndex | Yes | 1-based index of the target composition in the project panel. | |
| effectCategory | No | Optional category for filtering effects. | |
| effectMatchName | No | After Effects internal name for the effect (more reliable, e.g., 'ADBE Gaussian Blur 2'). | |
| effectName | No | Display name of the effect to apply (e.g., 'Gaussian Blur'). | |
| effectSettings | No | Optional parameters for the effect (e.g., { 'Blurriness': 25 }). | |
| layerIndex | Yes | 1-based index of the target layer within the composition. | |
| presetPath | No | Optional path to an effect preset file (.ffx). |
Implementation Reference
- src/index.ts:682-720 (registration)Registers the 'apply-effect' MCP tool with input schema, description, and handler function that queues the 'applyEffect' command to a temporary file for execution by the After Effects bridge panel.server.tool( "apply-effect", "Apply an effect to a layer in After Effects", { compIndex: z.number().int().positive().describe("1-based index of the target composition in the project panel."), layerIndex: z.number().int().positive().describe("1-based index of the target layer within the composition."), effectName: z.string().optional().describe("Display name of the effect to apply (e.g., 'Gaussian Blur')."), effectMatchName: z.string().optional().describe("After Effects internal name for the effect (more reliable, e.g., 'ADBE Gaussian Blur 2')."), effectCategory: z.string().optional().describe("Optional category for filtering effects."), presetPath: z.string().optional().describe("Optional path to an effect preset file (.ffx)."), effectSettings: z.record(z.any()).optional().describe("Optional parameters for the effect (e.g., { 'Blurriness': 25 }).") }, async (parameters) => { try { // Queue the command for After Effects writeCommandFile("applyEffect", parameters); return { content: [ { type: "text", text: `Command to apply effect to layer ${parameters.layerIndex} in composition ${parameters.compIndex} has been queued.\n` + `Use the "get-results" tool after a few seconds to check for confirmation.` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error queuing apply-effect command: ${String(error)}` } ], isError: true }; } } );
- src/index.ts:694-719 (handler)Handler function for the 'apply-effect' tool. Writes the command parameters to ae_command.json for the After Effects MCP Bridge Auto panel to detect and execute the actual effect application.async (parameters) => { try { // Queue the command for After Effects writeCommandFile("applyEffect", parameters); return { content: [ { type: "text", text: `Command to apply effect to layer ${parameters.layerIndex} in composition ${parameters.compIndex} has been queued.\n` + `Use the "get-results" tool after a few seconds to check for confirmation.` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error queuing apply-effect command: ${String(error)}` } ], isError: true }; } }
- src/index.ts:685-692 (schema)Zod input schema defining parameters for the 'apply-effect' tool: composition and layer indices, effect names, category, preset path, and custom settings.{ compIndex: z.number().int().positive().describe("1-based index of the target composition in the project panel."), layerIndex: z.number().int().positive().describe("1-based index of the target layer within the composition."), effectName: z.string().optional().describe("Display name of the effect to apply (e.g., 'Gaussian Blur')."), effectMatchName: z.string().optional().describe("After Effects internal name for the effect (more reliable, e.g., 'ADBE Gaussian Blur 2')."), effectCategory: z.string().optional().describe("Optional category for filtering effects."), presetPath: z.string().optional().describe("Optional path to an effect preset file (.ffx)."), effectSettings: z.record(z.any()).optional().describe("Optional parameters for the effect (e.g., { 'Blurriness': 25 }).")
- src/index.ts:156-170 (helper)Helper function used by the 'apply-effect' handler to write the command and parameters to the temporary ae_command.json file, which is monitored by the After Effects bridge.function writeCommandFile(command: string, args: Record<string, any> = {}): void { try { const commandFile = path.join(process.env.TEMP || process.env.TMP || '', 'ae_command.json'); const commandData = { command, args, timestamp: new Date().toISOString(), status: "pending" // pending, running, completed, error }; fs.writeFileSync(commandFile, JSON.stringify(commandData, null, 2)); console.error(`Command "${command}" written to ${commandFile}`); } catch (error) { console.error("Error writing command file:", error); } }
- src/index.ts:87-123 (helper)Helper function to read results from the ae_mcp_result.json file produced by After Effects after executing the applyEffect command. Used in companion 'get-results' tool.function readResultsFromTempFile(): string { try { const tempFilePath = path.join(process.env.TEMP || process.env.TMP || '', 'ae_mcp_result.json'); // Add debugging info console.error(`Checking for results at: ${tempFilePath}`); if (fs.existsSync(tempFilePath)) { // Get file stats to check modification time const stats = fs.statSync(tempFilePath); console.error(`Result file exists, last modified: ${stats.mtime.toISOString()}`); const content = fs.readFileSync(tempFilePath, 'utf8'); console.error(`Result file content length: ${content.length} bytes`); // If the result file is older than 30 seconds, warn the user const thirtySecondsAgo = new Date(Date.now() - 30 * 1000); if (stats.mtime < thirtySecondsAgo) { console.error(`WARNING: Result file is older than 30 seconds. After Effects may not be updating results.`); return JSON.stringify({ warning: "Result file appears to be stale (not recently updated).", message: "This could indicate After Effects is not properly writing results or the MCP Bridge Auto panel isn't running.", lastModified: stats.mtime.toISOString(), originalContent: content }); } return content; } else { console.error(`Result file not found at: ${tempFilePath}`); return JSON.stringify({ error: "No results file found. Please run a script in After Effects first." }); } } catch (error) { console.error("Error reading results file:", error); return JSON.stringify({ error: `Failed to read results: ${String(error)}` }); } }