[{"data":1,"prerenderedAt":613},["ShallowReactive",2],{"content-/after-effects-extension-architecture":3,"all-pages-for-dir":593,"related-/after-effects-extension-architecture":594,"og-image-/after-effects-extension-architecture":612},{"id":4,"title":5,"body":6,"category":577,"concepts":577,"description":578,"extension":579,"meta":580,"navigation":581,"ogImage":577,"path":582,"project_name":577,"published":583,"publishedAt":584,"seo":585,"source":577,"stem":586,"tags":587,"todo":577,"unpublished":583,"updatedAt":577,"__hash__":592},"pages/2026-08/2026-08-12/after-effects-extension-architecture.md","After Effects の拡張構造と、外部プロセスから操作する経路",{"type":7,"value":8,"toc":566},"minimark",[9,13,16,19,24,27,83,86,94,97,109,112,124,127,134,144,155,166,170,173,187,193,207,216,223,226,229,277,280,299,312,321,324,333,336,345,356,370,377,380,450,453,468,471,474,488,491,495,498,501,508,511,514,539,542,545,548,555,562],[10,11,12],"p",{},"After Effects を AI から操作する MCP サーバーが、この数か月でいくつも公開されている。",[10,14,15],{},"実装を1つ開いてみると、Adobe の内部APIを解析した形跡はどこにもなかった。\n使っているのは、Adobe が20年以上前から公開しているスクリプティングAPIだけである。",[10,17,18],{},"ただしそのAPIには、古い時代の制約がそのまま残っている。\n制約は実装の細部にまで影響していて、外部プロセスから AE を操作しようとすると設計の選択肢が2つに絞られる。",[20,21,23],"h2",{"id":22},"aeを拡張する3つの層","AEを拡張する3つの層",[10,25,26],{},"AE を拡張する仕組みは、性格の違う3つの層でできている。",[28,29,30,46],"table",{},[31,32,33],"thead",{},[34,35,36,40,43],"tr",{},[37,38,39],"th",{},"層",[37,41,42],{},"実体",[37,44,45],{},"守備範囲",[47,48,49,61,72],"tbody",{},[34,50,51,55,58],{},[52,53,54],"td",{},"C++ SDK",[52,56,57],{},"AEGP プラグイン、エフェクトプラグイン",[52,59,60],{},"メニュー項目の追加、内部コマンドのフック、ドッキング可能なパネルの追加、レンダーキューの管理",[34,62,63,66,69],{},[52,64,65],{},"ExtendScript",[52,67,68],{},"ES3 のスクリプトエンジン",[52,70,71],{},"プロジェクト、コンポジション、レイヤー、プロパティ、キーフレームの読み書き",[34,73,74,77,80],{},[52,75,76],{},"CEP",[52,78,79],{},"Chromium と Node.js を内蔵した HTML パネル",[52,81,82],{},"パネルのUI、ネットワーク通信、ファイル操作",[10,84,85],{},"見落とされやすいのが CEP の位置である。\nCEP 12 は Chromium 99 と Node.js 17.7.1 を内蔵していて、パネル内では Node のモジュールがそのまま動く。",[10,87,88,89,93],{},"ところが CEP パネルは AE のプロジェクトデータに直接アクセスできない。\n",[90,91,92],"code",{},"CSInterface.evalScript()"," に ExtendScript のコードを文字列で渡し、AE 側のエンジンに実行させて、結果をコールバックで受け取る。\nCEP のドキュメントには、渡したスクリプトが「ホストアプリケーションのメインスレッドで動く ExtendScript エンジン」で実行されると書かれている。",[10,95,96],{},"つまり CEP が担当するのは UI と外部通信であって、AE を操作する部分は結局 ExtendScript が引き受ける。",[98,99,100,105],"figure",{},[101,102],"img",{"src":103,"alt":104},"/images/after-effects-extension-architecture/figure-01.svg","CEPパネルと外部プロセスはExtendScriptエンジンを経由してAEのプロジェクトDOMに到達し、C++プラグインだけがDOMへ直接アクセスする",[106,107,108],"figcaption",{},"図1: C++プラグインを除けば、AEのデータに触る道はExtendScriptに集まる",[10,110,111],{},"C++ SDK だけは別格で、スクリプトからは届かない領域に手が入る。\nAE 内部のコマンドをフックして横取りする、AE のUIに溶け込むパネルを追加する、といったことができる。\nただしコンパイルしたバイナリの配布とインストールが必要になるので、コマンド1行で入る道具にはならない。",[10,113,114,115,119,120,123],{},"Adobe が新世代の拡張基盤として用意した ",[116,117,118],"strong",{},"UXP は、After Effects では使えない","。\nPhotoshop や InDesign が移行を済ませた一方、2026年8月時点でも ",[90,121,122],{},"developer.adobe.com/after-effects/uxp/"," にあたる公式ページが存在しない。\nAE の拡張は CEP と ExtendScript の組み合わせが現役のままである。",[20,125,126],{"id":126},"スクリプトから見たプロジェクトの形",[10,128,129,130,133],{},"ExtendScript から見た AE は、",[90,131,132],{},"app"," を頂点とする木になっている。",[135,136,142],"pre",{"className":137,"code":139,"language":140,"meta":141},[138],"language-text","app\n└─ project\n   └─ item (CompItem / FootageItem / FolderItem)\n      └─ layer\n         └─ property (PropertyGroup / Property)\n            └─ keyframe\n","text","",[90,143,139],{"__ignoreMap":141},[10,145,146,147,150,151,154],{},"この木の形は、AE を操作するツールの語彙にそのまま現れる。\n",[90,148,149],{},"layer.create_solid"," や ",[90,152,153],{},"keyframe.add"," のような操作名は、DOM の階層を操作の名前へ写したものである。",[10,156,157,158,161,162,165],{},"もう一つ、外部から操作するときに効いてくるのが取り消しの単位である。\n",[90,159,160],{},"app.beginUndoGroup()"," と ",[90,163,164],{},"app.endUndoGroup()"," で囲んだ一連の操作は、AE 上で1つの取り消し単位にまとまる。\n1リクエストをこれで囲んでおけば、意図しない操作が入っても取り消し1回で戻せる。",[20,167,169],{"id":168},"extendscriptランタイムに残っている制約","ExtendScriptランタイムに残っている制約",[10,171,172],{},"外部連携の設計を縛っているのは、このエンジン自体の性質である。",[10,174,175,178,179,182,183,186],{},[116,176,177],{},"エンジンの言語仕様は ECMA-262 3rd Edition","、つまり1999年の JavaScript である。\n",[90,180,181],{},"JSON"," オブジェクトが無い。\nそのため JSON を扱うには、",[90,184,185],{},"json2.js"," 相当の実装を自前で持ち込む必要がある。",[10,188,189,192],{},[116,190,191],{},"スクリプトは AE のメインスレッドで動く。","\n実行している間、AE のUIは応答しない。",[10,194,195,198,199,202,203,206],{},[116,196,197],{},"ソケットはあるが、待ち受けサーバーには向かない。","\nExtendScript には ",[90,200,201],{},"Socket"," オブジェクトがあるものの、非同期に対応しておらず、SSL も使えない。\nmacOS では ",[90,204,205],{},"listen()"," が false を返すという報告が続いている。\n待ち受けようとすれば無限ループで回すことになり、その間 AE を人間が操作できなくなる。",[10,208,209,215],{},[116,210,211,214],{},[90,212,213],{},"app.scheduleTask()"," による擬似的な非同期にも穴がある。","\n呼び出しのたびに新しい JavaScript VM でプロセスが作られるため、グローバル以外の変数が見えない。\nそしてアラートや環境設定など、AE が何かウィンドウを開いた瞬間に動作が止まる。",[10,217,218,219,222],{},"これらを重ねると、",[116,220,221],{},"AE のプロセスの中に常駐サーバーを置く設計は分が悪い","という結論になる。",[20,224,225],{"id":225},"外部から操作する2つの設計",[10,227,228],{},"常駐サーバーが現実的でないとなると、外部プロセスから AE を操作する経路は実質2つになる。",[28,230,231,247],{},[31,232,233],{},[34,234,235,238,241,244],{},[37,236,237],{},"方式",[37,239,240],{},"通信の担い手",[37,242,243],{},"導入",[37,245,246],{},"往復のコスト",[47,248,249,263],{},[34,250,251,254,257,260],{},[52,252,253],{},"CEPパネル常駐",[52,255,256],{},"パネル内の Node がソケットで外部とつながる",[52,258,259],{},"拡張パネルのインストールが必要",[52,261,262],{},"低い",[34,264,265,268,271,274],{},[52,266,267],{},"都度起動とファイル受け渡し",[52,269,270],{},"起動のたびにスクリプトを送り込む",[52,272,273],{},"インストール不要",[52,275,276],{},"高い",[10,278,279],{},"後者の入口として、Adobe は2つのコマンドを公式に用意している。",[281,282,283,290],"ul",{},[284,285,286,287],"li",{},"Windows: ",[90,288,289],{},"afterfx.exe -r \u003Cスクリプトのパス>",[284,291,292,293,161,296],{},"macOS: AppleScript の ",[90,294,295],{},"DoScript",[90,297,298],{},"DoScriptFile",[10,300,301,302,311],{},"どちらも ",[303,304,310],"a",{"href":305,"target":306,"rel":307},"https://ae-scripting.docsforadobe.dev/introduction/overview/","_blank",[308,309],"noopener","noreferrer","After Effects Scripting Guide"," に記載された正規の実行方法である。\nリバースエンジニアリングの余地はない。",[10,313,314,315,320],{},"前者の実例として、Mike Chambers による ",[303,316,319],{"href":317,"target":306,"rel":318},"https://github.com/mikechambers/adb-mcp",[308,309],"adb-mcp"," がある。\nPhotoshop、Premiere Pro、InDesign を対象に、UXP プラグインが localhost のプロキシサーバーへ WebSocket でつなぐ構成をとっている。\nUXP プラグインもソケットの待ち受け側にはなれないため、あいだにプロキシを挟んでいる。\nAE は UXP に対応していないので、同じことをするなら CEP パネルで組み直すことになる。",[20,322,323],{"id":323},"ファイル受け渡し方式の実装",[10,325,326,327,332],{},"後者の実装として、2026年8月8日に公開された ",[303,328,331],{"href":329,"target":306,"rel":330},"https://github.com/kumoproductions/mcp-aftereffects",[308,309],"kumoproductions/mcp-aftereffects"," を読んだ。\nTypeScript、MIT ライセンス、Windows と macOS の両対応である。",[10,334,335],{},"この実装は、OSの一時ディレクトリを郵便受けとして使う。",[98,337,338,342],{},[101,339],{"src":340,"alt":341},"/images/after-effects-extension-architecture/figure-02.svg","MCPサーバーがリクエストをファイルに書き、AfterFXを起動してディスパッチャを実行させ、AE側が応答をファイルに書き、MCPサーバーがポーリングで拾うシーケンス",[106,343,344],{},"図2: プロセス間のやりとりは、すべて一時ディレクトリのファイルを介する",[10,346,347,348,351,352,355],{},"書き込みはどちらの向きも ",[90,349,350],{},".tmp"," に書いてから ",[90,353,354],{},"rename"," する。\n書きかけのファイルを相手に読まれる事故を防ぐためである。",[10,357,358,359,362,363,366,367,369],{},"AE 側のディスパッチャは、候補ディレクトリを走査して最も古いリクエストを1件だけ処理する。\n",[116,360,361],{},"読み込んだ時点でファイルを削除する","ので、起動が重なっても同じリクエストが二度実行されない。\n実行そのものは ",[90,364,365],{},"new Function(\"app\", \"log\", \"payload\", request.code)"," で、",[90,368,132],{}," を引数として渡している。",[10,371,372,373,376],{},"多重起動への備えもある。\n",[90,374,375],{},"open(\"wx\")"," でロックファイルをアトミックに作成し、MCPサーバーのプロセスが複数立っても衝突しない。\nロックの更新時刻が古ければ、落ちたプロセスの残骸とみなして削除する。",[10,378,379],{},"ES3 と格闘した跡も残っている。",[135,381,385],{"className":382,"code":383,"language":384,"meta":141,"style":141},"language-javascript shiki shiki-themes vitesse-light vitesse-light","JSON.stringify(request).replace(/\\u2028/g, \"\\\\u2028\")\n","javascript",[90,386,387],{"__ignoreMap":141},[388,389,392,395,399,403,406,409,412,415,417,421,425,427,431,434,437,440,444,447],"span",{"class":390,"line":391},"line",1,[388,393,181],{"class":394},"s4oTP",[388,396,398],{"class":397},"shFtX",".",[388,400,402],{"class":401},"senZ8","stringify",[388,404,405],{"class":397},"(",[388,407,408],{"class":394},"request",[388,410,411],{"class":397},").",[388,413,414],{"class":401},"replace",[388,416,405],{"class":397},[388,418,420],{"class":419},"sMJiu","/",[388,422,424],{"class":423},"snbK4","\\u2028",[388,426,420],{"class":419},[388,428,430],{"class":429},"sHkkW","g",[388,432,433],{"class":397},",",[388,435,436],{"class":419}," \"",[388,438,439],{"class":423},"\\\\",[388,441,443],{"class":442},"sdGka","u2028",[388,445,446],{"class":419},"\"",[388,448,449],{"class":397},")\n",[10,451,452],{},"U+2028 と U+2029 は行区切りの制御文字で、ES3 のパーサはこれを見ると文字列リテラルが終わったと判断してしまう。\nテキストレイヤーの中身にこの文字が混ざれば、リクエストはその位置で壊れる。\n上のエスケープはその対策である。",[10,454,455,456,459,460,463,464,467],{},"MCP のツール設計も、この方式に合わせてある。\n操作ごとにツールを定義するのではなく、",[90,457,458],{},"ae_catalog"," で操作の一覧を引かせ、",[90,461,462],{},"ae_do(operation, args)"," の1本で実行する。\n複数の操作は ",[90,465,466],{},"batch.run"," にまとめさせる。\n1往復ごとにプロセス起動とポーリングが挟まる方式なので、往復回数を減らす作りになっている。",[20,469,470],{"id":470},"動かす前に必要な設定",[10,472,473],{},"どちらの方式でも共通して引っかかるのが、AE 側の環境設定である。",[10,475,476,477,480,481,484,485,487],{},"「スクリプトによるファイルへの書き込みとネットワークへのアクセスを許可」は",[116,478,479],{},"既定でオフ","になっている。\nオフのままでは ExtendScript から ",[90,482,483],{},"File"," の書き込みも ",[90,486,201],{}," も使えない。\nファイル受け渡し方式は、この設定に完全に依存する。",[10,489,490],{},"macOS ではさらに、osascript が AE を操作するためのオートメーション許可をユーザーが手で与える必要がある。",[20,492,494],{"id":493},"公式コネクタにafter-effectsが無い理由","公式コネクタにAfter Effectsが無い理由",[10,496,497],{},"Adobe は2026年4月28日に、公式の MCP コネクタ「Adobe for creativity」を提供開始している。\nPhotoshop、Lightroom、Illustrator、Firefly、Express、Premiere、InDesign、Stock を対象に50を超えるツールが並ぶ。\nそこに After Effects は入っていない。",[10,499,500],{},"ここまでの構造をふまえると、理由は2つに分けて読める。",[10,502,503,504,507],{},"一つは、公式コネクタが",[116,505,506],{},"クラウド側のAPIを MCP にしたもの","であること。\n手元で起動しているアプリケーションを操作する仕組みではない。\nAE の自動化は手元のプロジェクトファイルを対象とするので、層が違う。",[10,509,510],{},"もう一つは、手元の AE を公式に組み込もうとすると拡張基盤の問題に突き当たること。\nPhotoshop や Premiere Pro が UXP へ移行した一方で、AE の足元には ES3 のエンジンが残っている。\n公式が AE を対象に加えるには、その上に何を載せるかを先に決める必要がある。",[10,512,513],{},"コミュニティ側の実装は、すでにいくつも並んでいる。",[281,515,516,524,531],{},[284,517,518,523],{},[303,519,522],{"href":520,"target":306,"rel":521},"https://github.com/TheLlamainator/after-effects-mcp",[308,309],"TheLlamainator/after-effects-mcp","（CEPパネル常駐型）",[284,525,526],{},[303,527,530],{"href":528,"target":306,"rel":529},"https://github.com/Dakkshin/after-effects-mcp",[308,309],"Dakkshin/after-effects-mcp",[284,532,533,538],{},[303,534,537],{"href":535,"target":306,"rel":536},"https://github.com/Aodaruma/adobe-mcp-rs",[308,309],"Aodaruma/adobe-mcp-rs","（Rust実装）",[10,540,541],{},"通信方式とツール設計に違いはあるものの、AE のデータに触る部分が ExtendScript である点はいずれも共通している。\n作者ごとの好みの差ではなく、AE の構造が選択肢を絞っているためである。",[20,543,544],{"id":544},"業務のプロジェクトで試す前に",[10,546,547],{},"読んだ実装の README には、AI が読み取った情報が外部のAIサービスへ送られる可能性が明記されていた。\nコンポジション名、レイヤー名、エクスプレッション、フッテージのファイルパスが対象になる。",[10,549,550,551,554],{},"任意の ExtendScript を実行する機能は既定で無効化され、読み取り専用で動かす環境変数も用意されている。\nとはいえ実行の仕組みは ",[90,552,553],{},"new Function"," なので、有効にすれば任意のコードが AE の権限で走る。",[10,556,557,558,561],{},"秘密保持契約のかかった案件のプロジェクトで、いきなり試すものではない。\nまずバックアップか検証用の ",[90,559,560],{},".aep"," で挙動を確かめるのが順当だと考える。",[563,564,565],"style",{},"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 .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}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);}",{"title":141,"searchDepth":567,"depth":567,"links":568},2,[569,570,571,572,573,574,575,576],{"id":22,"depth":567,"text":23},{"id":126,"depth":567,"text":126},{"id":168,"depth":567,"text":169},{"id":225,"depth":567,"text":225},{"id":323,"depth":567,"text":323},{"id":470,"depth":567,"text":470},{"id":493,"depth":567,"text":494},{"id":544,"depth":567,"text":544},null,"AEの拡張はC++ SDK、ExtendScript、CEPの3層で、UXPは未対応のまま残っている。この構造が、外部からAEを操作するツールの設計を2つに絞っている。","md",{},true,"/after-effects-extension-architecture",false,"2026-08-12T00:00:00.000Z",{"title":5,"description":578},"2026-08/2026-08-12/after-effects-extension-architecture",[588,65,589,590,591],"After Effects","Adobe","MCP","拡張機能","vBKLx0BE4lO1wqEgxlytGGyt-_-J_4-_bBH8kP7pNFw",[],[595,599,602,605,608],{"title":596,"path":597,"publishedAt":598},"2026年3月25日の開発日記 - EDINET API財務比較・会計Chrome拡張マトリクスUI・Adobe ExtendScript自動化","/2026-03-25-diary","2026-03-25T00:00:00.000Z",{"title":600,"path":601,"publishedAt":598},"Illustrator/After Effects ExtendScript自動化 - COM接続の罠とClaude Codeからの直接実行","/illustrator-aftereffects-extendscript-automation",{"title":603,"path":604,"publishedAt":584},"Chrome DevTools MCPが33個のNodeを起動していた：メモリ2.12GBの内訳","/chrome-devtools-mcp-node-memory",{"title":606,"path":607,"publishedAt":584},"疑問が湧いた順に5本書いた1日：After Effects の拡張構造から VRAM の壁まで","/five-articles-in-a-day",{"title":609,"path":610,"publishedAt":611},"Cloudflare の Kitesurf は Chrome を置き換えない — 画面のないブラウザに何が移せるか","/cloudflare-kitesurf-agent-browser","2026-08-11T00:00:00.000Z","https://log.eurekapu.com/og/blog/after-effects-extension-architecture.png?v=2026-08-12T00%3A00%3A00.000Z&title=After%20Effects%20%E3%81%AE%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E3%81%A8%E3%80%81%E5%A4%96%E9%83%A8%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8B%E3%82%89%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E7%B5%8C%E8%B7%AF&author=Kei%20Komatsu&sig=3e4e7499a816c9ba",1786603510702]