illustrator-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +270 -0
  3. package/README.md +253 -0
  4. package/dist/executor/file-transport.d.ts +19 -0
  5. package/dist/executor/file-transport.d.ts.map +1 -0
  6. package/dist/executor/file-transport.js +55 -0
  7. package/dist/executor/file-transport.js.map +1 -0
  8. package/dist/executor/jsx-runner.d.ts +18 -0
  9. package/dist/executor/jsx-runner.d.ts.map +1 -0
  10. package/dist/executor/jsx-runner.js +95 -0
  11. package/dist/executor/jsx-runner.js.map +1 -0
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +22 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/jsx/helpers/common.jsx +320 -0
  17. package/dist/server.d.ts +3 -0
  18. package/dist/server.d.ts.map +1 -0
  19. package/dist/server.js +11 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/tools/export/export-pdf.d.ts +3 -0
  22. package/dist/tools/export/export-pdf.d.ts.map +1 -0
  23. package/dist/tools/export/export-pdf.js +153 -0
  24. package/dist/tools/export/export-pdf.js.map +1 -0
  25. package/dist/tools/export/export.d.ts +3 -0
  26. package/dist/tools/export/export.d.ts.map +1 -0
  27. package/dist/tools/export/export.js +230 -0
  28. package/dist/tools/export/export.js.map +1 -0
  29. package/dist/tools/modify/apply-color-profile.d.ts +3 -0
  30. package/dist/tools/modify/apply-color-profile.d.ts.map +1 -0
  31. package/dist/tools/modify/apply-color-profile.js +86 -0
  32. package/dist/tools/modify/apply-color-profile.js.map +1 -0
  33. package/dist/tools/modify/convert-to-outlines.d.ts +3 -0
  34. package/dist/tools/modify/convert-to-outlines.d.ts.map +1 -0
  35. package/dist/tools/modify/convert-to-outlines.js +127 -0
  36. package/dist/tools/modify/convert-to-outlines.js.map +1 -0
  37. package/dist/tools/modify/create-ellipse.d.ts +3 -0
  38. package/dist/tools/modify/create-ellipse.d.ts.map +1 -0
  39. package/dist/tools/modify/create-ellipse.js +135 -0
  40. package/dist/tools/modify/create-ellipse.js.map +1 -0
  41. package/dist/tools/modify/create-line.d.ts +3 -0
  42. package/dist/tools/modify/create-line.d.ts.map +1 -0
  43. package/dist/tools/modify/create-line.js +150 -0
  44. package/dist/tools/modify/create-line.js.map +1 -0
  45. package/dist/tools/modify/create-path.d.ts +3 -0
  46. package/dist/tools/modify/create-path.d.ts.map +1 -0
  47. package/dist/tools/modify/create-path.js +192 -0
  48. package/dist/tools/modify/create-path.js.map +1 -0
  49. package/dist/tools/modify/create-rectangle.d.ts +3 -0
  50. package/dist/tools/modify/create-rectangle.d.ts.map +1 -0
  51. package/dist/tools/modify/create-rectangle.js +142 -0
  52. package/dist/tools/modify/create-rectangle.js.map +1 -0
  53. package/dist/tools/modify/create-text-frame.d.ts +3 -0
  54. package/dist/tools/modify/create-text-frame.d.ts.map +1 -0
  55. package/dist/tools/modify/create-text-frame.js +154 -0
  56. package/dist/tools/modify/create-text-frame.js.map +1 -0
  57. package/dist/tools/modify/modify-object.d.ts +3 -0
  58. package/dist/tools/modify/modify-object.d.ts.map +1 -0
  59. package/dist/tools/modify/modify-object.js +224 -0
  60. package/dist/tools/modify/modify-object.js.map +1 -0
  61. package/dist/tools/read/find-objects.d.ts +3 -0
  62. package/dist/tools/read/find-objects.d.ts.map +1 -0
  63. package/dist/tools/read/find-objects.js +220 -0
  64. package/dist/tools/read/find-objects.js.map +1 -0
  65. package/dist/tools/read/get-artboards.d.ts +3 -0
  66. package/dist/tools/read/get-artboards.d.ts.map +1 -0
  67. package/dist/tools/read/get-artboards.js +85 -0
  68. package/dist/tools/read/get-artboards.js.map +1 -0
  69. package/dist/tools/read/get-colors.d.ts +3 -0
  70. package/dist/tools/read/get-colors.d.ts.map +1 -0
  71. package/dist/tools/read/get-colors.js +184 -0
  72. package/dist/tools/read/get-colors.js.map +1 -0
  73. package/dist/tools/read/get-document-info.d.ts +3 -0
  74. package/dist/tools/read/get-document-info.d.ts.map +1 -0
  75. package/dist/tools/read/get-document-info.js +134 -0
  76. package/dist/tools/read/get-document-info.js.map +1 -0
  77. package/dist/tools/read/get-document-structure.d.ts +3 -0
  78. package/dist/tools/read/get-document-structure.d.ts.map +1 -0
  79. package/dist/tools/read/get-document-structure.js +125 -0
  80. package/dist/tools/read/get-document-structure.js.map +1 -0
  81. package/dist/tools/read/get-effects.d.ts +3 -0
  82. package/dist/tools/read/get-effects.d.ts.map +1 -0
  83. package/dist/tools/read/get-effects.js +187 -0
  84. package/dist/tools/read/get-effects.js.map +1 -0
  85. package/dist/tools/read/get-groups.d.ts +3 -0
  86. package/dist/tools/read/get-groups.d.ts.map +1 -0
  87. package/dist/tools/read/get-groups.js +174 -0
  88. package/dist/tools/read/get-groups.js.map +1 -0
  89. package/dist/tools/read/get-guidelines.d.ts +3 -0
  90. package/dist/tools/read/get-guidelines.d.ts.map +1 -0
  91. package/dist/tools/read/get-guidelines.js +100 -0
  92. package/dist/tools/read/get-guidelines.js.map +1 -0
  93. package/dist/tools/read/get-images.d.ts +3 -0
  94. package/dist/tools/read/get-images.d.ts.map +1 -0
  95. package/dist/tools/read/get-images.js +160 -0
  96. package/dist/tools/read/get-images.js.map +1 -0
  97. package/dist/tools/read/get-layers.d.ts +3 -0
  98. package/dist/tools/read/get-layers.d.ts.map +1 -0
  99. package/dist/tools/read/get-layers.js +112 -0
  100. package/dist/tools/read/get-layers.js.map +1 -0
  101. package/dist/tools/read/get-overprint-info.d.ts +3 -0
  102. package/dist/tools/read/get-overprint-info.d.ts.map +1 -0
  103. package/dist/tools/read/get-overprint-info.js +109 -0
  104. package/dist/tools/read/get-overprint-info.js.map +1 -0
  105. package/dist/tools/read/get-path-items.d.ts +3 -0
  106. package/dist/tools/read/get-path-items.d.ts.map +1 -0
  107. package/dist/tools/read/get-path-items.js +252 -0
  108. package/dist/tools/read/get-path-items.js.map +1 -0
  109. package/dist/tools/read/get-selection.d.ts +3 -0
  110. package/dist/tools/read/get-selection.d.ts.map +1 -0
  111. package/dist/tools/read/get-selection.js +177 -0
  112. package/dist/tools/read/get-selection.js.map +1 -0
  113. package/dist/tools/read/get-symbols.d.ts +3 -0
  114. package/dist/tools/read/get-symbols.d.ts.map +1 -0
  115. package/dist/tools/read/get-symbols.js +101 -0
  116. package/dist/tools/read/get-symbols.js.map +1 -0
  117. package/dist/tools/read/get-text-frame-detail.d.ts +3 -0
  118. package/dist/tools/read/get-text-frame-detail.d.ts.map +1 -0
  119. package/dist/tools/read/get-text-frame-detail.js +184 -0
  120. package/dist/tools/read/get-text-frame-detail.js.map +1 -0
  121. package/dist/tools/read/list-text-frames.d.ts +3 -0
  122. package/dist/tools/read/list-text-frames.d.ts.map +1 -0
  123. package/dist/tools/read/list-text-frames.js +177 -0
  124. package/dist/tools/read/list-text-frames.js.map +1 -0
  125. package/dist/tools/registry.d.ts +3 -0
  126. package/dist/tools/registry.d.ts.map +1 -0
  127. package/dist/tools/registry.js +65 -0
  128. package/dist/tools/registry.js.map +1 -0
  129. package/dist/tools/utility/preflight-check.d.ts +3 -0
  130. package/dist/tools/utility/preflight-check.d.ts.map +1 -0
  131. package/dist/tools/utility/preflight-check.js +337 -0
  132. package/dist/tools/utility/preflight-check.js.map +1 -0
  133. package/package.json +54 -0
@@ -0,0 +1,95 @@
1
+ import { execFile } from 'child_process';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import pLimit from 'p-limit';
6
+ import { createTempFiles, writeParams, writeJsx, writeAppleScript, readResult, cleanupTempFiles, } from './file-transport.js';
7
+ // Illustrator はシングルスレッド — JSX 実行を直列化
8
+ const jsxLimit = pLimit(1);
9
+ const JSX_HELPERS_PATH = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../jsx/helpers/common.jsx');
10
+ // タイムアウト設定(ms)
11
+ const TIMEOUT_NORMAL = 30_000;
12
+ const TIMEOUT_HEAVY = 60_000;
13
+ /**
14
+ * JSX コードを組み立てる(共通ヘルパー + ツール固有コード)
15
+ */
16
+ async function buildJsx(toolScript, paramsPath, resultPath) {
17
+ const helpers = await fs.readFile(JSX_HELPERS_PATH, 'utf-8');
18
+ return `(function() {
19
+ ${helpers}
20
+ var PARAMS_PATH = ${JSON.stringify(paramsPath)};
21
+ var RESULT_PATH = ${JSON.stringify(resultPath)};
22
+ ${toolScript}
23
+ })();`;
24
+ }
25
+ /**
26
+ * osascript エラーメッセージを解析して分かりやすいエラーに変換する
27
+ */
28
+ function parseOsascriptError(stderr) {
29
+ if (stderr.includes('Connection is invalid')) {
30
+ return 'Illustrator is not running. Please launch Adobe Illustrator.';
31
+ }
32
+ if (stderr.includes('not allowed to send keystrokes') || stderr.includes('not allowed assistive access')) {
33
+ return 'Automation permission denied. Please allow access in System Settings > Privacy & Security > Automation.';
34
+ }
35
+ return stderr;
36
+ }
37
+ /**
38
+ * JSX を実行する(排他制御なし — 内部用)
39
+ */
40
+ async function executeJsxRaw(jsxCode, params, timeout = TIMEOUT_NORMAL, activate = false) {
41
+ const files = createTempFiles();
42
+ try {
43
+ // 1. パラメータをJSONファイルに書き出し
44
+ await writeParams(files.paramsPath, params);
45
+ // 2. 共通ヘルパー + ツール固有コードを結合し、BOM付きUTF-8で保存
46
+ const fullJsx = await buildJsx(jsxCode, files.paramsPath, files.resultPath);
47
+ await writeJsx(files.scriptPath, fullJsx);
48
+ // 3. AppleScriptをファイルに保存(activate: 書き出し等でIllustratorをフォアグラウンドにする)
49
+ await writeAppleScript(files.scptPath, files.scriptPath, { activate });
50
+ // 4. osascript を非同期実行
51
+ await new Promise((resolve, reject) => {
52
+ execFile('osascript', [files.scptPath], { timeout }, (error, _stdout, stderr) => {
53
+ if (error) {
54
+ const message = parseOsascriptError(stderr || error.message);
55
+ reject(new Error(message));
56
+ }
57
+ else {
58
+ resolve();
59
+ }
60
+ });
61
+ });
62
+ // 5. 結果ファイルを読み取り
63
+ let result;
64
+ try {
65
+ result = await readResult(files.resultPath);
66
+ }
67
+ catch (readError) {
68
+ // osascript は成功したが結果ファイルが生成されなかった場合
69
+ // JSX の異常終了(try/catch 外でのクラッシュ等)が原因
70
+ throw new Error('JSX terminated without producing a result file. An uncaught exception may have occurred within the JSX script.');
71
+ }
72
+ // JSX 内でエラーが発生した場合
73
+ if (result.error) {
74
+ throw new Error(result.message || 'An unknown error occurred during JSX execution');
75
+ }
76
+ return result;
77
+ }
78
+ finally {
79
+ // 6. クリーンアップ
80
+ await cleanupTempFiles(files);
81
+ }
82
+ }
83
+ /**
84
+ * JSX を実行する(排他制御付き — 公開 API)
85
+ */
86
+ export async function executeJsx(jsxCode, params, options) {
87
+ return jsxLimit(() => executeJsxRaw(jsxCode, params, options?.timeout ?? TIMEOUT_NORMAL, options?.activate ?? false));
88
+ }
89
+ /**
90
+ * 重い処理用の JSX 実行(タイムアウト延長 + Illustrator をフォアグラウンドに)
91
+ */
92
+ export async function executeJsxHeavy(jsxCode, params) {
93
+ return executeJsx(jsxCode, params, { timeout: TIMEOUT_HEAVY, activate: true });
94
+ }
95
+ //# sourceMappingURL=jsx-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runner.js","sourceRoot":"","sources":["../../src/executor/jsx-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { createServer } from './server.js';
4
+ import { ensureTmpDir, cleanupTmpDirSync } from './executor/file-transport.js';
5
+ async function main() {
6
+ // 一時ディレクトリを作成
7
+ await ensureTmpDir();
8
+ // プロセス終了時のクリーンアップ
9
+ process.on('exit', () => {
10
+ cleanupTmpDirSync();
11
+ });
12
+ process.on('SIGINT', () => process.exit(0));
13
+ process.on('SIGTERM', () => process.exit(0));
14
+ const server = createServer();
15
+ const transport = new StdioServerTransport();
16
+ await server.connect(transport);
17
+ }
18
+ main().catch((error) => {
19
+ console.error('Failed to start server:', error);
20
+ process.exit(1);
21
+ });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAE/E,KAAK,UAAU,IAAI;IACjB,cAAc;IACd,MAAM,YAAY,EAAE,CAAC;IAErB,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,320 @@
1
+ // ============================================================
2
+ // common.jsx — 共通ヘルパー(ExtendScript ES3 準拠)
3
+ // ============================================================
4
+
5
+ // --- JSON ポリフィル ---
6
+
7
+ function jsonStringify(obj) {
8
+ if (obj === null || obj === void 0) return "null";
9
+ var t = typeof obj;
10
+ if (t === "boolean") return String(obj);
11
+ if (t === "number") {
12
+ if (isNaN(obj) || !isFinite(obj)) return "null";
13
+ return String(obj);
14
+ }
15
+ if (t === "string") return _jsonEscapeString(obj);
16
+ if (obj instanceof Array) {
17
+ var parts = [];
18
+ for (var i = 0; i < obj.length; i++) {
19
+ parts.push(jsonStringify(obj[i]));
20
+ }
21
+ return "[" + parts.join(",") + "]";
22
+ }
23
+ if (t === "object") {
24
+ var keys = [];
25
+ for (var k in obj) {
26
+ if (obj.hasOwnProperty(k)) {
27
+ keys.push(_jsonEscapeString(k) + ":" + jsonStringify(obj[k]));
28
+ }
29
+ }
30
+ return "{" + keys.join(",") + "}";
31
+ }
32
+ return "null";
33
+ }
34
+
35
+ function _jsonEscapeString(s) {
36
+ var result = [];
37
+ result.push('"');
38
+ for (var i = 0; i < s.length; i++) {
39
+ var c = s.charAt(i);
40
+ if (c === '"') { result.push('\\"'); }
41
+ else if (c === '\\') { result.push('\\\\'); }
42
+ else if (c === '\n') { result.push('\\n'); }
43
+ else if (c === '\r') { result.push('\\r'); }
44
+ else if (c === '\t') { result.push('\\t'); }
45
+ else {
46
+ var code = s.charCodeAt(i);
47
+ if (code < 32) {
48
+ var hex = code.toString(16);
49
+ while (hex.length < 4) hex = "0" + hex;
50
+ result.push("\\u" + hex);
51
+ } else {
52
+ result.push(c);
53
+ }
54
+ }
55
+ }
56
+ result.push('"');
57
+ return result.join("");
58
+ }
59
+
60
+ function jsonParse(str) {
61
+ // ExtendScript (ES3) には JSON オブジェクトが存在しないため、
62
+ // eval ベースのパースが唯一の手段。
63
+ // パラメータは MCP Server が生成した JSON ファイル経由で渡されるため、
64
+ // ユーザー入力の直接埋め込みは発生せず、インジェクションリスクはない。
65
+ if (typeof str !== "string" || str.length === 0) return null;
66
+ // BOM 除去
67
+ if (str.charCodeAt(0) === 0xFEFF) str = str.substring(1);
68
+ return eval("(" + str + ")"); // eslint-disable-line no-eval
69
+ }
70
+
71
+ // --- ファイル I/O ---
72
+
73
+ function readParamsFile(filePath) {
74
+ var f = new File(filePath);
75
+ f.encoding = "UTF-8";
76
+ f.open("r");
77
+ var content = f.read();
78
+ f.close();
79
+ return jsonParse(content);
80
+ }
81
+
82
+ function writeResultFile(filePath, result) {
83
+ var f = new File(filePath);
84
+ f.encoding = "UTF-8";
85
+ f.open("w");
86
+ f.write(jsonStringify(result));
87
+ f.close();
88
+ }
89
+
90
+ // --- UUID 管理 ---
91
+
92
+ function generateUUID() {
93
+ // ExtendScript 用の簡易 UUID v4 生成
94
+ var chars = "0123456789abcdef";
95
+ var segments = [8, 4, 4, 4, 12];
96
+ var parts = [];
97
+ for (var i = 0; i < segments.length; i++) {
98
+ var seg = [];
99
+ for (var j = 0; j < segments[i]; j++) {
100
+ seg.push(chars.charAt(Math.floor(Math.random() * 16)));
101
+ }
102
+ parts.push(seg.join(""));
103
+ }
104
+ // version 4 marker
105
+ parts[2] = "4" + parts[2].substring(1);
106
+ // variant bits
107
+ var v = parseInt(parts[3].charAt(0), 16);
108
+ v = (v & 0x3) | 0x8;
109
+ parts[3] = v.toString(16) + parts[3].substring(1);
110
+ return parts.join("-");
111
+ }
112
+
113
+ function ensureUUID(pageItem) {
114
+ // note プロパティに UUID がなければ遅延割り当て
115
+ var note = "";
116
+ try { note = pageItem.note || ""; } catch(e) { /* note がないオブジェクトもある */ }
117
+
118
+ // UUID パターンチェック(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
119
+ if (note.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/)) {
120
+ return note;
121
+ }
122
+
123
+ var uuid = generateUUID();
124
+ try {
125
+ pageItem.note = uuid;
126
+ } catch(e) {
127
+ // ロックされたオブジェクト等で書き込み不可の場合はそのまま返す
128
+ }
129
+ return uuid;
130
+ }
131
+
132
+ // --- カラー変換 ---
133
+
134
+ function colorToObject(color) {
135
+ if (color === void 0 || color === null) return { type: "none" };
136
+
137
+ var tn = color.typename;
138
+ if (tn === "CMYKColor") {
139
+ return { type: "cmyk", c: color.cyan, m: color.magenta, y: color.yellow, k: color.black };
140
+ }
141
+ if (tn === "RGBColor") {
142
+ return { type: "rgb", r: color.red, g: color.green, b: color.blue };
143
+ }
144
+ if (tn === "SpotColor") {
145
+ return {
146
+ type: "spot",
147
+ name: color.spot.name,
148
+ tint: color.tint,
149
+ color: colorToObject(color.spot.color)
150
+ };
151
+ }
152
+ if (tn === "GradientColor") {
153
+ var stops = [];
154
+ var grad = color.gradient;
155
+ for (var i = 0; i < grad.gradientStops.length; i++) {
156
+ var gs = grad.gradientStops[i];
157
+ stops.push({
158
+ color: colorToObject(gs.color),
159
+ midPoint: gs.midPoint,
160
+ rampPoint: gs.rampPoint
161
+ });
162
+ }
163
+ return {
164
+ type: "gradient",
165
+ name: grad.name,
166
+ gradientType: grad.type.toString(),
167
+ stops: stops
168
+ };
169
+ }
170
+ if (tn === "PatternColor") {
171
+ return { type: "pattern", name: color.pattern.name };
172
+ }
173
+ if (tn === "GrayColor") {
174
+ return { type: "gray", value: color.gray };
175
+ }
176
+ if (tn === "NoColor") {
177
+ return { type: "none" };
178
+ }
179
+ return { type: "unknown", typename: tn || "undefined" };
180
+ }
181
+
182
+ // --- バウンディングボックス ---
183
+
184
+ // デフォルト: アートボード相対・Y軸下向き正(Web座標系)
185
+ function getBoundsWebCoord(item, artboardRect) {
186
+ var b = item.geometricBounds; // [left, top, right, bottom] (Illustrator座標: Y軸上向き正)
187
+ if (artboardRect) {
188
+ // アートボード相対座標に変換
189
+ var abLeft = artboardRect[0];
190
+ var abTop = artboardRect[1];
191
+ return {
192
+ x: b[0] - abLeft,
193
+ y: -(b[1] - abTop), // Y 反転
194
+ width: b[2] - b[0],
195
+ height: b[1] - b[3] // top - bottom (Illustrator座標では top > bottom)
196
+ };
197
+ }
198
+ // アートボードなしの場合はドキュメント座標をWeb向きに変換
199
+ return {
200
+ x: b[0],
201
+ y: -b[1],
202
+ width: b[2] - b[0],
203
+ height: b[1] - b[3]
204
+ };
205
+ }
206
+
207
+ // ドキュメント座標(Illustratorネイティブ)
208
+ function getBoundsDocCoord(item) {
209
+ var b = item.geometricBounds;
210
+ return {
211
+ x: b[0],
212
+ y: b[1],
213
+ width: b[2] - b[0],
214
+ height: b[1] - b[3]
215
+ };
216
+ }
217
+
218
+ function getBounds(item, coordSystem, artboardRect) {
219
+ if (coordSystem === "document") {
220
+ return getBoundsDocCoord(item);
221
+ }
222
+ return getBoundsWebCoord(item, artboardRect);
223
+ }
224
+
225
+ // --- アートボード関連 ---
226
+
227
+ function getActiveArtboardRect() {
228
+ var doc = app.activeDocument;
229
+ var abIdx = doc.artboards.getActiveArtboardIndex();
230
+ return doc.artboards[abIdx].artboardRect;
231
+ }
232
+
233
+ function getArtboardRectByIndex(index) {
234
+ var doc = app.activeDocument;
235
+ if (index >= 0 && index < doc.artboards.length) {
236
+ return doc.artboards[index].artboardRect;
237
+ }
238
+ return null;
239
+ }
240
+
241
+ // アイテムがどのアートボードに属するか判定(中心座標ベース)
242
+ function getArtboardIndexForItem(item) {
243
+ var doc = app.activeDocument;
244
+ var b = item.geometricBounds;
245
+ var cx = (b[0] + b[2]) / 2;
246
+ var cy = (b[1] + b[3]) / 2;
247
+
248
+ for (var i = 0; i < doc.artboards.length; i++) {
249
+ var r = doc.artboards[i].artboardRect;
250
+ if (cx >= r[0] && cx <= r[2] && cy <= r[1] && cy >= r[3]) {
251
+ return i;
252
+ }
253
+ }
254
+ return -1; // アートボード外
255
+ }
256
+
257
+ // --- バージョンチェック ---
258
+
259
+ function checkIllustratorVersion() {
260
+ var ver = parseInt(app.version.split(".")[0], 10);
261
+ if (ver < 28) {
262
+ return { error: true, message: "Illustrator CC 2024 or later is required (current: " + app.version + ")" };
263
+ }
264
+ return null;
265
+ }
266
+
267
+ // --- ドキュメント存在チェック ---
268
+
269
+ function checkDocumentOpen() {
270
+ if (app.documents.length === 0) {
271
+ return { error: true, message: "No document is open. Please open a file in Illustrator." };
272
+ }
273
+ return null;
274
+ }
275
+
276
+ // --- 共通の前提条件チェック ---
277
+
278
+ function preflightChecks() {
279
+ var verErr = checkIllustratorVersion();
280
+ if (verErr) return verErr;
281
+ var docErr = checkDocumentOpen();
282
+ if (docErr) return docErr;
283
+ return null;
284
+ }
285
+
286
+ // --- オブジェクトタイプ判定 ---
287
+
288
+ function getItemType(item) {
289
+ var tn = item.typename;
290
+ if (tn === "TextFrame") return "text";
291
+ if (tn === "PathItem") return "path";
292
+ if (tn === "CompoundPathItem") return "compound-path";
293
+ if (tn === "PlacedItem" || tn === "RasterItem") return "image";
294
+ if (tn === "GroupItem") return "group";
295
+ if (tn === "SymbolItem") return "symbol";
296
+ return "other";
297
+ }
298
+
299
+ // --- zIndex 計算 ---
300
+ // Illustrator の pageItems は前面→背面の順
301
+ // zIndex は 0-based 背面→前面の昇順
302
+
303
+ function getZIndex(item) {
304
+ try {
305
+ var parent = item.parent;
306
+ var total = 0;
307
+ if (parent.typename === "Layer") {
308
+ total = parent.pageItems.length;
309
+ } else if (parent.typename === "GroupItem") {
310
+ total = parent.pageItems.length;
311
+ } else {
312
+ return 0;
313
+ }
314
+ var idx = total - item.itemIndex;
315
+ if (isNaN(idx)) return 0;
316
+ return idx;
317
+ } catch(e) {
318
+ return 0;
319
+ }
320
+ }
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,YAAY,IAAI,SAAS,CASxC"}
package/dist/server.js ADDED
@@ -0,0 +1,11 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { registerAllTools } from './tools/registry.js';
3
+ export function createServer() {
4
+ const server = new McpServer({
5
+ name: 'illustrator-mcp-server',
6
+ version: '0.1.0',
7
+ });
8
+ registerAllTools(server);
9
+ return server;
10
+ }
11
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=export-pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-pdf.d.ts","sourceRoot":"","sources":["../../../src/tools/export/export-pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmHpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2ChD"}
@@ -0,0 +1,153 @@
1
+ import { z } from 'zod';
2
+ import { executeJsxHeavy } from '../../executor/jsx-runner.js';
3
+ const jsxCode = `
4
+ var preflight = preflightChecks();
5
+ if (preflight) {
6
+ writeResultFile(RESULT_PATH, preflight);
7
+ } else {
8
+ try {
9
+ var params = readParamsFile(PARAMS_PATH);
10
+ var doc = app.activeDocument;
11
+ var outputPath = params.output_path;
12
+ var preset = params.preset || "";
13
+ var options = params.options || {};
14
+
15
+ var pdfOpts = new PDFSaveOptions();
16
+
17
+ // Apply preset if specified
18
+ if (preset !== "") {
19
+ pdfOpts.pDFPreset = preset;
20
+ }
21
+
22
+ // Default to PDF/X-4 compatible
23
+ pdfOpts.compatibility = PDFCompatibility.ACROBAT7;
24
+ pdfOpts.preserveEditability = false;
25
+
26
+ // トンボ種類(enum名とリテラル値の両方を試す)
27
+ if (options.marks_style === "japanese") {
28
+ pdfOpts.pageMarksType = PageMarksTypes.Japanese;
29
+ } else if (options.marks_style === "roman") {
30
+ pdfOpts.pageMarksType = PageMarksTypes.Roman;
31
+ }
32
+
33
+ // トンボ ON/OFF
34
+ if (options.trim_marks === true) {
35
+ pdfOpts.trimMarks = true;
36
+ } else {
37
+ pdfOpts.trimMarks = false;
38
+ }
39
+
40
+ // 日本式トンボの場合、必須設定を自動適用
41
+ if (options.marks_style === "japanese" && options.trim_marks === true) {
42
+ // レジストレーションマーク(センタートンボ)が未指定なら自動ON
43
+ if (typeof options.registration_marks === "undefined") {
44
+ pdfOpts.registrationMarks = true;
45
+ }
46
+ // 裁ち落としが未指定なら3mm自動設定(外トンボの表示に必要)
47
+ if (options.bleed !== true && !options._bleed_set) {
48
+ var bleedPt = 8.504; // 3mm
49
+ pdfOpts.bleedOffsetRect = [bleedPt, bleedPt, bleedPt, bleedPt];
50
+ }
51
+ }
52
+
53
+ // トンボの太さ(文字列・数値両対応)
54
+ var tw = String(options.trim_mark_weight);
55
+ if (tw === "0.125") {
56
+ pdfOpts.trimMarkWeight = PDFTrimMarkWeight.TRIMMARKWEIGHT0125;
57
+ } else if (tw === "0.25") {
58
+ pdfOpts.trimMarkWeight = PDFTrimMarkWeight.TRIMMARKWEIGHT025;
59
+ } else if (tw === "0.5") {
60
+ pdfOpts.trimMarkWeight = PDFTrimMarkWeight.TRIMMARKWEIGHT05;
61
+ } else if (options.trim_marks === true) {
62
+ pdfOpts.trimMarkWeight = PDFTrimMarkWeight.TRIMMARKWEIGHT0125;
63
+ }
64
+
65
+ // レジストレーションマーク
66
+ if (typeof options.registration_marks !== "undefined") {
67
+ pdfOpts.registrationMarks = options.registration_marks;
68
+ }
69
+
70
+ // カラーバー
71
+ if (typeof options.color_bars !== "undefined") {
72
+ pdfOpts.colorBars = options.color_bars;
73
+ }
74
+
75
+ // ページ情報
76
+ if (typeof options.page_information !== "undefined") {
77
+ pdfOpts.pageInformation = options.page_information;
78
+ }
79
+
80
+ // Bleed
81
+ if (options.bleed === true) {
82
+ // Set 3mm bleed on all sides (approx 8.504 pt)
83
+ var bleedPt = 8.504;
84
+ pdfOpts.bleedOffsetRect = [bleedPt, bleedPt, bleedPt, bleedPt];
85
+ }
86
+
87
+ // Downsample images
88
+ if (options.downsample === true) {
89
+ pdfOpts.colorDownsamplingMethod = DownsampleMethod.BICUBICDOWNSAMPLE;
90
+ pdfOpts.colorDownsampling = 300;
91
+ pdfOpts.colorDownsamplingImageThreshold = 450;
92
+ pdfOpts.grayscaleDownsamplingMethod = DownsampleMethod.BICUBICDOWNSAMPLE;
93
+ pdfOpts.grayscaleDownsampling = 300;
94
+ pdfOpts.grayscaleDownsamplingImageThreshold = 450;
95
+ pdfOpts.monochromeDownsamplingMethod = DownsampleMethod.BICUBICDOWNSAMPLE;
96
+ pdfOpts.monochromeDownsampling = 1200;
97
+ pdfOpts.monochromeDownsamplingImageThreshold = 1800;
98
+ } else if (options.downsample === false) {
99
+ pdfOpts.colorDownsamplingMethod = DownsampleMethod.NODOWNSAMPLE;
100
+ pdfOpts.grayscaleDownsamplingMethod = DownsampleMethod.NODOWNSAMPLE;
101
+ pdfOpts.monochromeDownsamplingMethod = DownsampleMethod.NODOWNSAMPLE;
102
+ }
103
+
104
+ var outFile = new File(outputPath);
105
+ doc.saveAs(outFile, pdfOpts);
106
+
107
+ writeResultFile(RESULT_PATH, { success: true, output_path: outputPath });
108
+ } catch (e) {
109
+ writeResultFile(RESULT_PATH, { error: true, message: "PDF export failed: " + e.message, line: e.line });
110
+ }
111
+ }
112
+ `;
113
+ export function register(server) {
114
+ server.registerTool('export_pdf', {
115
+ title: 'Export PDF',
116
+ description: 'Export print-ready PDF',
117
+ inputSchema: {
118
+ output_path: z.string().describe('Output file path'),
119
+ preset: z
120
+ .string()
121
+ .optional()
122
+ .describe('PDF preset name (e.g. "[PDF/X-4:2008]")'),
123
+ options: z
124
+ .object({
125
+ trim_marks: z.boolean().optional().describe('Add trim marks'),
126
+ marks_style: z.enum(['japanese', 'roman']).optional().describe('Trim mark style (japanese or roman)'),
127
+ trim_mark_weight: z.enum(['0.125', '0.25', '0.5']).transform(Number).optional().describe('Trim mark weight (pt)'),
128
+ registration_marks: z.boolean().optional().describe('Registration marks'),
129
+ color_bars: z.boolean().optional().describe('Color bars'),
130
+ page_information: z.boolean().optional().describe('Page information'),
131
+ bleed: z.boolean().optional().describe('Include bleed (3mm)'),
132
+ downsample: z.boolean().optional().describe('Downsample images'),
133
+ })
134
+ .optional()
135
+ .describe('PDF export options'),
136
+ coordinate_system: z
137
+ .enum(['artboard-web', 'document'])
138
+ .optional()
139
+ .default('artboard-web')
140
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
141
+ },
142
+ annotations: {
143
+ readOnlyHint: false,
144
+ destructiveHint: false,
145
+ idempotentHint: true,
146
+ openWorldHint: false,
147
+ },
148
+ }, async (params) => {
149
+ const result = await executeJsxHeavy(jsxCode, params);
150
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
151
+ });
152
+ }
153
+ //# sourceMappingURL=export-pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-pdf.js","sourceRoot":"","sources":["../../../src/tools/export/export-pdf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Gf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACpD,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yCAAyC,CAAC;YACtD,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC;gBACN,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAC7D,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;gBACrG,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;gBACjH,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;gBACzE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACzD,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACrE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBAC7D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;aACjE,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,oBAAoB,CAAC;YACjC,iBAAiB,EAAE,CAAC;iBACjB,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;iBACvB,QAAQ,CAAC,sGAAsG,CAAC;SACpH;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/tools/export/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgLpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2DhD"}