Generated banner for Adobe Illustrator Integrations
Generated logo for Adobe Illustrator Integrations

Adobe Illustrator Integrations

GitHubOfficialFirst committed by jhaugaDistributed by GitHub

  • Skill
  • Tool integration
  • Software development
  • MIT
  • No issues found

From the author

Build, debug, package, and document Adobe Illustrator integrations: CEP extension panels, C++ SDK plug-ins (.aip), the coming UXP plugins, MCP servers that drive Illustrator, computer-use automation, and OS scripts (batch, PowerShell, bash, AppleScript) that run ExtendScript in Illustrator. Use when creating or fixing an Illustrator extension or plug-in, choosing between a script, extension, or plug-in, connecting an AI tool to Illustrator, automating Illustrator from the command line, or writing install and usage docs for an Illustrator tool someone will publish. Pairs with adobe-illustrator-scripting for the ExtendScript DOM.
— the description by jhauga

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides comprehensive guidance for extending Adobe Illustrator. It covers the full lifecycle of integration development, from choosing the right delivery method—such as CEP extension panels, native C++ plug-ins, or external automation via MCP servers and OS scripts—to packaging and documentation. It emphasizes maintaining a clean separation between the user interface and the core ExtendScript logic to ensure future compatibility with emerging technologies like UXP.

What it does

  • Guides the selection of the appropriate integration tier for Illustrator features.
  • Provides patterns for building CEP extension panels and native C++ (.aip) plug-ins.
  • Details methods for running Illustrator scripts from external environments like PowerShell, bash, or Python.
  • Supports the design of MCP servers to enable AI-driven interaction with Illustrator.
  • Outlines best practices for packaging, signing, and documenting Illustrator tools for distribution.
  • Offers strategies for maintaining compatibility across different Illustrator versions and operating systems.

When to use it

  • When you need to create a custom panel or tool for Adobe Illustrator.
  • When automating Illustrator tasks from an external command-line tool or AI agent.
  • When deciding between a script, a CEP extension, or a native C++ plug-in.
  • When preparing documentation for an Illustrator tool or extension you intend to publish.
  • When debugging communication between an external process and the Illustrator host application.

Advantages

  • Promotes a modular architecture that simplifies future migration to UXP.
  • Provides clear, version-aware guidance for managing the transition away from CEP.
  • Standardizes the approach to external automation and parameter passing.
  • Encourages safe development practices like working on document copies and avoiding hardcoded secrets.

Usage examples

“How do I trigger an Illustrator script from a Python script on Windows?”
The agent provides a code snippet using win32com.client to dispatch the Illustrator.Application and execute the script via DoJavaScriptFile.
“What is the recommended folder structure for a new CEP extension?”
The agent outlines the standard directory layout, including CSXS/manifest.xml, index.html, and the required jsx/host.jsx file.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/github/adobe-illustrator-integrations/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip adobe-illustrator-integrations.zip -d .agents/skills

Documentation by jhauga

Adobe Illustrator Integrations

Guidance for everything that sits around an Illustrator script: the panel a user clicks, the native plug-in that adds a tool, the command line or AI agent that starts Illustrator work from outside, and the documentation that ships with it. For the Illustrator DOM itself (documents, layers, paths, colors, exports), use the adobe-illustrator-scripting skill.

When to Use This Skill

  • Choosing how to deliver an Illustrator feature: a script, a CEP extension, a C++ plug-in, a UXP plugin, an MCP server, or an OS automation script

  • Building or fixing a CEP extension panel (HTML, JavaScript, and an ExtendScript host)

  • Building or fixing a C++ plug-in (.aip) with the Illustrator SDK

  • Running .jsx scripts from batch, PowerShell, bash, Python, or AppleScript, including passing parameters and reading results

  • Building or reviewing an MCP server that lets an AI tool drive Illustrator

  • Working in Illustrator through a computer-use tool when no scripting route exists

  • Writing step-by-step instructions people follow by hand, or install and usage docs for an asset, script, extension, or plug-in someone will publish

  • Organizing the files of an Illustrator project (sources, linked assets, exports, docs) so automation can find them

Script, Extension, or Plug-in

Adobe's own terms:

  • A script is ExtendScript (.jsx), AppleScript, or VBScript run against Illustrator's scripting object model. It has no persistent UI beyond ScriptUI dialogs.

  • An extension is a CEP panel: an HTML and JavaScript UI hosted in Illustrator that calls ExtendScript through CSInterface.evalScript.

  • A plug-in is native code built with the Illustrator C++ SDK (.aip). In apps that already run UXP (Photoshop, InDesign, Premiere Pro), "plugin" also means a UXP plugin; Illustrator UXP plugins are not public yet.

OptionWhat it isUIInstalls toShips asPick it when
Manual instructionsSteps a person followsIllustrator's ownNothingA documentThe task is rare, or needs judgment at every step
ExtendScript script.jsx run in IllustratorOptional ScriptUI dialogPresets/<locale>/Scripts or anywhere (File > Scripts > Other Script).jsx fileOne action, batch work, or a step another tool calls
CEP extensionHTML panel plus ExtendScript hostDockable panelCEP extensions folderSigned .zxpUsers need a persistent panel with controls and previews
C++ plug-inNative .aip from the Illustrator SDKTools, menus, notifiers, native dialogsPlug-ins folder or the Additional Plug-ins Folder.aip per OS and major versionYou need a custom tool, live effects, speed, or events scripts cannot reach
UXP pluginModern JavaScript plugin modelPanels and dialogsThrough Creative Cloud.ccxPlan for it; Illustrator's public beta is due by Spring 2027
MCP serverA process an AI tool calls, which runs scripts in IllustratorThe AI tool's chatThe AI tool's MCP configA package or repoAn agent should create or inspect artwork through tools
OS automationBatch, PowerShell, bash, or AppleScript that starts scriptsNoneAnywhereScript filesIllustrator work is one step of a larger pipeline

Start with the lowest tier that meets the need. A script that works is the core of every higher tier: a CEP panel, an MCP tool, and an OS script all end up calling ExtendScript.

Extensibility Timeline

From Adobe's announcement "Investing in the future of Creative Cloud extensibility" (blog.developer.adobe.com, September 2026):

  • Illustrator UXP plugins: public beta by Spring 2027.

  • CEP in Illustrator, After Effects, and Media Encoder: the Adobe Marketplace stops accepting new CEP submissions in December 2028, and CEP is disabled by default from December 2028.

  • CEP leaves these apps from December 2029, with at least two years between each app's UXP public beta and CEP's removal from new versions.

  • ExtendScript is not affected by the transition.

So a CEP extension built today has a working life of a few years. Keep its logic in plain ExtendScript files the panel calls, which carry over to a UXP plugin or an MCP server unchanged.

Workflow

  1. Scope: what the user does, which Illustrator versions and OSes it must run on, and who installs it.

  2. Pick the tier from the table above.

  3. Write the ExtendScript core first with the adobe-illustrator-scripting skill, as functions that take a plain settings object and return a result string, so any front end can call them.

  4. Add the front end:

  5. Test inside Illustrator on a copy of a real document: run every option, export a PNG of the result, and compare it with the expected output.

  6. Package: a signed ZXP for CEP, a per-OS .aip for plug-ins, a versioned folder or package for scripts and servers.

  7. Document with references/publishing-docs.md: requirements, compatibility, install steps per OS, a walkthrough with screenshots, a GIF, troubleshooting, and a changelog.

Running a Script From Outside Illustrator

PlatformRouteNotes
WindowsCOM Illustrator.ApplicationDoJavaScriptFile(JavaScriptFile, [Arguments], [ExecutionMode]) and DoJavaScript(JavaScriptCode, [Arguments], [ExecutionMode]); ExecutionMode 1 never shows the debugger
macOSAppleScript do javascriptdo javascript "$.evalFile(new File(arguments[0]))" with arguments {scriptPath}, with the path passed to osascript as an argument so it never enters script source; check the exact app name for your version
BothVS Code ExtendScript DebuggerAdobe's extension for running and debugging .jsx against a running app
Windows (legacy)ExtendScript Toolkit -run32-bit, does not run on macOS 10.15 or later; keep only for old pipelines

Pass parameters through a sidecar key=value file (no JSON parser or eval needed in ES3) and have the script write its result to a file, because arguments handling differs between launchers. The patterns are in references/automation-and-mcp.md.

Instructions People Follow by Hand

When the deliverable is a set of steps rather than code (for a complex graphic, or for an asset someone downloads):

  • Name the Illustrator version the steps were checked on, and give menu paths exactly as they appear (Object > Path > Offset Path).

  • One action per step, with the panel and the value to set (Stroke panel: Weight 2 pt, Align Stroke to Inside).

  • Show the expected result after each group of steps, with a screenshot or a small PNG.

  • Mark the steps that differ on Windows and macOS (shortcuts, file dialogs, font paths).

  • Offer the scripted route next to the manual one when a script exists.

Guardrails

  • Work on copies of user documents; never overwrite an original without a backup.

  • Ask before writing into Adobe's install folders, the system CEP folder, or the registry.

  • Development mode (PlayerDebugMode) belongs on development machines only. Ship signed ZXPs to users.

  • Never commit signing certificates, certificate passwords, API keys, or tokens. Read secrets from environment variables.

  • Prefer scripting, COM, or AppleScript over clicking through the UI; use computer use only for what has no scripting route.

  • Never automate around sign-in, licensing, or account dialogs.

  • Fonts from Adobe Fonts cannot be bundled in a plug-in or extension; document them as a requirement instead.

  • Version-specific details (CEP version, SDK version, menu names) change; say which version you checked and point to Adobe's docs.

References

Files

references/automation-and-mcp.md

Automation, MCP Servers, and Computer Use

Every route from outside Illustrator ends in the same place: ExtendScript running inside Illustrator. This file covers starting that script from an OS script or another language, passing it parameters, reading its result, wrapping it as an MCP server for AI tools, and the rules for computer-use sessions when no scripting route exists.

Starting a Script From Outside

Windows: COM

Illustrator registers the COM class Illustrator.Application (version-specific Illustrator.Application.<major>). Its scripting methods, from the type library Illustrator installs:

MethodParameters
DoJavaScriptFileJavaScriptFile, optional Arguments (array), optional ExecutionMode
DoJavaScriptJavaScriptCode (a string of ExtendScript), optional Arguments, optional ExecutionMode
DoScriptAction, From (action set), optional Dialogs: plays a recorded action

ExecutionMode values: 1 aiNeverShowDebugger, 2 aiDebuggerOnError, 3 aiBeforeRunning. Use 1 for unattended runs. The call returns when the script finishes, with the value of the script's last expression as a string.

PowerShell:

$ai = New-Object -ComObject Illustrator.Application   # starts Illustrator if it is not running
$result = $ai.DoJavaScriptFile('C:\Users\<user>\Documents\AcmeTools\export-artboards.jsx', @(), 1)
Write-Output $result

Python (pywin32):

import win32com.client

app = win32com.client.Dispatch("Illustrator.Application")
result = app.DoJavaScriptFile(r"C:\Users\<user>\Documents\AcmeTools\export-artboards.jsx", [], 1)
print(result)

If the call fails with "JavaScript code was missing", the .jsx path does not exist or cannot be read.

macOS: AppleScript
osascript - "/Users/<user>/Documents/AcmeTools/export-artboards.jsx" <<'APPLESCRIPT'
on run argv
  tell application "Adobe Illustrator"
    do javascript "$.evalFile(new File(arguments[0]))" with arguments {item 1 of argv}
  end tell
end run
APPLESCRIPT

The script path travels as an osascript argument and reaches ExtendScript through with arguments, so it never becomes part of either script's source: a path with quotes cannot break the call or inject code. do javascript also accepts a file reference, but some versions have rejected file arguments; evaluating the file with $.evalFile from a fixed code string works across versions. Check the application name for your install if tell application cannot find it.

Debugging and Legacy Routes
  • VS Code ExtendScript Debugger (Adobe, Marketplace ID Adobe.extendscript-debug): run and debug .jsx against a running Illustrator. This is Adobe's replacement for ExtendScript Toolkit.

  • ExtendScript Toolkit (-run script.jsx): 32-bit, will not run on macOS 10.15 or later, and needs a workaround for debugger error #1116. Keep it only for old pipelines that already depend on it.

Parameters and Results

arguments handling differs between launchers (ExtendScript Toolkit -run and BridgeTalk do not pass them through), so use arguments only to hand over the script path, as in the AppleScript launcher above, and pass the job's parameters in a sidecar file that the script reads, with the result written to another file. Folder.temp in ExtendScript is the OS temp folder, which both sides can find. For the script side of external runs (arguments[], $.getenv, $.fileName, logging), see the adobe-illustrator-scripting skill's External Invocation & Argument Passing section.

Parameter file written by the caller as key=value lines, %TEMP%\acme-export-params.txt on Windows or $TMPDIR/acme-export-params.txt on macOS:

outputFolder=C:\Users\<user>\Documents\AcmeExports
scale=200

ExtendScript has no JSON parser, and a key=value file needs none, so nothing in the file is ever run as code. For nested data, bundle json2.js and use its JSON.parse, never eval.

export-artboards.jsx (ES3):

(function () {
  var paramsFile = new File(Folder.temp + '/acme-export-params.txt');
  var resultFile = new File(Folder.temp + '/acme-export-result.json');

  // key=value lines; values stay plain text, so nothing in the file is evaluated.
  function readParams(file) {
    var params = {};
    file.encoding = 'UTF-8';
    if (!file.open('r')) { return null; }
    while (!file.eof) {
      var line = file.readln().replace(/\r$/, '');
      var at = line.indexOf('=');
      if (at > 0) { params[line.substring(0, at)] = line.substring(at + 1); }
    }
    file.close();
    return params;
  }

  // JSON string literal: escapes backslash, quote, and every control character,
  // so multi-line error messages still parse.
  function quote(value) {
    return '"' + String(value).replace(/[\\"\u0000-\u001f]/g, function (ch) {
      if (ch === '\\' || ch === '"') { return '\\' + ch; }
      return '\\u' + ('000' + ch.charCodeAt(0).toString(16)).slice(-4);
    }) + '"';
  }

  function writeResult(ok, message) {
    resultFile.encoding = 'UTF-8';
    resultFile.open('w');
    resultFile.write('{"ok":' + (ok ? 'true' : 'false') + ',"message":' + quote(message) + '}');
    resultFile.close();
  }

  var previous = app.userInteractionLevel;
  app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;
  try {
    if (!paramsFile.exists) { writeResult(false, 'Parameter file not found.'); return; }
    var params = readParams(paramsFile);
    if (!params) { writeResult(false, 'Cannot read the parameter file.'); return; }
    var scale = Number(params.scale);
    if (!params.outputFolder || !isFinite(scale) || scale <= 0) {
      writeResult(false, 'Parameters need outputFolder and a positive scale.');
      return;
    }
    if (!app.documents.length) { writeResult(false, 'No document is open.'); return; }
    // Export work goes here (see the adobe-illustrator-scripting skill).
    writeResult(true, 'Exported at ' + scale + '% to ' + params.outputFolder);
  } catch (e) {
    writeResult(false, 'Line ' + e.line + ': ' + e.message);
  } finally {
    app.userInteractionLevel = previous;
  }
}());

Batch caller (Windows):

@echo off
setlocal
set "_script=%~dp0export-artboards.jsx"
set "_params=%TEMP%\acme-export-params.txt"
set "_result=%TEMP%\acme-export-result.json"

if exist "%_result%" del /Q "%_result%"
powershell -NoProfile -Command "[System.IO.File]::WriteAllLines($env:_params, @(('outputFolder=' + $env:USERPROFILE + '\Documents\AcmeExports'), 'scale=200'), (New-Object System.Text.UTF8Encoding))"

powershell -NoProfile -Command "$ai = New-Object -ComObject Illustrator.Application; [void]$ai.DoJavaScriptFile($env:_script, @(), 1)"

if not exist "%_result%" (
  echo Illustrator did not write a result file.
  exit /b 1
)
type "%_result%"
findstr /c:"\"ok\":true" "%_result%" >nul || exit /b 1
exit /b 0

bash caller (macOS):

#!/usr/bin/env bash
set -euo pipefail
script="$(cd "$(dirname "$0")" && pwd)/export-artboards.jsx"
params="${TMPDIR%/}/acme-export-params.txt"
result="${TMPDIR%/}/acme-export-result.json"

rm -f "$result"
printf 'outputFolder=%s\nscale=200\n' "$HOME/Documents/AcmeExports" > "$params"

# The path is an osascript argument, passed on with "with arguments", so it is never part of any script source.
osascript - "$script" <<'APPLESCRIPT'
on run argv
  tell application "Adobe Illustrator"
    do javascript "$.evalFile(new File(arguments[0]))" with arguments {item 1 of argv}
  end tell
end run
APPLESCRIPT

[[ -f "$result" ]] || { echo "Illustrator did not write a result file." >&2; exit 1; }
cat "$result"
grep -q '"ok":true' "$result"

Pipeline tips:

  • Illustrator runs one script at a time. Queue calls; never start two at once.

  • Save outputs with saveAs or export calls into an output folder; never save over the source document.

  • Log per user, for example C:\Users\<user>\AppData\Local\AcmeTools\logs\ or ~/Library/Logs/AcmeTools/.

  • If a run hangs, a modal dialog is usually open in Illustrator; set userInteractionLevel as above.

MCP Servers for Illustrator

An Illustrator MCP server is a process an AI tool starts (usually over stdio) that exposes tools; each tool runs ExtendScript in Illustrator through COM or AppleScript and returns the result.

AI tool  <->  MCP server (stdio)  <->  COM / AppleScript  <->  Illustrator (ExtendScript)
Tool Design

Keep the tool set small and specific:

ToolInputOutput
document_infononeOpen documents, active document, artboards, color mode, units
list_layersdocument indexLayer names, visibility, lock state, item counts
run_scriptscript name from an allowlisted folder, JSON parametersThe script's JSON result
export_artboard_pngartboard index, scalePath to the PNG (or the image itself) so the model can see the result
save_copy_asoutput path inside the output folder, formatSaved path
  • Prefer named scripts from an allowlisted folder over a tool that evaluates arbitrary code. If an arbitrary-code tool exists at all, keep it off by default and require confirmation per call.

  • Return PNG previews after visual changes, so the agent can check its work.

  • Serialize calls; return a clear error on timeout instead of waiting forever.

  • Never save over the user's open file; write to an output folder and ask before overwriting.

  • Wrap every script in try/catch and return { ok, message }.

Registering a local server in VS Code (.vscode/mcp.json):

{
  "servers": {
    "illustrator": {
      "type": "stdio",
      "command": "node",
      "args": ["${workspaceFolder}/tools/illustrator-mcp/server.js"],
      "env": { "ACME_SCRIPTS_DIR": "${workspaceFolder}/tools/illustrator-mcp/scripts" }
    }
  }
}
Vetting a Community Illustrator MCP Server

Before installing one, read its source and check:

  • What code it runs inside Illustrator, and whether a tool accepts arbitrary ExtendScript

  • Which folders it can read and write, and whether it can save over files

  • Network calls it makes, and what it sends

  • Which OS and Illustrator versions it supports, and how it starts Illustrator

  • That you pin a version or commit rather than tracking a moving branch

Computer Use in Illustrator

Use a computer-use tool only for what has no scripting route: some panels and dialogs, generative features, and visual checks a script cannot make.

  • Keep the Illustrator window at a fixed size and position for the whole session.

  • Prefer menu paths and keyboard shortcuts over clicking coordinates.

  • Take a screenshot after each step and stop when the screen does not match the expected state.

  • Confirm results with a script readback where possible (for example item counts or layer names).

  • Work on a copy of the document.

  • Never type credentials, never click sign-in, licensing, purchase, or account dialogs, never accept terms for the user, and never upload or share files.

  • Stop and hand back to the user on any unexpected dialog.

Requirements and compatibility

Written for: GitHub Copilot

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an MCP server, Needs an API key

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

First committed by
GitHub avatar of jhaugajhauga
Publisher
GitHub (Official)
Distributed by
GitHub
Source
github/awesome-copilot · skills/adobe-illustrator-integrations · commit 797337f
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Contributors
jhauga

AutoGineer is not affiliated with or endorsed by jhauga or GitHub.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download adobe-illustrator-integrations.zip