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.
- package/LICENSE +21 -0
- package/README.ja.md +270 -0
- package/README.md +253 -0
- package/dist/executor/file-transport.d.ts +19 -0
- package/dist/executor/file-transport.d.ts.map +1 -0
- package/dist/executor/file-transport.js +55 -0
- package/dist/executor/file-transport.js.map +1 -0
- package/dist/executor/jsx-runner.d.ts +18 -0
- package/dist/executor/jsx-runner.d.ts.map +1 -0
- package/dist/executor/jsx-runner.js +95 -0
- package/dist/executor/jsx-runner.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx/helpers/common.jsx +320 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +11 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/export/export-pdf.d.ts +3 -0
- package/dist/tools/export/export-pdf.d.ts.map +1 -0
- package/dist/tools/export/export-pdf.js +153 -0
- package/dist/tools/export/export-pdf.js.map +1 -0
- package/dist/tools/export/export.d.ts +3 -0
- package/dist/tools/export/export.d.ts.map +1 -0
- package/dist/tools/export/export.js +230 -0
- package/dist/tools/export/export.js.map +1 -0
- package/dist/tools/modify/apply-color-profile.d.ts +3 -0
- package/dist/tools/modify/apply-color-profile.d.ts.map +1 -0
- package/dist/tools/modify/apply-color-profile.js +86 -0
- package/dist/tools/modify/apply-color-profile.js.map +1 -0
- package/dist/tools/modify/convert-to-outlines.d.ts +3 -0
- package/dist/tools/modify/convert-to-outlines.d.ts.map +1 -0
- package/dist/tools/modify/convert-to-outlines.js +127 -0
- package/dist/tools/modify/convert-to-outlines.js.map +1 -0
- package/dist/tools/modify/create-ellipse.d.ts +3 -0
- package/dist/tools/modify/create-ellipse.d.ts.map +1 -0
- package/dist/tools/modify/create-ellipse.js +135 -0
- package/dist/tools/modify/create-ellipse.js.map +1 -0
- package/dist/tools/modify/create-line.d.ts +3 -0
- package/dist/tools/modify/create-line.d.ts.map +1 -0
- package/dist/tools/modify/create-line.js +150 -0
- package/dist/tools/modify/create-line.js.map +1 -0
- package/dist/tools/modify/create-path.d.ts +3 -0
- package/dist/tools/modify/create-path.d.ts.map +1 -0
- package/dist/tools/modify/create-path.js +192 -0
- package/dist/tools/modify/create-path.js.map +1 -0
- package/dist/tools/modify/create-rectangle.d.ts +3 -0
- package/dist/tools/modify/create-rectangle.d.ts.map +1 -0
- package/dist/tools/modify/create-rectangle.js +142 -0
- package/dist/tools/modify/create-rectangle.js.map +1 -0
- package/dist/tools/modify/create-text-frame.d.ts +3 -0
- package/dist/tools/modify/create-text-frame.d.ts.map +1 -0
- package/dist/tools/modify/create-text-frame.js +154 -0
- package/dist/tools/modify/create-text-frame.js.map +1 -0
- package/dist/tools/modify/modify-object.d.ts +3 -0
- package/dist/tools/modify/modify-object.d.ts.map +1 -0
- package/dist/tools/modify/modify-object.js +224 -0
- package/dist/tools/modify/modify-object.js.map +1 -0
- package/dist/tools/read/find-objects.d.ts +3 -0
- package/dist/tools/read/find-objects.d.ts.map +1 -0
- package/dist/tools/read/find-objects.js +220 -0
- package/dist/tools/read/find-objects.js.map +1 -0
- package/dist/tools/read/get-artboards.d.ts +3 -0
- package/dist/tools/read/get-artboards.d.ts.map +1 -0
- package/dist/tools/read/get-artboards.js +85 -0
- package/dist/tools/read/get-artboards.js.map +1 -0
- package/dist/tools/read/get-colors.d.ts +3 -0
- package/dist/tools/read/get-colors.d.ts.map +1 -0
- package/dist/tools/read/get-colors.js +184 -0
- package/dist/tools/read/get-colors.js.map +1 -0
- package/dist/tools/read/get-document-info.d.ts +3 -0
- package/dist/tools/read/get-document-info.d.ts.map +1 -0
- package/dist/tools/read/get-document-info.js +134 -0
- package/dist/tools/read/get-document-info.js.map +1 -0
- package/dist/tools/read/get-document-structure.d.ts +3 -0
- package/dist/tools/read/get-document-structure.d.ts.map +1 -0
- package/dist/tools/read/get-document-structure.js +125 -0
- package/dist/tools/read/get-document-structure.js.map +1 -0
- package/dist/tools/read/get-effects.d.ts +3 -0
- package/dist/tools/read/get-effects.d.ts.map +1 -0
- package/dist/tools/read/get-effects.js +187 -0
- package/dist/tools/read/get-effects.js.map +1 -0
- package/dist/tools/read/get-groups.d.ts +3 -0
- package/dist/tools/read/get-groups.d.ts.map +1 -0
- package/dist/tools/read/get-groups.js +174 -0
- package/dist/tools/read/get-groups.js.map +1 -0
- package/dist/tools/read/get-guidelines.d.ts +3 -0
- package/dist/tools/read/get-guidelines.d.ts.map +1 -0
- package/dist/tools/read/get-guidelines.js +100 -0
- package/dist/tools/read/get-guidelines.js.map +1 -0
- package/dist/tools/read/get-images.d.ts +3 -0
- package/dist/tools/read/get-images.d.ts.map +1 -0
- package/dist/tools/read/get-images.js +160 -0
- package/dist/tools/read/get-images.js.map +1 -0
- package/dist/tools/read/get-layers.d.ts +3 -0
- package/dist/tools/read/get-layers.d.ts.map +1 -0
- package/dist/tools/read/get-layers.js +112 -0
- package/dist/tools/read/get-layers.js.map +1 -0
- package/dist/tools/read/get-overprint-info.d.ts +3 -0
- package/dist/tools/read/get-overprint-info.d.ts.map +1 -0
- package/dist/tools/read/get-overprint-info.js +109 -0
- package/dist/tools/read/get-overprint-info.js.map +1 -0
- package/dist/tools/read/get-path-items.d.ts +3 -0
- package/dist/tools/read/get-path-items.d.ts.map +1 -0
- package/dist/tools/read/get-path-items.js +252 -0
- package/dist/tools/read/get-path-items.js.map +1 -0
- package/dist/tools/read/get-selection.d.ts +3 -0
- package/dist/tools/read/get-selection.d.ts.map +1 -0
- package/dist/tools/read/get-selection.js +177 -0
- package/dist/tools/read/get-selection.js.map +1 -0
- package/dist/tools/read/get-symbols.d.ts +3 -0
- package/dist/tools/read/get-symbols.d.ts.map +1 -0
- package/dist/tools/read/get-symbols.js +101 -0
- package/dist/tools/read/get-symbols.js.map +1 -0
- package/dist/tools/read/get-text-frame-detail.d.ts +3 -0
- package/dist/tools/read/get-text-frame-detail.d.ts.map +1 -0
- package/dist/tools/read/get-text-frame-detail.js +184 -0
- package/dist/tools/read/get-text-frame-detail.js.map +1 -0
- package/dist/tools/read/list-text-frames.d.ts +3 -0
- package/dist/tools/read/list-text-frames.d.ts.map +1 -0
- package/dist/tools/read/list-text-frames.js +177 -0
- package/dist/tools/read/list-text-frames.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +65 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/utility/preflight-check.d.ts +3 -0
- package/dist/tools/utility/preflight-check.d.ts.map +1 -0
- package/dist/tools/utility/preflight-check.js +337 -0
- package/dist/tools/utility/preflight-check.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeJsx } from '../../executor/jsx-runner.js';
|
|
3
|
+
const jsxCode = `
|
|
4
|
+
try {
|
|
5
|
+
var err = preflightChecks();
|
|
6
|
+
if (err) {
|
|
7
|
+
writeResultFile(RESULT_PATH, err);
|
|
8
|
+
} else {
|
|
9
|
+
var params = readParamsFile(PARAMS_PATH);
|
|
10
|
+
var coordSystem = (params && params.coordinate_system) ? params.coordinate_system : "artboard-web";
|
|
11
|
+
var doc = app.activeDocument;
|
|
12
|
+
var results = [];
|
|
13
|
+
var docColorSpace = doc.documentColorSpace;
|
|
14
|
+
var isCMYKDoc = (docColorSpace === DocumentColorSpace.CMYK);
|
|
15
|
+
|
|
16
|
+
// Helper: check if a color is RGB type
|
|
17
|
+
function isRGBColor(color) {
|
|
18
|
+
try {
|
|
19
|
+
if (color.typename === "RGBColor") return true;
|
|
20
|
+
} catch(e) {}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Helper: check if color is white
|
|
25
|
+
function isWhiteColor(color) {
|
|
26
|
+
try {
|
|
27
|
+
if (color.typename === "CMYKColor") {
|
|
28
|
+
if (color.cyan === 0 && color.magenta === 0 && color.yellow === 0 && color.black === 0) return true;
|
|
29
|
+
} else if (color.typename === "RGBColor") {
|
|
30
|
+
if (color.red === 255 && color.green === 255 && color.blue === 255) return true;
|
|
31
|
+
} else if (color.typename === "GrayColor") {
|
|
32
|
+
if (color.gray === 0) return true;
|
|
33
|
+
}
|
|
34
|
+
} catch(e) {}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Helper: get parent layer name
|
|
39
|
+
function getParentLayerName(item) {
|
|
40
|
+
var current = item.parent;
|
|
41
|
+
while (current) {
|
|
42
|
+
if (current.typename === "Layer") return current.name;
|
|
43
|
+
current = current.parent;
|
|
44
|
+
}
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Helper: recursive iteration over all page items
|
|
49
|
+
function iterateAllItems(container, callback) {
|
|
50
|
+
for (var i = 0; i < container.pageItems.length; i++) {
|
|
51
|
+
var item = container.pageItems[i];
|
|
52
|
+
try {
|
|
53
|
+
callback(item);
|
|
54
|
+
if (item.typename === "GroupItem") {
|
|
55
|
+
iterateAllItems(item, callback);
|
|
56
|
+
}
|
|
57
|
+
} catch(e) {}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 1. RGB color in CMYK document
|
|
62
|
+
if (isCMYKDoc) {
|
|
63
|
+
for (var layerIdx = 0; layerIdx < doc.layers.length; layerIdx++) {
|
|
64
|
+
iterateAllItems(doc.layers[layerIdx], function(item) {
|
|
65
|
+
if (item.typename === "PathItem") {
|
|
66
|
+
try {
|
|
67
|
+
if (item.filled && isRGBColor(item.fillColor)) {
|
|
68
|
+
var uuid = ensureUUID(item);
|
|
69
|
+
results.push({
|
|
70
|
+
level: "error",
|
|
71
|
+
category: "rgb_in_cmyk",
|
|
72
|
+
message: "RGB fill color detected in CMYK document",
|
|
73
|
+
uuid: uuid,
|
|
74
|
+
details: { name: item.name || "", layerName: getParentLayerName(item), attribute: "fill" }
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
} catch(e) {}
|
|
78
|
+
try {
|
|
79
|
+
if (item.stroked && isRGBColor(item.strokeColor)) {
|
|
80
|
+
var uuid2 = ensureUUID(item);
|
|
81
|
+
results.push({
|
|
82
|
+
level: "error",
|
|
83
|
+
category: "rgb_in_cmyk",
|
|
84
|
+
message: "RGB stroke color detected in CMYK document",
|
|
85
|
+
uuid: uuid2,
|
|
86
|
+
details: { name: item.name || "", layerName: getParentLayerName(item), attribute: "stroke" }
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
} catch(e) {}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 2. Broken links — placedItems
|
|
96
|
+
try {
|
|
97
|
+
for (var pi = 0; pi < doc.placedItems.length; pi++) {
|
|
98
|
+
var placed = doc.placedItems[pi];
|
|
99
|
+
try {
|
|
100
|
+
var f = placed.file;
|
|
101
|
+
if (!f.exists) {
|
|
102
|
+
var uuid3 = ensureUUID(placed);
|
|
103
|
+
results.push({
|
|
104
|
+
level: "error",
|
|
105
|
+
category: "broken_link",
|
|
106
|
+
message: "Broken link detected",
|
|
107
|
+
uuid: uuid3,
|
|
108
|
+
details: { name: placed.name || "", filePath: f.fsName }
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
} catch(e) {
|
|
112
|
+
var uuid3b = ensureUUID(placed);
|
|
113
|
+
results.push({
|
|
114
|
+
level: "error",
|
|
115
|
+
category: "broken_link",
|
|
116
|
+
message: "Cannot access linked file",
|
|
117
|
+
uuid: uuid3b,
|
|
118
|
+
details: { name: placed.name || "" }
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} catch(e) {}
|
|
123
|
+
|
|
124
|
+
// 3. Low resolution images (< 300dpi)
|
|
125
|
+
try {
|
|
126
|
+
for (var ri = 0; ri < doc.rasterItems.length; ri++) {
|
|
127
|
+
var raster = doc.rasterItems[ri];
|
|
128
|
+
try {
|
|
129
|
+
var bounds = raster.geometricBounds;
|
|
130
|
+
var widthPt = bounds[2] - bounds[0];
|
|
131
|
+
var heightPt = bounds[3] - bounds[1];
|
|
132
|
+
if (widthPt < 0) widthPt = -widthPt;
|
|
133
|
+
if (heightPt < 0) heightPt = -heightPt;
|
|
134
|
+
|
|
135
|
+
var matrix = raster.matrix;
|
|
136
|
+
var ppiH = 72;
|
|
137
|
+
var ppiV = 72;
|
|
138
|
+
try {
|
|
139
|
+
var srcW = raster.imageColorSpace ? raster.matrix.mValueA : 1;
|
|
140
|
+
var srcH = raster.imageColorSpace ? raster.matrix.mValueD : 1;
|
|
141
|
+
} catch(e2) {}
|
|
142
|
+
|
|
143
|
+
// Use a simpler approach: compare pixel dimensions to point dimensions
|
|
144
|
+
// Points to inches: divide by 72
|
|
145
|
+
// If we can get bounding box in points and original pixel size, we can compute effective DPI
|
|
146
|
+
// Unfortunately ExtendScript rasterItem doesn't directly expose pixel dimensions reliably
|
|
147
|
+
// We check if the item has a lower than expected resolution by examining its properties
|
|
148
|
+
var effectivePPI = 0;
|
|
149
|
+
try {
|
|
150
|
+
// Try to compute effective resolution from the object dimensions
|
|
151
|
+
// raster items have an overprint property but no direct pixel dimension
|
|
152
|
+
// Heuristic: if the item appears large at screen resolution, flag it
|
|
153
|
+
var widthInches = widthPt / 72;
|
|
154
|
+
var heightInches = heightPt / 72;
|
|
155
|
+
// Cannot reliably determine pixel dimensions in ES3, so skip exact DPI calc
|
|
156
|
+
// Instead just note as info
|
|
157
|
+
if (widthInches > 0 || heightInches > 0) {
|
|
158
|
+
var uuid4 = ensureUUID(raster);
|
|
159
|
+
results.push({
|
|
160
|
+
level: "warning",
|
|
161
|
+
category: "image_resolution",
|
|
162
|
+
message: "Please verify raster image resolution (exact DPI calculation unavailable due to API limitations)",
|
|
163
|
+
uuid: uuid4,
|
|
164
|
+
details: { name: raster.name || "", widthPt: widthPt, heightPt: heightPt }
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
} catch(e2) {}
|
|
168
|
+
} catch(e) {}
|
|
169
|
+
}
|
|
170
|
+
} catch(e) {}
|
|
171
|
+
|
|
172
|
+
// 4. Non-outlined fonts (textFrames exist)
|
|
173
|
+
try {
|
|
174
|
+
if (doc.textFrames.length > 0) {
|
|
175
|
+
var fontNames = [];
|
|
176
|
+
for (var tf = 0; tf < doc.textFrames.length; tf++) {
|
|
177
|
+
try {
|
|
178
|
+
var textFrame = doc.textFrames[tf];
|
|
179
|
+
var uuid5 = ensureUUID(textFrame);
|
|
180
|
+
var fontName = "";
|
|
181
|
+
try {
|
|
182
|
+
if (textFrame.textRanges.length > 0) {
|
|
183
|
+
fontName = textFrame.textRanges[0].characterAttributes.textFont.name;
|
|
184
|
+
}
|
|
185
|
+
} catch(e2) {}
|
|
186
|
+
results.push({
|
|
187
|
+
level: "warning",
|
|
188
|
+
category: "non_outlined_text",
|
|
189
|
+
message: "Non-outlined text detected",
|
|
190
|
+
uuid: uuid5,
|
|
191
|
+
details: { name: textFrame.name || "", contents: textFrame.contents.substring(0, 50), font: fontName }
|
|
192
|
+
});
|
|
193
|
+
} catch(e) {}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} catch(e) {}
|
|
197
|
+
|
|
198
|
+
// 5. White overprint
|
|
199
|
+
for (var layerIdx2 = 0; layerIdx2 < doc.layers.length; layerIdx2++) {
|
|
200
|
+
iterateAllItems(doc.layers[layerIdx2], function(item) {
|
|
201
|
+
if (item.typename === "PathItem") {
|
|
202
|
+
try {
|
|
203
|
+
var hasFillOP = false;
|
|
204
|
+
var hasStrokeOP = false;
|
|
205
|
+
try { hasFillOP = item.fillOverprint; } catch(e2) {}
|
|
206
|
+
try { hasStrokeOP = item.strokeOverprint; } catch(e2) {}
|
|
207
|
+
|
|
208
|
+
if (hasFillOP && item.filled) {
|
|
209
|
+
try {
|
|
210
|
+
if (isWhiteColor(item.fillColor)) {
|
|
211
|
+
var uuid6 = ensureUUID(item);
|
|
212
|
+
results.push({
|
|
213
|
+
level: "error",
|
|
214
|
+
category: "white_overprint",
|
|
215
|
+
message: "White fill has overprint enabled (may disappear when printed)",
|
|
216
|
+
uuid: uuid6,
|
|
217
|
+
details: { name: item.name || "", layerName: getParentLayerName(item), attribute: "fill" }
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
} catch(e2) {}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (hasStrokeOP && item.stroked) {
|
|
224
|
+
try {
|
|
225
|
+
if (isWhiteColor(item.strokeColor)) {
|
|
226
|
+
var uuid7 = ensureUUID(item);
|
|
227
|
+
results.push({
|
|
228
|
+
level: "error",
|
|
229
|
+
category: "white_overprint",
|
|
230
|
+
message: "White stroke has overprint enabled (may disappear when printed)",
|
|
231
|
+
uuid: uuid7,
|
|
232
|
+
details: { name: item.name || "", layerName: getParentLayerName(item), attribute: "stroke" }
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
} catch(e2) {}
|
|
236
|
+
}
|
|
237
|
+
} catch(e) {}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 6. Bleed — cannot check via API
|
|
243
|
+
results.push({
|
|
244
|
+
level: "info",
|
|
245
|
+
category: "bleed",
|
|
246
|
+
message: "Bleed settings cannot be verified via API. Please check manually.",
|
|
247
|
+
uuid: null,
|
|
248
|
+
details: {}
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// 7. Spot colors
|
|
252
|
+
try {
|
|
253
|
+
if (doc.spots.length > 1) {
|
|
254
|
+
// spots[0] is always the default registration color
|
|
255
|
+
for (var si = 1; si < doc.spots.length; si++) {
|
|
256
|
+
var spot = doc.spots[si];
|
|
257
|
+
try {
|
|
258
|
+
results.push({
|
|
259
|
+
level: "warning",
|
|
260
|
+
category: "spot_color",
|
|
261
|
+
message: "Spot color in use: " + spot.name,
|
|
262
|
+
uuid: null,
|
|
263
|
+
details: { spotName: spot.name, colorType: spot.spotKind.toString() }
|
|
264
|
+
});
|
|
265
|
+
} catch(e) {}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
} catch(e) {}
|
|
269
|
+
|
|
270
|
+
// 8. Transparency (opacity < 100 or blendingMode !== normal)
|
|
271
|
+
for (var layerIdx3 = 0; layerIdx3 < doc.layers.length; layerIdx3++) {
|
|
272
|
+
iterateAllItems(doc.layers[layerIdx3], function(item) {
|
|
273
|
+
try {
|
|
274
|
+
var hasTransparency = false;
|
|
275
|
+
var reason = "";
|
|
276
|
+
try {
|
|
277
|
+
if (item.opacity < 100) {
|
|
278
|
+
hasTransparency = true;
|
|
279
|
+
reason = "opacity: " + item.opacity + "%";
|
|
280
|
+
}
|
|
281
|
+
} catch(e2) {}
|
|
282
|
+
try {
|
|
283
|
+
if (item.blendingMode !== BlendModes.NORMAL) {
|
|
284
|
+
hasTransparency = true;
|
|
285
|
+
reason = reason ? (reason + ", blendingMode: " + item.blendingMode) : ("blendingMode: " + item.blendingMode);
|
|
286
|
+
}
|
|
287
|
+
} catch(e2) {}
|
|
288
|
+
|
|
289
|
+
if (hasTransparency) {
|
|
290
|
+
var uuid8 = ensureUUID(item);
|
|
291
|
+
results.push({
|
|
292
|
+
level: "warning",
|
|
293
|
+
category: "transparency",
|
|
294
|
+
message: "Transparency effect in use",
|
|
295
|
+
uuid: uuid8,
|
|
296
|
+
details: { name: item.name || "", layerName: getParentLayerName(item), reason: reason }
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
} catch(e) {}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
writeResultFile(RESULT_PATH, {
|
|
304
|
+
coordinateSystem: coordSystem,
|
|
305
|
+
documentColorSpace: isCMYKDoc ? "CMYK" : "RGB",
|
|
306
|
+
checkCount: results.length,
|
|
307
|
+
results: results
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
} catch (e) {
|
|
311
|
+
writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
|
|
312
|
+
}
|
|
313
|
+
`;
|
|
314
|
+
export function register(server) {
|
|
315
|
+
server.registerTool('preflight_check', {
|
|
316
|
+
title: 'Preflight Check',
|
|
317
|
+
description: 'Run pre-press quality checks',
|
|
318
|
+
inputSchema: {
|
|
319
|
+
coordinate_system: z
|
|
320
|
+
.enum(['artboard-web', 'document'])
|
|
321
|
+
.optional()
|
|
322
|
+
.default('artboard-web'),
|
|
323
|
+
},
|
|
324
|
+
annotations: {
|
|
325
|
+
readOnlyHint: true,
|
|
326
|
+
destructiveHint: false,
|
|
327
|
+
idempotentHint: true,
|
|
328
|
+
openWorldHint: false,
|
|
329
|
+
},
|
|
330
|
+
}, async (params) => {
|
|
331
|
+
const result = await executeJsx(jsxCode, params);
|
|
332
|
+
return {
|
|
333
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
334
|
+
};
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=preflight-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-check.js","sourceRoot":"","sources":["../../../src/tools/utility/preflight-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsTf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE;YACX,iBAAiB,EAAE,CAAC;iBACjB,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;SAC3B;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "illustrator-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for reading, manipulating, and exporting Adobe Illustrator design data",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"illustrator-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc && cp -r src/jsx dist/",
|
|
15
|
+
"dev": "cp -r src/jsx dist/ 2>/dev/null; tsc --watch",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"illustrator",
|
|
25
|
+
"adobe",
|
|
26
|
+
"extendscript",
|
|
27
|
+
"jsx",
|
|
28
|
+
"design",
|
|
29
|
+
"svg"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/ie3jp/illustrator-mcp-server.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/ie3jp/illustrator-mcp-server",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/ie3jp/illustrator-mcp-server/issues"
|
|
39
|
+
},
|
|
40
|
+
"os": ["darwin"],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
46
|
+
"p-limit": "^7.3.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.0",
|
|
50
|
+
"tsx": "^4.21.0",
|
|
51
|
+
"typescript": "^5.9.3",
|
|
52
|
+
"vitest": "^3.2.4"
|
|
53
|
+
}
|
|
54
|
+
}
|