[{"data":1,"prerenderedAt":696},["ShallowReactive",2],{"content-/illustrator-aftereffects-extendscript-automation":3,"all-pages-for-dir":694,"og-image-/illustrator-aftereffects-extendscript-automation":695},{"id":4,"title":5,"body":6,"category":672,"description":673,"extension":674,"meta":675,"navigation":676,"ogImage":677,"path":678,"project_name":679,"published":680,"publishedAt":681,"seo":682,"stem":683,"tags":684,"todo":692,"unpublished":680,"updatedAt":677,"__hash__":693},"pages/2026-03/2026-03-25/illustrator-aftereffects-extendscript-automation.md","Illustrator/After Effects ExtendScript自動化 - COM接続の罠とClaude Codeからの直接実行",{"type":7,"value":8,"toc":643},"minimark",[9,14,18,21,26,31,39,42,46,52,62,69,73,79,86,107,110,113,120,122,126,129,132,136,143,156,179,182,186,189,191,195,199,206,209,216,244,250,252,256,263,266,273,288,295,481,483,487,490,493,496,499,502,529,531,534,538,545,549,560,572,597,601,608,610,613,639],[10,11,13],"h1",{"id":12},"illustratorafter-effects-extendscript自動化","Illustrator/After Effects ExtendScript自動化",[15,16,17],"p",{},"Claude CodeからIllustratorとAfter Effectsを直接操作できるか試した一日。MCPサーバーのビルドから始めて、COMレジストリの修復に2時間費やし、最終的に「MCPサーバーは要らない、VBScript経由で直接ExtendScriptを叩けばいい」という結論に着地した。After Effectsでは148レイヤーのシネマティックイントロを自動生成するところまで走り切った。",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"illustrator-mcpサーバーとcom接続","Illustrator MCPサーバーとCOM接続",[27,28,30],"h3",{"id":29},"mcpサーバーのビルド","MCPサーバーのビルド",[15,32,33,34,38],{},"Illustrator用のMCPサーバー（TypeScript製）をクローンしてビルド。内部ではWindowsのCOMオートメーションで ",[35,36,37],"code",{},"Illustrator.Application"," のProgIDを通じてIllustratorに接続する仕組み。",[15,40,41],{},"ビルド自体は通ったが、接続で即座にエラーが出た。",[27,43,45],{"id":44},"beta版illustratorがレジストリを全上書きしていた","Beta版Illustratorがレジストリを全上書きしていた",[15,47,48,49,51],{},"COMで ",[35,50,37],{}," を叩くと、なぜかBeta版のIllustratorが起動する。レジストリを調べると原因が見えた。",[53,54,59],"pre",{"className":55,"code":57,"language":58},[56],"language-text","Illustrator.Application     → Beta版exe\nIllustrator.Application.29  → Beta版exe\nIllustrator.Application.30  → Beta版exe\n","text",[35,60,57],{"__ignoreMap":61},"",[15,63,64,65,68],{},"バージョン付きProgIDも無印も、全てのCLSID ",[35,66,67],{},"LocalServer32"," がBeta版の実行パスを指していた。Beta版インストール時にレジストリを丸ごと上書きする設計らしい。",[27,70,72],{"id":71},"アンインストール後もclsidが壊れたまま","アンインストール後もCLSIDが壊れたまま",[15,74,75,76,78],{},"Beta版をアンインストールしても、CLSIDの ",[35,77,67],{}," の値が空文字列のまま残った。アンインストーラーがレジストリを正しく復元しない。",[15,80,81,82,85],{},"PowerShellでレジストリを確認し、正規版Illustratorのexeパスを ",[35,83,84],{},".reg"," ファイルに書いて手動でインポートした。",[53,87,91],{"className":88,"code":89,"language":90,"meta":61,"style":61},"language-reg shiki shiki-themes vitesse-light vitesse-light","[HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{...}\\LocalServer32]\n@=\"C:\\\\Program Files\\\\Adobe\\\\Adobe Illustrator 2025\\\\Support Files\\\\Contents\\\\Windows\\\\Illustrator.exe\"\n","reg",[35,92,93,101],{"__ignoreMap":61},[94,95,98],"span",{"class":96,"line":97},"line",1,[94,99,100],{},"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{...}\\LocalServer32]\n",[94,102,104],{"class":96,"line":103},2,[94,105,106],{},"@=\"C:\\\\Program Files\\\\Adobe\\\\Adobe Illustrator 2025\\\\Support Files\\\\Contents\\\\Windows\\\\Illustrator.exe\"\n",[15,108,109],{},"これでCOM経由の接続が復活した。",[27,111,112],{"id":112},"環境変数による直接起動方式",[15,114,115,116,119],{},"レジストリ修復とは別に、MCPサーバー側で ",[35,117,118],{},"ILLUSTRATOR_EXE_PATH"," 環境変数を設定して直接exeを起動する方式にも対応した。COMのProgID解決を迂回できるので、レジストリが壊れていても動く。",[19,121],{},[22,123,125],{"id":124},"mcpサーバーは要らないという結論","MCPサーバーは要らないという結論",[15,127,128],{},"MCPサーバーを動かしてみて、ツール定義を眺めた瞬間に手が止まった。用意されているツールは「ドキュメント作成」「テキスト追加」「図形描画」程度で、ExtendScript APIの広大な機能のごく一部しかカバーしていない。",[15,130,131],{},"ExtendScriptを直接実行できるなら、MCPという抽象化レイヤーを挟む意味がない。",[27,133,135],{"id":134},"claude-codeからvbscript経由で直接実行","Claude CodeからVBScript経由で直接実行",[15,137,138,139,142],{},"Claude CodeのBashツールからcscriptでVBScriptを実行し、VBScript内でIllustratorのCOMオブジェクトを取得してExtendScriptを ",[35,140,141],{},"DoJavaScript"," で流し込む。この方式なら:",[144,145,146,150,153],"ul",{},[147,148,149],"li",{},"ExtendScript APIを制限なく使える",[147,151,152],{},"MCPサーバーのプロセス管理が不要",[147,154,155],{},"Claude Codeが直接スクリプトを生成→実行→結果確認のループを回せる",[53,157,161],{"className":158,"code":159,"language":160,"meta":61,"style":61},"language-vbs shiki shiki-themes vitesse-light vitesse-light","' 概要: VBScriptからIllustratorにExtendScriptを送る\nSet ai = CreateObject(\"Illustrator.Application\")\nai.DoJavaScript \"var doc = app.activeDocument; ...\"\n","vbs",[35,162,163,168,173],{"__ignoreMap":61},[94,164,165],{"class":96,"line":97},[94,166,167],{},"' 概要: VBScriptからIllustratorにExtendScriptを送る\n",[94,169,170],{"class":96,"line":103},[94,171,172],{},"Set ai = CreateObject(\"Illustrator.Application\")\n",[94,174,176],{"class":96,"line":175},3,[94,177,178],{},"ai.DoJavaScript \"var doc = app.activeDocument; ...\"\n",[15,180,181],{},"MCPサーバーの起動・停止・ツール定義の制約から解放されて、思いついた描画をすぐに試せるようになった。",[27,183,185],{"id":184},"illustratorで描画デモ","Illustratorで描画デモ",[15,187,188],{},"動作確認として、猫の顔、犬、マンダラ模様、幾何学パターンをExtendScriptで描画した。パスの座標計算とベジェ曲線のハンドル制御をClaude Codeが生成し、VBScript経由で一発実行。Illustrator上にベクターアートが次々と描かれていく。",[19,190],{},[22,192,194],{"id":193},"after-effectsへの接続","After Effectsへの接続",[27,196,198],{"id":197},"comでは繋がらない","COMでは繋がらない",[15,200,201,202,205],{},"Illustratorと同じ手法でAfter EffectsにCOM接続を試みたが、After Effectsは ",[35,203,204],{},"AfterEffects.Application"," のようなProgIDを公開していない。COMオートメーション非対応。",[27,207,208],{"id":208},"コマンドライン直接実行",[15,210,211,212,215],{},"After Effectsにはコマンドラインから ",[35,213,214],{},"-r"," フラグでJSXスクリプトを渡せる。",[53,217,221],{"className":218,"code":219,"language":220,"meta":61,"style":61},"language-bash shiki shiki-themes vitesse-light vitesse-light","afterfx.exe -r \"C:/path/to/script.jsx\"\n","bash",[35,222,223],{"__ignoreMap":61},[94,224,225,229,233,237,241],{"class":96,"line":97},[94,226,228],{"class":227},"senZ8","afterfx.exe",[94,230,232],{"class":231},"snbK4"," -r",[94,234,236],{"class":235},"sMJiu"," \"",[94,238,240],{"class":239},"sdGka","C:/path/to/script.jsx",[94,242,243],{"class":235},"\"\n",[15,245,246,247,249],{},"ただしAEが起動していない状態から実行すると起動→スクリプト実行→終了のサイクルが重い。AEを起動したままにして、スクリプトファイルを差し替えながら ",[35,248,214],{}," で繰り返し送り込む運用にした。",[19,251],{},[22,253,255],{"id":254},"settemporaleaseatkeyのバグ","setTemporalEaseAtKeyのバグ",[15,257,258,259,262],{},"AEのExtendScriptで最もハマったのが ",[35,260,261],{},"setTemporalEaseAtKey"," のイージング設定。",[27,264,265],{"id":265},"次元数の不一致",[15,267,268,269,272],{},"このメソッドは ",[35,270,271],{},"[KeyframeEase, KeyframeEase, KeyframeEase]"," の配列を受け取るが、プロパティの次元数と配列の要素数が一致しないとサイレントに失敗するか、エラーを吐く。",[144,274,275,282],{},[147,276,277,281],{},[278,279,280],"strong",{},"Scaleプロパティ",": UIは2D表示だが内部は3D（X, Y, Z）。要素を3つ渡す必要がある",[147,283,284,287],{},[278,285,286],{},"1DプロパティのPosition",": 「次元を分割」した場合、X PositionやY Positionは1D。要素1つ",[15,289,290,291,294],{},"次元数をハードコードせず、",[35,292,293],{},"property.value"," の型を見て動的に判定するようにした。",[53,296,300],{"className":297,"code":298,"language":299,"meta":61,"style":61},"language-javascript shiki shiki-themes vitesse-light vitesse-light","var dims = (prop.value instanceof Array) ? prop.value.length : 1;\nvar easeArray = [];\nfor (var i = 0; i \u003C dims; i++) {\n    easeArray.push(new KeyframeEase(0, influence));\n}\nprop.setTemporalEaseAtKey(keyIdx, easeArray, easeArray);\n","javascript",[35,301,302,364,376,416,450,456],{"__ignoreMap":61},[94,303,304,308,312,316,319,322,325,328,331,335,338,341,344,346,348,350,354,357,361],{"class":96,"line":97},[94,305,307],{"class":306},"stQ0i","var",[94,309,311],{"class":310},"s4oTP"," dims",[94,313,315],{"class":314},"shFtX"," =",[94,317,318],{"class":314}," (",[94,320,321],{"class":310},"prop",[94,323,324],{"class":314},".",[94,326,327],{"class":310},"value",[94,329,330],{"class":306}," instanceof",[94,332,334],{"class":333},"sSkh3"," Array",[94,336,337],{"class":314},")",[94,339,340],{"class":306}," ?",[94,342,343],{"class":310}," prop",[94,345,324],{"class":314},[94,347,327],{"class":310},[94,349,324],{"class":314},[94,351,353],{"class":352},"sz8Xr","length",[94,355,356],{"class":306}," :",[94,358,360],{"class":359},"sM54T"," 1",[94,362,363],{"class":314},";\n",[94,365,366,368,371,373],{"class":96,"line":103},[94,367,307],{"class":306},[94,369,370],{"class":310}," easeArray",[94,372,315],{"class":314},[94,374,375],{"class":314}," [];\n",[94,377,378,382,384,386,389,391,394,397,399,402,404,406,408,411,413],{"class":96,"line":175},[94,379,381],{"class":380},"sHkkW","for",[94,383,318],{"class":314},[94,385,307],{"class":306},[94,387,388],{"class":310}," i",[94,390,315],{"class":314},[94,392,393],{"class":359}," 0",[94,395,396],{"class":314},";",[94,398,388],{"class":310},[94,400,401],{"class":314}," \u003C",[94,403,311],{"class":310},[94,405,396],{"class":314},[94,407,388],{"class":310},[94,409,410],{"class":306},"++",[94,412,337],{"class":314},[94,414,415],{"class":314}," {\n",[94,417,419,422,424,427,430,433,436,438,441,444,447],{"class":96,"line":418},4,[94,420,421],{"class":310},"    easeArray",[94,423,324],{"class":314},[94,425,426],{"class":227},"push",[94,428,429],{"class":314},"(",[94,431,432],{"class":306},"new",[94,434,435],{"class":227}," KeyframeEase",[94,437,429],{"class":314},[94,439,440],{"class":359},"0",[94,442,443],{"class":314},",",[94,445,446],{"class":310}," influence",[94,448,449],{"class":314},"));\n",[94,451,453],{"class":96,"line":452},5,[94,454,455],{"class":314},"}\n",[94,457,459,461,463,465,467,470,472,474,476,478],{"class":96,"line":458},6,[94,460,321],{"class":310},[94,462,324],{"class":314},[94,464,261],{"class":227},[94,466,429],{"class":314},[94,468,469],{"class":310},"keyIdx",[94,471,443],{"class":314},[94,473,370],{"class":310},[94,475,443],{"class":314},[94,477,370],{"class":310},[94,479,480],{"class":314},");\n",[19,482],{},[22,484,486],{"id":485},"_148レイヤーのシネマティックイントロ生成","148レイヤーのシネマティックイントロ生成",[27,488,489],{"id":489},"構成",[15,491,492],{},"12秒・3シーン構成のイントロ映像をExtendScriptで自動生成した。テキストアニメーション、シェイプレイヤー、エフェクトを組み合わせて148レイヤー。",[15,494,495],{},"手作業で148レイヤーを並べる気力はないが、スクリプトなら構造を定義するだけで一括生成できる。",[27,497,498],{"id":498},"調整プロセス",[15,500,501],{},"初回レンダリングの結果を見ながら複数回調整を重ねた:",[144,503,504,510,516,522],{},[147,505,506,509],{},[278,507,508],{},"フラッシュトランジション削除",": シーン切替時の白フラッシュが安っぽく見えたので除去",[147,511,512,515],{},[278,513,514],{},"ストローク幅の変更",": 細すぎて視認性が低かったので太く変更",[147,517,518,521],{},[278,519,520],{},"CC Vignette追加",": 画面端を暗くして視線を中央に誘導",[147,523,524,525,528],{},"エフェクトの追加・削除はExtendScriptで ",[35,526,527],{},"property(\"Effects\").addProperty(\"CC Vignette\")"," を叩くだけなので、試行→確認→修正のサイクルが速く回る",[19,530],{},[22,532,533],{"id":533},"実動画素材のコンポジション配置",[27,535,537],{"id":536},"mp4をaeに配置してエフェクト適用","MP4をAEに配置してエフェクト適用",[15,539,540,541,544],{},"実際の動画素材（MP4ファイル）をExtendScriptで ",[35,542,543],{},"app.project.importFile()"," してコンポジションに配置し、カラーグレーディングやトランジションを適用した。",[27,546,548],{"id":547},"layerstretchによるスローモーション","layer.stretchによるスローモーション",[15,550,551,552,555,556,559],{},"動画の再生速度を変更する方法として ",[35,553,554],{},"timeRemap"," と ",[35,557,558],{},"layer.stretch"," がある。",[15,561,562,564,565,567,568,571],{},[35,563,554],{}," は有効化した瞬間にレイヤーのデュレーションが変わり、既存キーフレームとの整合性が崩れる罠が多い。",[35,566,558],{}," は単純にパーセンテージ指定（200で0.5倍速）で、他のプロパティに干渉しない。スローモーション用途なら ",[35,569,570],{},"stretch"," の方が扱いやすかった。",[53,573,575],{"className":297,"code":574,"language":299,"meta":61,"style":61},"layer.stretch = 200; // 0.5倍速（2倍の時間をかけて再生）\n",[35,576,577],{"__ignoreMap":61},[94,578,579,582,584,586,588,591,593],{"class":96,"line":97},[94,580,581],{"class":310},"layer",[94,583,324],{"class":314},[94,585,570],{"class":310},[94,587,315],{"class":314},[94,589,590],{"class":359}," 200",[94,592,396],{"class":314},[94,594,596],{"class":595},"sxvE3"," // 0.5倍速（2倍の時間をかけて再生）\n",[27,598,600],{"id":599},"mp4レンダリング書き出し","MP4レンダリング書き出し",[15,602,603,604,607],{},"最終出力はAEのレンダーキューにOutputModuleを設定してMP4で書き出し。レンダリング設定もExtendScriptから制御できるので、解像度・コーデック・出力先を指定して ",[35,605,606],{},"app.project.renderQueue.render()"," で実行。",[19,609],{},[22,611,612],{"id":612},"学んだこと",[144,614,615,618,621,627,636],{},[147,616,617],{},"AdobeのCOMレジストリはBeta版インストールで壊れる。Beta版を入れるなら仮想環境を使うか、レジストリのバックアップを取っておく",[147,619,620],{},"MCPサーバーは「ツール定義の範囲内」でしか動けない。ExtendScriptを自由に書けるなら、COMやCLI経由の直接実行の方が制約がなく速い",[147,622,623,624,626],{},"After Effectsの ",[35,625,261],{}," はプロパティの次元数に厳密。Scaleは見た目2Dでも内部3D",[147,628,629,630,632,633,635],{},"スローモーションは ",[35,631,554],{}," より ",[35,634,558],{}," が事故りにくい",[147,637,638],{},"148レイヤーの映像をスクリプトで生成→調整→再生成のサイクルは、手作業では到達できない試行回数を稼げる",[640,641,642],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}",{"title":61,"searchDepth":103,"depth":103,"links":644},[645,651,655,659,662,666,671],{"id":24,"depth":103,"text":25,"children":646},[647,648,649,650],{"id":29,"depth":175,"text":30},{"id":44,"depth":175,"text":45},{"id":71,"depth":175,"text":72},{"id":112,"depth":175,"text":112},{"id":124,"depth":103,"text":125,"children":652},[653,654],{"id":134,"depth":175,"text":135},{"id":184,"depth":175,"text":185},{"id":193,"depth":103,"text":194,"children":656},[657,658],{"id":197,"depth":175,"text":198},{"id":208,"depth":175,"text":208},{"id":254,"depth":103,"text":255,"children":660},[661],{"id":265,"depth":175,"text":265},{"id":485,"depth":103,"text":486,"children":663},[664,665],{"id":489,"depth":175,"text":489},{"id":498,"depth":175,"text":498},{"id":533,"depth":103,"text":533,"children":667},[668,669,670],{"id":536,"depth":175,"text":537},{"id":547,"depth":175,"text":548},{"id":599,"depth":175,"text":600},{"id":612,"depth":103,"text":612},"dev","Illustrator MCPサーバーのCOM接続問題（Beta版によるレジストリ上書き）を解決し、最終的にClaude CodeからVBScript経由でExtendScriptを直接実行する方式に到達。After Effectsでは148レイヤーのシネマティックイントロを自動生成","md",{},true,null,"/illustrator-aftereffects-extendscript-automation","misc-dev",false,"2026-03-25T00:00:00.000Z",{"title":5,"description":673},"2026-03/2026-03-25/illustrator-aftereffects-extendscript-automation",[685,686,687,688,689,690,691],"ExtendScript","Illustrator","After Effects","COM","VBScript","Claude Code","自動化","memo","cpjoDqBhM9FFDNuT5we8mU3w9VHFvyA2VtOPIFCrXHM",[],"https://log.eurekapu.com/og/blog/illustrator-aftereffects-extendscript-automation.png?v=2026-03-25T00%3A00%3A00.000Z&title=Illustrator%2FAfter%20Effects%20ExtendScript%E8%87%AA%E5%8B%95%E5%8C%96%20-%20COM%E6%8E%A5%E7%B6%9A%E3%81%AE%E7%BD%A0%E3%81%A8Claude%20Code%E3%81%8B%E3%82%89%E3%81%AE%E7%9B%B4%E6%8E%A5%E5%AE%9F%E8%A1%8C&author=Kei%20Komatsu&sig=f20082530bb9528f",1782528820676]