• #ExtendScript
  • #Illustrator
  • #After Effects
  • #COM
  • #VBScript
  • #Claude Code
  • #自動化
開発misc-devメモ

Illustrator/After Effects ExtendScript自動化

Claude CodeからIllustratorとAfter Effectsを直接操作できるか試した一日。MCPサーバーのビルドから始めて、COMレジストリの修復に2時間費やし、最終的に「MCPサーバーは要らない、VBScript経由で直接ExtendScriptを叩けばいい」という結論に着地した。After Effectsでは148レイヤーのシネマティックイントロを自動生成するところまで走り切った。


Illustrator MCPサーバーとCOM接続

MCPサーバーのビルド

Illustrator用のMCPサーバー(TypeScript製)をクローンしてビルド。内部ではWindowsのCOMオートメーションで Illustrator.Application のProgIDを通じてIllustratorに接続する仕組み。

ビルド自体は通ったが、接続で即座にエラーが出た。

Beta版Illustratorがレジストリを全上書きしていた

COMで Illustrator.Application を叩くと、なぜかBeta版のIllustratorが起動する。レジストリを調べると原因が見えた。

Illustrator.Application     → Beta版exe
Illustrator.Application.29  → Beta版exe
Illustrator.Application.30  → Beta版exe

バージョン付きProgIDも無印も、全てのCLSID LocalServer32 がBeta版の実行パスを指していた。Beta版インストール時にレジストリを丸ごと上書きする設計らしい。

アンインストール後もCLSIDが壊れたまま

Beta版をアンインストールしても、CLSIDの LocalServer32 の値が空文字列のまま残った。アンインストーラーがレジストリを正しく復元しない。

PowerShellでレジストリを確認し、正規版Illustratorのexeパスを .reg ファイルに書いて手動でインポートした。

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{...}\LocalServer32]
@="C:\\Program Files\\Adobe\\Adobe Illustrator 2025\\Support Files\\Contents\\Windows\\Illustrator.exe"

これでCOM経由の接続が復活した。

環境変数による直接起動方式

レジストリ修復とは別に、MCPサーバー側で ILLUSTRATOR_EXE_PATH 環境変数を設定して直接exeを起動する方式にも対応した。COMのProgID解決を迂回できるので、レジストリが壊れていても動く。


MCPサーバーは要らないという結論

MCPサーバーを動かしてみて、ツール定義を眺めた瞬間に手が止まった。用意されているツールは「ドキュメント作成」「テキスト追加」「図形描画」程度で、ExtendScript APIの広大な機能のごく一部しかカバーしていない。

ExtendScriptを直接実行できるなら、MCPという抽象化レイヤーを挟む意味がない。

Claude CodeからVBScript経由で直接実行

Claude CodeのBashツールからcscriptでVBScriptを実行し、VBScript内でIllustratorのCOMオブジェクトを取得してExtendScriptを DoJavaScript で流し込む。この方式なら:

  • ExtendScript APIを制限なく使える
  • MCPサーバーのプロセス管理が不要
  • Claude Codeが直接スクリプトを生成→実行→結果確認のループを回せる
' 概要: VBScriptからIllustratorにExtendScriptを送る
Set ai = CreateObject("Illustrator.Application")
ai.DoJavaScript "var doc = app.activeDocument; ..."

MCPサーバーの起動・停止・ツール定義の制約から解放されて、思いついた描画をすぐに試せるようになった。

Illustratorで描画デモ

動作確認として、猫の顔、犬、マンダラ模様、幾何学パターンをExtendScriptで描画した。パスの座標計算とベジェ曲線のハンドル制御をClaude Codeが生成し、VBScript経由で一発実行。Illustrator上にベクターアートが次々と描かれていく。


After Effectsへの接続

COMでは繋がらない

Illustratorと同じ手法でAfter EffectsにCOM接続を試みたが、After Effectsは AfterEffects.Application のようなProgIDを公開していない。COMオートメーション非対応。

コマンドライン直接実行

After Effectsにはコマンドラインから -r フラグでJSXスクリプトを渡せる。

afterfx.exe -r "C:/path/to/script.jsx"

ただしAEが起動していない状態から実行すると起動→スクリプト実行→終了のサイクルが重い。AEを起動したままにして、スクリプトファイルを差し替えながら -r で繰り返し送り込む運用にした。


setTemporalEaseAtKeyのバグ

AEのExtendScriptで最もハマったのが setTemporalEaseAtKey のイージング設定。

次元数の不一致

このメソッドは [KeyframeEase, KeyframeEase, KeyframeEase] の配列を受け取るが、プロパティの次元数と配列の要素数が一致しないとサイレントに失敗するか、エラーを吐く。

  • Scaleプロパティ: UIは2D表示だが内部は3D(X, Y, Z)。要素を3つ渡す必要がある
  • 1DプロパティのPosition: 「次元を分割」した場合、X PositionやY Positionは1D。要素1つ

次元数をハードコードせず、property.value の型を見て動的に判定するようにした。

var dims = (prop.value instanceof Array) ? prop.value.length : 1;
var easeArray = [];
for (var i = 0; i < dims; i++) {
    easeArray.push(new KeyframeEase(0, influence));
}
prop.setTemporalEaseAtKey(keyIdx, easeArray, easeArray);

148レイヤーのシネマティックイントロ生成

構成

12秒・3シーン構成のイントロ映像をExtendScriptで自動生成した。テキストアニメーション、シェイプレイヤー、エフェクトを組み合わせて148レイヤー。

手作業で148レイヤーを並べる気力はないが、スクリプトなら構造を定義するだけで一括生成できる。

調整プロセス

初回レンダリングの結果を見ながら複数回調整を重ねた:

  • フラッシュトランジション削除: シーン切替時の白フラッシュが安っぽく見えたので除去
  • ストローク幅の変更: 細すぎて視認性が低かったので太く変更
  • CC Vignette追加: 画面端を暗くして視線を中央に誘導
  • エフェクトの追加・削除はExtendScriptで property("Effects").addProperty("CC Vignette") を叩くだけなので、試行→確認→修正のサイクルが速く回る

実動画素材のコンポジション配置

MP4をAEに配置してエフェクト適用

実際の動画素材(MP4ファイル)をExtendScriptで app.project.importFile() してコンポジションに配置し、カラーグレーディングやトランジションを適用した。

layer.stretchによるスローモーション

動画の再生速度を変更する方法として timeRemaplayer.stretch がある。

timeRemap は有効化した瞬間にレイヤーのデュレーションが変わり、既存キーフレームとの整合性が崩れる罠が多い。layer.stretch は単純にパーセンテージ指定(200で0.5倍速)で、他のプロパティに干渉しない。スローモーション用途なら stretch の方が扱いやすかった。

layer.stretch = 200; // 0.5倍速(2倍の時間をかけて再生)

MP4レンダリング書き出し

最終出力はAEのレンダーキューにOutputModuleを設定してMP4で書き出し。レンダリング設定もExtendScriptから制御できるので、解像度・コーデック・出力先を指定して app.project.renderQueue.render() で実行。


学んだこと

  • AdobeのCOMレジストリはBeta版インストールで壊れる。Beta版を入れるなら仮想環境を使うか、レジストリのバックアップを取っておく
  • MCPサーバーは「ツール定義の範囲内」でしか動けない。ExtendScriptを自由に書けるなら、COMやCLI経由の直接実行の方が制約がなく速い
  • After Effectsの setTemporalEaseAtKey はプロパティの次元数に厳密。Scaleは見た目2Dでも内部3D
  • スローモーションは timeRemap より layer.stretch が事故りにくい
  • 148レイヤーの映像をスクリプトで生成→調整→再生成のサイクルは、手作業では到達できない試行回数を稼げる