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,184 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } 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 includeSwatches = (params && typeof params.include_swatches === "boolean") ? params.include_swatches : true;
12
+ var includeUsedColors = (params && typeof params.include_used_colors === "boolean") ? params.include_used_colors : true;
13
+
14
+ var result = {};
15
+
16
+ // スウォッチ一覧
17
+ if (includeSwatches) {
18
+ var swatches = [];
19
+ for (var si = 0; si < doc.swatches.length; si++) {
20
+ var sw = doc.swatches[si];
21
+ var swInfo = {
22
+ name: sw.name,
23
+ color: colorToObject(sw.color)
24
+ };
25
+ swatches.push(swInfo);
26
+ }
27
+ result.swatches = swatches;
28
+ }
29
+
30
+ // グラデーション一覧
31
+ var gradients = [];
32
+ for (var gi = 0; gi < doc.gradients.length; gi++) {
33
+ var grad = doc.gradients[gi];
34
+ var gradType = "unknown";
35
+ try {
36
+ if (grad.type === GradientType.LINEAR) gradType = "linear";
37
+ else if (grad.type === GradientType.RADIAL) gradType = "radial";
38
+ else gradType = grad.type.toString();
39
+ } catch (e) {}
40
+
41
+ var stops = [];
42
+ for (var gsi = 0; gsi < grad.gradientStops.length; gsi++) {
43
+ var gs = grad.gradientStops[gsi];
44
+ var stopInfo = {
45
+ rampPoint: gs.rampPoint,
46
+ midPoint: gs.midPoint,
47
+ color: colorToObject(gs.color)
48
+ };
49
+ try { stopInfo.opacity = gs.opacity; } catch (e) { stopInfo.opacity = 100; }
50
+ stops.push(stopInfo);
51
+ }
52
+
53
+ gradients.push({
54
+ name: grad.name,
55
+ type: gradType,
56
+ stops: stops
57
+ });
58
+ }
59
+ result.gradients = gradients;
60
+
61
+ // パターン一覧
62
+ var patterns = [];
63
+ for (var pi = 0; pi < doc.patterns.length; pi++) {
64
+ patterns.push({
65
+ name: doc.patterns[pi].name
66
+ });
67
+ }
68
+ result.patterns = patterns;
69
+
70
+ // 特色(スポットカラー)一覧
71
+ var spots = [];
72
+ for (var spi = 0; spi < doc.spots.length; spi++) {
73
+ var spot = doc.spots[spi];
74
+ var spotInfo = {
75
+ name: spot.name
76
+ };
77
+ try { spotInfo.color = colorToObject(spot.color); } catch (e) { spotInfo.color = { type: "unknown" }; }
78
+ try {
79
+ var st = spot.spotKind;
80
+ if (st === SpotColorKind.SPOTCMYK) spotInfo.spotKind = "CMYK";
81
+ else if (st === SpotColorKind.SPOTRGB) spotInfo.spotKind = "RGB";
82
+ else if (st === SpotColorKind.SPOTLAB) spotInfo.spotKind = "LAB";
83
+ else spotInfo.spotKind = st.toString();
84
+ } catch (e) { spotInfo.spotKind = "unknown"; }
85
+ spots.push(spotInfo);
86
+ }
87
+ result.spots = spots;
88
+
89
+ // 使用色の収集とメッシュ検出
90
+ if (includeUsedColors) {
91
+ var usedFills = [];
92
+ var usedStrokes = [];
93
+ var meshItems = [];
94
+ var spotUsageCount = {};
95
+
96
+ for (var ii = 0; ii < doc.pageItems.length; ii++) {
97
+ var item = doc.pageItems[ii];
98
+
99
+ // メッシュアイテム検出
100
+ if (item.typename === "MeshItem") {
101
+ meshItems.push(ensureUUID(item));
102
+ continue;
103
+ }
104
+
105
+ // PathItem の fillColor / strokeColor を収集
106
+ if (item.typename === "PathItem") {
107
+ try {
108
+ if (item.filled) {
109
+ var fc = colorToObject(item.fillColor);
110
+ usedFills.push(fc);
111
+ if (fc.type === "spot") {
112
+ var spName = fc.name;
113
+ if (spotUsageCount[spName] === undefined) spotUsageCount[spName] = 0;
114
+ spotUsageCount[spName] = spotUsageCount[spName] + 1;
115
+ }
116
+ }
117
+ } catch (e) {}
118
+ try {
119
+ if (item.stroked) {
120
+ var sc = colorToObject(item.strokeColor);
121
+ usedStrokes.push(sc);
122
+ if (sc.type === "spot") {
123
+ var spName2 = sc.name;
124
+ if (spotUsageCount[spName2] === undefined) spotUsageCount[spName2] = 0;
125
+ spotUsageCount[spName2] = spotUsageCount[spName2] + 1;
126
+ }
127
+ }
128
+ } catch (e) {}
129
+ }
130
+ }
131
+
132
+ // 特色使用箇所数を spots に追加
133
+ for (var sci = 0; sci < spots.length; sci++) {
134
+ var count = spotUsageCount[spots[sci].name];
135
+ spots[sci].usageCount = (count !== undefined) ? count : 0;
136
+ }
137
+
138
+ result.usedFillColors = usedFills;
139
+ result.usedStrokeColors = usedStrokes;
140
+ result.meshGradient = {
141
+ hasMesh: meshItems.length > 0,
142
+ meshItemUUIDs: meshItems
143
+ };
144
+ }
145
+
146
+ writeResultFile(RESULT_PATH, result);
147
+ } catch (e) {
148
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to get color information: " + e.message, line: e.line });
149
+ }
150
+ }
151
+ `;
152
+ export function register(server) {
153
+ server.registerTool('get_colors', {
154
+ title: 'Get Colors',
155
+ description: 'Get all color information used in the document',
156
+ inputSchema: {
157
+ include_swatches: z
158
+ .boolean()
159
+ .optional()
160
+ .default(true)
161
+ .describe('Include swatch list'),
162
+ include_used_colors: z
163
+ .boolean()
164
+ .optional()
165
+ .default(true)
166
+ .describe('Include used color collection'),
167
+ coordinate_system: z
168
+ .enum(['artboard-web', 'document'])
169
+ .optional()
170
+ .default('artboard-web')
171
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
172
+ },
173
+ annotations: {
174
+ readOnlyHint: true,
175
+ destructiveHint: false,
176
+ idempotentHint: true,
177
+ openWorldHint: false,
178
+ },
179
+ }, async (params) => {
180
+ const result = await executeJsx(jsxCode, params);
181
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
182
+ });
183
+ }
184
+ //# sourceMappingURL=get-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-colors.js","sourceRoot":"","sources":["../../../src/tools/read/get-colors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,gDAAgD;QAC7D,WAAW,EAAE;YACX,gBAAgB,EAAE,CAAC;iBAChB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,qBAAqB,CAAC;YAClC,mBAAmB,EAAE,CAAC;iBACnB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,+BAA+B,CAAC;YAC5C,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,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,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=get-document-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-info.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-document-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiHpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}
@@ -0,0 +1,134 @@
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 doc = app.activeDocument;
11
+ var coordSystem = (params && params.coordinate_system) ? params.coordinate_system : "artboard-web";
12
+
13
+ // ファイル名・パス
14
+ var fileName = doc.name;
15
+ var filePath = "";
16
+ try {
17
+ filePath = doc.fullName.fsName;
18
+ } catch (e) {
19
+ // 未保存ドキュメントの場合 fullName がエラーになる
20
+ filePath = "";
21
+ }
22
+
23
+ // ドキュメントサイズ(pt)
24
+ var docWidth = doc.width;
25
+ var docHeight = doc.height;
26
+
27
+ // カラーモード
28
+ var colorSpace = doc.documentColorSpace;
29
+ var colorMode = "unknown";
30
+ if (colorSpace === DocumentColorSpace.CMYK) {
31
+ colorMode = "CMYK";
32
+ } else if (colorSpace === DocumentColorSpace.RGB) {
33
+ colorMode = "RGB";
34
+ }
35
+
36
+ // カラープロファイル
37
+ var colorProfile = "";
38
+ try {
39
+ colorProfile = doc.colorProfileName;
40
+ } catch (e) {
41
+ colorProfile = "";
42
+ }
43
+
44
+ // 裁ち落とし設定
45
+ // Illustrator ExtendScript API はドキュメントの裁ち落とし(bleed)設定を
46
+ // 直接公開していないため、取得不可
47
+ var bleed = {
48
+ note: "Illustrator ExtendScript API does not expose bleed settings directly. Use File > Document Setup to check bleed values.",
49
+ top: null,
50
+ bottom: null,
51
+ left: null,
52
+ right: null
53
+ };
54
+
55
+ // ラスタライズ解像度
56
+ var rasterResolution = 0;
57
+ try {
58
+ rasterResolution = doc.rasterEffectSettings.resolution;
59
+ } catch (e) {
60
+ rasterResolution = 0;
61
+ }
62
+
63
+ // アートボード数・情報
64
+ var artboardCount = doc.artboards.length;
65
+ var artboards = [];
66
+ for (var i = 0; i < doc.artboards.length; i++) {
67
+ var ab = doc.artboards[i];
68
+ var rect = ab.artboardRect; // [left, top, right, bottom]
69
+ var abWidth = rect[2] - rect[0];
70
+ var abHeight = rect[1] - rect[3]; // top - bottom (Illustrator座標)
71
+
72
+ var abInfo = {
73
+ index: i,
74
+ name: ab.name
75
+ };
76
+
77
+ if (coordSystem === "document") {
78
+ abInfo.x = rect[0];
79
+ abInfo.y = rect[1];
80
+ } else {
81
+ // artboard-web: 各アートボードは自身の原点(0,0)を持つ
82
+ abInfo.x = 0;
83
+ abInfo.y = 0;
84
+ }
85
+ abInfo.width = abWidth;
86
+ abInfo.height = abHeight;
87
+
88
+ artboards.push(abInfo);
89
+ }
90
+
91
+ var result = {
92
+ fileName: fileName,
93
+ filePath: filePath,
94
+ width: docWidth,
95
+ height: docHeight,
96
+ colorMode: colorMode,
97
+ colorProfile: colorProfile,
98
+ bleed: bleed,
99
+ rasterEffectResolution: rasterResolution,
100
+ artboardCount: artboardCount,
101
+ artboards: artboards,
102
+ coordinateSystem: coordSystem
103
+ };
104
+
105
+ writeResultFile(RESULT_PATH, result);
106
+ }
107
+ } catch (e) {
108
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
109
+ }
110
+ `;
111
+ export function register(server) {
112
+ server.registerTool('get_document_info', {
113
+ title: 'Get Document Info',
114
+ description: 'Get document metadata',
115
+ inputSchema: {
116
+ coordinate_system: z
117
+ .enum(['artboard-web', 'document'])
118
+ .optional()
119
+ .default('artboard-web'),
120
+ },
121
+ annotations: {
122
+ readOnlyHint: true,
123
+ destructiveHint: false,
124
+ idempotentHint: true,
125
+ openWorldHint: false,
126
+ },
127
+ }, async (params) => {
128
+ const result = await executeJsx(jsxCode, params);
129
+ return {
130
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
131
+ };
132
+ });
133
+ }
134
+ //# sourceMappingURL=get-document-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-info.js","sourceRoot":"","sources":["../../../src/tools/read/get-document-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Gf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,uBAAuB;QACpC,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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=get-document-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-structure.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-document-structure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+FpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmChD"}
@@ -0,0 +1,125 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } from '../../executor/jsx-runner.js';
3
+ const jsxCode = `
4
+ var err = preflightChecks();
5
+ if (err) {
6
+ writeResultFile(RESULT_PATH, err);
7
+ } else {
8
+ try {
9
+ var params = readParamsFile(PARAMS_PATH);
10
+ var maxDepth = (params.depth !== undefined) ? params.depth : 999;
11
+ var filterArtboard = (params.artboard_index !== undefined) ? params.artboard_index : -1;
12
+ var coordSystem = params.coordinate_system || "artboard-web";
13
+ var doc = app.activeDocument;
14
+
15
+ function getArtboardRect(item) {
16
+ var abIdx = getArtboardIndexForItem(item);
17
+ if (abIdx >= 0) {
18
+ return doc.artboards[abIdx].artboardRect;
19
+ }
20
+ return null;
21
+ }
22
+
23
+ function shouldIncludeItem(item) {
24
+ if (filterArtboard < 0) { return true; }
25
+ var abIdx = getArtboardIndexForItem(item);
26
+ return abIdx === filterArtboard;
27
+ }
28
+
29
+ function traverseItems(container, currentDepth) {
30
+ var children = [];
31
+ if (currentDepth >= maxDepth) { return children; }
32
+ for (var i = 0; i < container.pageItems.length; i++) {
33
+ var item = container.pageItems[i];
34
+ if (!shouldIncludeItem(item)) { continue; }
35
+ var itemType = getItemType(item);
36
+ var abRect = getArtboardRect(item);
37
+ var child = {
38
+ uuid: ensureUUID(item),
39
+ name: "",
40
+ type: itemType,
41
+ zIndex: getZIndex(item),
42
+ bounds: getBounds(item, coordSystem, abRect)
43
+ };
44
+ try { child.name = item.name || ""; } catch (e) {}
45
+ if (itemType === "group") {
46
+ try {
47
+ child.children = traverseItems(item, currentDepth + 1);
48
+ } catch (e) {
49
+ child.children = [];
50
+ }
51
+ }
52
+ children.push(child);
53
+ }
54
+ return children;
55
+ }
56
+
57
+ function traverseLayer(layer, currentDepth) {
58
+ var info = {
59
+ name: layer.name,
60
+ visible: layer.visible,
61
+ locked: layer.locked,
62
+ zIndex: 0,
63
+ children: []
64
+ };
65
+ try { info.zIndex = layer.zOrderPosition; } catch (e) {}
66
+
67
+ if (currentDepth < maxDepth) {
68
+ info.children = traverseItems(layer, currentDepth);
69
+
70
+ // Include sublayers as nested layers
71
+ for (var s = 0; s < layer.layers.length; s++) {
72
+ info.children.push(traverseLayer(layer.layers[s], currentDepth + 1));
73
+ }
74
+ }
75
+
76
+ return info;
77
+ }
78
+
79
+ var layers = [];
80
+ for (var i = 0; i < doc.layers.length; i++) {
81
+ layers.push(traverseLayer(doc.layers[i], 0));
82
+ }
83
+
84
+ writeResultFile(RESULT_PATH, {
85
+ coordinateSystem: coordSystem,
86
+ layers: layers
87
+ });
88
+ } catch (e) {
89
+ writeResultFile(RESULT_PATH, { error: true, message: "get_document_structure: " + e.message, line: e.line });
90
+ }
91
+ }
92
+ `;
93
+ export function register(server) {
94
+ server.registerTool('get_document_structure', {
95
+ title: 'Get Document Structure',
96
+ description: 'Get tree structure of layers, groups, and objects',
97
+ inputSchema: {
98
+ depth: z
99
+ .number()
100
+ .optional()
101
+ .describe('Maximum traversal depth (unlimited if omitted)'),
102
+ artboard_index: z
103
+ .number()
104
+ .optional()
105
+ .describe('Filter by artboard index (0-based integer)'),
106
+ coordinate_system: z
107
+ .enum(['artboard-web', 'document'])
108
+ .optional()
109
+ .default('artboard-web')
110
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
111
+ },
112
+ annotations: {
113
+ readOnlyHint: true,
114
+ destructiveHint: false,
115
+ idempotentHint: true,
116
+ openWorldHint: false,
117
+ },
118
+ }, async (params) => {
119
+ const result = await executeJsx(jsxCode, params);
120
+ return {
121
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
122
+ };
123
+ });
124
+ }
125
+ //# sourceMappingURL=get-document-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-structure.js","sourceRoot":"","sources":["../../../src/tools/read/get-document-structure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,mDAAmD;QAChE,WAAW,EAAE;YACX,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC;YACzD,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,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,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,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=get-effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-effects.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoKpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}
@@ -0,0 +1,187 @@
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 targetUuid = (params && params.target) ? params.target : null;
12
+ var selectionOnly = (params && params.selection_only === true) ? true : false;
13
+ var doc = app.activeDocument;
14
+
15
+ function blendModeToString(mode) {
16
+ if (mode === BlendModes.NORMAL) return "normal";
17
+ if (mode === BlendModes.MULTIPLY) return "multiply";
18
+ if (mode === BlendModes.SCREEN) return "screen";
19
+ if (mode === BlendModes.OVERLAY) return "overlay";
20
+ if (mode === BlendModes.SOFTLIGHT) return "softLight";
21
+ if (mode === BlendModes.HARDLIGHT) return "hardLight";
22
+ if (mode === BlendModes.COLORDODGE) return "colorDodge";
23
+ if (mode === BlendModes.COLORBURN) return "colorBurn";
24
+ if (mode === BlendModes.DARKEN) return "darken";
25
+ if (mode === BlendModes.LIGHTEN) return "lighten";
26
+ if (mode === BlendModes.DIFFERENCE) return "difference";
27
+ if (mode === BlendModes.EXCLUSION) return "exclusion";
28
+ if (mode === BlendModes.HUE) return "hue";
29
+ if (mode === BlendModes.SATURATION) return "saturationBlend";
30
+ if (mode === BlendModes.COLOR) return "colorBlend";
31
+ if (mode === BlendModes.LUMINOSITY) return "luminosity";
32
+ return "unknown";
33
+ }
34
+
35
+ function getEffectInfo(item, coordSys) {
36
+ var uuid = ensureUUID(item);
37
+ var zIdx = getZIndex(item);
38
+ var itemType = getItemType(item);
39
+ var abIndex = getArtboardIndexForItem(item);
40
+ var abRect = null;
41
+ if (abIndex >= 0) { abRect = doc.artboards[abIndex].artboardRect; }
42
+ var bounds = getBounds(item, coordSys, abRect);
43
+
44
+ var info = {
45
+ uuid: uuid,
46
+ zIndex: zIdx,
47
+ name: "",
48
+ type: itemType,
49
+ bounds: bounds,
50
+ opacity: 100,
51
+ blendingMode: "normal",
52
+ fill: null,
53
+ stroke: null,
54
+ limitations: "ExtendScript DOM cannot access: multiple fills/strokes (only first), live effects parameters, full appearance stack. Only opacity, blendingMode, and primary fill/stroke are returned."
55
+ };
56
+
57
+ try { info.name = item.name || ""; } catch(e) {}
58
+ try { info.opacity = item.opacity; } catch(e) {}
59
+ try { info.blendingMode = blendModeToString(item.blendingMode); } catch(e) {}
60
+
61
+ // Fill and stroke info for path-like items
62
+ try {
63
+ if (itemType === "path") {
64
+ info.fill = { filled: item.filled };
65
+ if (item.filled) {
66
+ info.fill.color = colorToObject(item.fillColor);
67
+ }
68
+ info.stroke = { stroked: item.stroked };
69
+ if (item.stroked) {
70
+ info.stroke.color = colorToObject(item.strokeColor);
71
+ info.stroke.width = item.strokeWidth;
72
+ }
73
+ } else if (itemType === "compound-path") {
74
+ if (item.pathItems.length > 0) {
75
+ var fp = item.pathItems[0];
76
+ info.fill = { filled: fp.filled };
77
+ if (fp.filled) {
78
+ info.fill.color = colorToObject(fp.fillColor);
79
+ }
80
+ info.stroke = { stroked: fp.stroked };
81
+ if (fp.stroked) {
82
+ info.stroke.color = colorToObject(fp.strokeColor);
83
+ info.stroke.width = fp.strokeWidth;
84
+ }
85
+ }
86
+ } else if (itemType === "text") {
87
+ // TextFrameItem does not expose fill/stroke directly in the same way
88
+ // but we can try character attributes
89
+ try {
90
+ if (item.textRanges.length > 0) {
91
+ var tr = item.textRanges[0];
92
+ var ca = tr.characterAttributes;
93
+ info.fill = { filled: true, color: colorToObject(ca.fillColor) };
94
+ if (ca.strokeWeight > 0) {
95
+ info.stroke = { stroked: true, color: colorToObject(ca.strokeColor), width: ca.strokeWeight };
96
+ } else {
97
+ info.stroke = { stroked: false };
98
+ }
99
+ }
100
+ } catch(e) {}
101
+ }
102
+ } catch(e) {}
103
+
104
+ return info;
105
+ }
106
+
107
+ var items = [];
108
+
109
+ function findByNote(items, uuid) {
110
+ for (var i = 0; i < items.length; i++) {
111
+ var item = items[i];
112
+ try { if (item.note === uuid) return item; } catch(e) {}
113
+ if (item.typename === "GroupItem") {
114
+ try {
115
+ var child = findByNote(item.pageItems, uuid);
116
+ if (child) return child;
117
+ } catch(e2) {}
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+
123
+ if (targetUuid) {
124
+ // Find specific item by UUID
125
+ var targetItem = null;
126
+ for (var li = 0; li < doc.layers.length; li++) {
127
+ targetItem = findByNote(doc.layers[li].pageItems, targetUuid);
128
+ if (targetItem) break;
129
+ }
130
+ if (targetItem) {
131
+ items.push(getEffectInfo(targetItem, coordSystem));
132
+ } else {
133
+ writeResultFile(RESULT_PATH, { error: true, message: "Item not found with UUID: " + targetUuid });
134
+ }
135
+ } else if (selectionOnly) {
136
+ var sel = doc.selection;
137
+ if (sel && sel.length > 0) {
138
+ for (var si = 0; si < sel.length; si++) {
139
+ items.push(getEffectInfo(sel[si], coordSystem));
140
+ }
141
+ }
142
+ } else {
143
+ var limit = 500;
144
+ var count = doc.pageItems.length < limit ? doc.pageItems.length : limit;
145
+ for (var j = 0; j < count; j++) {
146
+ items.push(getEffectInfo(doc.pageItems[j], coordSystem));
147
+ }
148
+ }
149
+
150
+ if (!targetUuid || items.length > 0) {
151
+ writeResultFile(RESULT_PATH, {
152
+ coordinateSystem: coordSystem,
153
+ count: items.length,
154
+ items: items
155
+ });
156
+ }
157
+ }
158
+ } catch (e) {
159
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
160
+ }
161
+ `;
162
+ export function register(server) {
163
+ server.registerTool('get_effects', {
164
+ title: 'Get Effects',
165
+ description: 'Get effect and appearance information',
166
+ inputSchema: {
167
+ target: z.string().optional().describe('Filter by UUID for a specific object'),
168
+ selection_only: z.boolean().optional().default(false).describe('Selected objects only'),
169
+ coordinate_system: z
170
+ .enum(['artboard-web', 'document'])
171
+ .optional()
172
+ .default('artboard-web'),
173
+ },
174
+ annotations: {
175
+ readOnlyHint: true,
176
+ destructiveHint: false,
177
+ idempotentHint: true,
178
+ openWorldHint: false,
179
+ },
180
+ }, async (params) => {
181
+ const result = await executeJsx(jsxCode, params);
182
+ return {
183
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
184
+ };
185
+ });
186
+ }
187
+ //# sourceMappingURL=get-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-effects.js","sourceRoot":"","sources":["../../../src/tools/read/get-effects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Jf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,uCAAuC;QACpD,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YAC9E,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACvF,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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=get-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-groups.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuJpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}