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,174 @@
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 maxDepth = (params && params.depth !== undefined) ? params.depth : 10;
12
+ var layerName = (params && params.layer_name) ? params.layer_name : null;
13
+ var doc = app.activeDocument;
14
+
15
+ function buildChildTree(container, currentDepth, coordSys) {
16
+ var children = [];
17
+ if (currentDepth >= maxDepth) { return children; }
18
+ for (var i = 0; i < container.pageItems.length; i++) {
19
+ var child = container.pageItems[i];
20
+ var childUuid = ensureUUID(child);
21
+ var childType = getItemType(child);
22
+ var abIdx = getArtboardIndexForItem(child);
23
+ var abRect = null;
24
+ if (abIdx >= 0) { abRect = doc.artboards[abIdx].artboardRect; }
25
+ var childBounds = getBounds(child, coordSys, abRect);
26
+ var childInfo = {
27
+ uuid: childUuid,
28
+ name: "",
29
+ type: childType,
30
+ bounds: childBounds
31
+ };
32
+ try { childInfo.name = child.name || ""; } catch(e) {}
33
+ if (childType === "group" || childType === "compound-path") {
34
+ try {
35
+ childInfo.children = buildChildTree(child, currentDepth + 1, coordSys);
36
+ } catch(e) {
37
+ childInfo.children = [];
38
+ }
39
+ }
40
+ children.push(childInfo);
41
+ }
42
+ return children;
43
+ }
44
+
45
+ var results = [];
46
+
47
+ // Determine source container
48
+ var sourceLayer = null;
49
+ if (layerName) {
50
+ for (var li = 0; li < doc.layers.length; li++) {
51
+ if (doc.layers[li].name === layerName) {
52
+ sourceLayer = doc.layers[li];
53
+ break;
54
+ }
55
+ }
56
+ if (!sourceLayer) {
57
+ writeResultFile(RESULT_PATH, { error: true, message: "Layer not found: " + layerName });
58
+ }
59
+ }
60
+
61
+ if (layerName && !sourceLayer) {
62
+ // Already wrote error above; skip rest
63
+ } else {
64
+
65
+ // Collect groups
66
+ var groupSource = sourceLayer ? sourceLayer.groupItems : doc.groupItems;
67
+ for (var g = 0; g < groupSource.length; g++) {
68
+ var group = groupSource[g];
69
+ var uuid = ensureUUID(group);
70
+ var zIdx = getZIndex(group);
71
+ var abIndex = getArtboardIndexForItem(group);
72
+ var artboardRect = null;
73
+ if (abIndex >= 0) { artboardRect = doc.artboards[abIndex].artboardRect; }
74
+ var bounds = getBounds(group, coordSystem, artboardRect);
75
+
76
+ var groupType = "group";
77
+ try {
78
+ if (group.clipped === true) { groupType = "clipping-mask"; }
79
+ } catch(e) {}
80
+
81
+ var info = {
82
+ uuid: uuid,
83
+ zIndex: zIdx,
84
+ name: "",
85
+ type: groupType,
86
+ bounds: bounds,
87
+ children: []
88
+ };
89
+ try { info.name = group.name || ""; } catch(e) {}
90
+ try {
91
+ info.children = buildChildTree(group, 0, coordSystem);
92
+ } catch(e) {
93
+ info.children = [];
94
+ }
95
+ results.push(info);
96
+ }
97
+
98
+ // Collect compound paths
99
+ var cpSource = sourceLayer ? sourceLayer.compoundPathItems : doc.compoundPathItems;
100
+ for (var c = 0; c < cpSource.length; c++) {
101
+ var cp = cpSource[c];
102
+ var cpUuid = ensureUUID(cp);
103
+ var cpZIdx = getZIndex(cp);
104
+ var cpAbIndex = getArtboardIndexForItem(cp);
105
+ var cpAbRect = null;
106
+ if (cpAbIndex >= 0) { cpAbRect = doc.artboards[cpAbIndex].artboardRect; }
107
+ var cpBounds = getBounds(cp, coordSystem, cpAbRect);
108
+
109
+ var cpInfo = {
110
+ uuid: cpUuid,
111
+ zIndex: cpZIdx,
112
+ name: "",
113
+ type: "compound-path",
114
+ bounds: cpBounds,
115
+ children: []
116
+ };
117
+ try { cpInfo.name = cp.name || ""; } catch(e) {}
118
+ try {
119
+ for (var pi = 0; pi < cp.pathItems.length; pi++) {
120
+ var pathChild = cp.pathItems[pi];
121
+ var pcUuid = ensureUUID(pathChild);
122
+ var pcAbIdx = getArtboardIndexForItem(pathChild);
123
+ var pcAbRect = null;
124
+ if (pcAbIdx >= 0) { pcAbRect = doc.artboards[pcAbIdx].artboardRect; }
125
+ var pcBounds = getBounds(pathChild, coordSystem, pcAbRect);
126
+ cpInfo.children.push({
127
+ uuid: pcUuid,
128
+ name: pathChild.name || "",
129
+ type: "path",
130
+ bounds: pcBounds
131
+ });
132
+ }
133
+ } catch(e) {}
134
+ results.push(cpInfo);
135
+ }
136
+
137
+ writeResultFile(RESULT_PATH, {
138
+ coordinateSystem: coordSystem,
139
+ count: results.length,
140
+ groups: results
141
+ });
142
+
143
+ } // end of layerName && !sourceLayer guard
144
+ }
145
+ } catch (e) {
146
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
147
+ }
148
+ `;
149
+ export function register(server) {
150
+ server.registerTool('get_groups', {
151
+ title: 'Get Groups',
152
+ description: 'Get structure of groups, clipping masks, and compound paths',
153
+ inputSchema: {
154
+ layer_name: z.string().optional().describe('Filter by layer name (all layers if omitted)'),
155
+ depth: z.number().optional().default(10).describe('Maximum traversal depth'),
156
+ coordinate_system: z
157
+ .enum(['artboard-web', 'document'])
158
+ .optional()
159
+ .default('artboard-web'),
160
+ },
161
+ annotations: {
162
+ readOnlyHint: true,
163
+ destructiveHint: false,
164
+ idempotentHint: true,
165
+ openWorldHint: false,
166
+ },
167
+ }, async (params) => {
168
+ const result = await executeJsx(jsxCode, params);
169
+ return {
170
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
171
+ };
172
+ });
173
+ }
174
+ //# sourceMappingURL=get-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-groups.js","sourceRoot":"","sources":["../../../src/tools/read/get-groups.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC5E,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-guidelines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-guidelines.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-guidelines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8EpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2BhD"}
@@ -0,0 +1,100 @@
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 coordSystem = params.coordinate_system || "artboard-web";
11
+ var doc = app.activeDocument;
12
+
13
+ var artboardRect = null;
14
+ if (coordSystem === "artboard-web") {
15
+ artboardRect = getActiveArtboardRect();
16
+ }
17
+
18
+ var horizontal = [];
19
+ var vertical = [];
20
+
21
+ function checkGuide(item) {
22
+ if (!item.guides) return;
23
+ var pts = item.pathPoints;
24
+ if (pts.length < 2) return;
25
+
26
+ var allSameY = true;
27
+ var allSameX = true;
28
+ var firstY = pts[0].anchor[1];
29
+ var firstX = pts[0].anchor[0];
30
+
31
+ for (var p = 1; p < pts.length; p++) {
32
+ if (Math.abs(pts[p].anchor[1] - firstY) > 0.01) allSameY = false;
33
+ if (Math.abs(pts[p].anchor[0] - firstX) > 0.01) allSameX = false;
34
+ }
35
+
36
+ if (allSameY) {
37
+ var yVal = firstY;
38
+ if (coordSystem === "artboard-web" && artboardRect) {
39
+ yVal = -(firstY - artboardRect[1]);
40
+ }
41
+ horizontal.push({ position: yVal, locked: item.locked });
42
+ } else if (allSameX) {
43
+ var xVal = firstX;
44
+ if (coordSystem === "artboard-web" && artboardRect) {
45
+ xVal = firstX - artboardRect[0];
46
+ }
47
+ vertical.push({ position: xVal, locked: item.locked });
48
+ }
49
+ }
50
+
51
+ // 全レイヤーを再帰的に走査してガイドを収集
52
+ function scanLayer(layer) {
53
+ for (var i = 0; i < layer.pathItems.length; i++) {
54
+ checkGuide(layer.pathItems[i]);
55
+ }
56
+ for (var j = 0; j < layer.layers.length; j++) {
57
+ scanLayer(layer.layers[j]);
58
+ }
59
+ }
60
+
61
+ for (var li = 0; li < doc.layers.length; li++) {
62
+ scanLayer(doc.layers[li]);
63
+ }
64
+
65
+ writeResultFile(RESULT_PATH, {
66
+ coordinateSystem: coordSystem,
67
+ horizontal: horizontal,
68
+ vertical: vertical,
69
+ totalCount: horizontal.length + vertical.length
70
+ });
71
+ } catch (e) {
72
+ writeResultFile(RESULT_PATH, { error: true, message: "get_guidelines: " + e.message, line: e.line });
73
+ }
74
+ }
75
+ `;
76
+ export function register(server) {
77
+ server.registerTool('get_guidelines', {
78
+ title: 'Get Guidelines',
79
+ description: 'Get guide information',
80
+ inputSchema: {
81
+ coordinate_system: z
82
+ .enum(['artboard-web', 'document'])
83
+ .optional()
84
+ .default('artboard-web')
85
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
86
+ },
87
+ annotations: {
88
+ readOnlyHint: true,
89
+ destructiveHint: false,
90
+ idempotentHint: true,
91
+ openWorldHint: false,
92
+ },
93
+ }, async (params) => {
94
+ const result = await executeJsx(jsxCode, params);
95
+ return {
96
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
97
+ };
98
+ });
99
+ }
100
+ //# sourceMappingURL=get-guidelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-guidelines.js","sourceRoot":"","sources":["../../../src/tools/read/get-guidelines.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,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;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-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-images.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2IpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}
@@ -0,0 +1,160 @@
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 images = [];
13
+
14
+ // Linked images (PlacedItems)
15
+ for (var i = 0; i < doc.placedItems.length; i++) {
16
+ var item = doc.placedItems[i];
17
+ var uuid = ensureUUID(item);
18
+ var zIdx = getZIndex(item);
19
+ var abIndex = getArtboardIndexForItem(item);
20
+ var artboardRect = null;
21
+ if (abIndex >= 0) {
22
+ artboardRect = doc.artboards[abIndex].artboardRect;
23
+ }
24
+ var bounds = getBounds(item, coordSystem, artboardRect);
25
+
26
+ var info = {
27
+ uuid: uuid,
28
+ zIndex: zIdx,
29
+ type: "linked",
30
+ filePath: "",
31
+ linkBroken: false,
32
+ resolution: null,
33
+ colorSpace: null,
34
+ pixelWidth: null,
35
+ pixelHeight: null,
36
+ artboardIndex: abIndex,
37
+ bounds: bounds
38
+ };
39
+
40
+ try {
41
+ info.filePath = item.file.fsName;
42
+ } catch (e) {
43
+ info.linkBroken = true;
44
+ }
45
+
46
+ try { info.name = item.name || ""; } catch(e) {}
47
+
48
+ images.push(info);
49
+ }
50
+
51
+ // Embedded / raster images (RasterItems)
52
+ for (var j = 0; j < doc.rasterItems.length; j++) {
53
+ var rItem = doc.rasterItems[j];
54
+ var rUuid = ensureUUID(rItem);
55
+ var rZIdx = getZIndex(rItem);
56
+ var rAbIndex = getArtboardIndexForItem(rItem);
57
+ var rArtboardRect = null;
58
+ if (rAbIndex >= 0) {
59
+ rArtboardRect = doc.artboards[rAbIndex].artboardRect;
60
+ }
61
+ var rBounds = getBounds(rItem, coordSystem, rArtboardRect);
62
+
63
+ var rInfo = {
64
+ uuid: rUuid,
65
+ zIndex: rZIdx,
66
+ type: rItem.embedded ? "embedded" : "linked",
67
+ filePath: "",
68
+ linkBroken: false,
69
+ resolution: null,
70
+ colorSpace: null,
71
+ pixelWidth: null,
72
+ pixelHeight: null,
73
+ artboardIndex: rAbIndex,
74
+ bounds: rBounds
75
+ };
76
+
77
+ try { rInfo.name = rItem.name || ""; } catch(e) {}
78
+
79
+ // colorSpace detection
80
+ try {
81
+ var cs = rItem.imageColorSpace;
82
+ if (cs === ImageColorSpace.RGB) {
83
+ rInfo.colorSpace = "RGB";
84
+ } else if (cs === ImageColorSpace.CMYK) {
85
+ rInfo.colorSpace = "CMYK";
86
+ } else if (cs === ImageColorSpace.Grayscale) {
87
+ rInfo.colorSpace = "grayscale";
88
+ } else {
89
+ rInfo.colorSpace = "other";
90
+ }
91
+ } catch (e) {}
92
+
93
+ // pixel dimensions and resolution
94
+ try {
95
+ // geometricBounds: [left, top, right, bottom] in points
96
+ var gb = rItem.geometricBounds;
97
+ var placedWidthPt = gb[2] - gb[0];
98
+ var placedHeightPt = -(gb[3] - gb[1]); // top > bottom in AI coords
99
+
100
+ // RasterItem exposes matrix; columns/rows not directly available
101
+ // but we can try to access them
102
+ try {
103
+ // Some versions expose these
104
+ var pw = rItem.artworkKnockout; // dummy access to keep try block
105
+ } catch(e2) {}
106
+
107
+ // Attempt to get pixel size from the item's internal properties
108
+ try {
109
+ var m = rItem.matrix;
110
+ if (m && placedWidthPt > 0 && placedHeightPt > 0) {
111
+ // matrix.mValueA and mValueD give scale factors from pixels to points
112
+ var scaleX = Math.abs(m.mValueA);
113
+ var scaleY = Math.abs(m.mValueD);
114
+ if (scaleX > 0 && scaleY > 0) {
115
+ rInfo.pixelWidth = Math.round(placedWidthPt / scaleX);
116
+ rInfo.pixelHeight = Math.round(placedHeightPt / scaleY);
117
+ // PPI = pixels / (points / 72)
118
+ rInfo.resolution = Math.round(rInfo.pixelWidth / (placedWidthPt / 72));
119
+ }
120
+ }
121
+ } catch(e3) {}
122
+ } catch (e) {}
123
+
124
+ images.push(rInfo);
125
+ }
126
+
127
+ writeResultFile(RESULT_PATH, {
128
+ imageCount: images.length,
129
+ coordinateSystem: coordSystem,
130
+ images: images
131
+ });
132
+ }
133
+ } catch (e) {
134
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
135
+ }
136
+ `;
137
+ export function register(server) {
138
+ server.registerTool('get_images', {
139
+ title: 'Get Images',
140
+ description: 'Get embedded and linked image information',
141
+ inputSchema: {
142
+ coordinate_system: z
143
+ .enum(['artboard-web', 'document'])
144
+ .optional()
145
+ .default('artboard-web'),
146
+ },
147
+ annotations: {
148
+ readOnlyHint: true,
149
+ destructiveHint: false,
150
+ idempotentHint: true,
151
+ openWorldHint: false,
152
+ },
153
+ }, async (params) => {
154
+ const result = await executeJsx(jsxCode, params);
155
+ return {
156
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
157
+ };
158
+ });
159
+ }
160
+ //# sourceMappingURL=get-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-images.js","sourceRoot":"","sources":["../../../src/tools/read/get-images.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqIf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,2CAA2C;QACxD,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-layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-layers.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgFpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqChD"}
@@ -0,0 +1,112 @@
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 includeSublayers = params.include_sublayers !== false;
11
+ var includeItems = params.include_items === true;
12
+ var coordSystem = params.coordinate_system || "artboard-web";
13
+
14
+ var doc = app.activeDocument;
15
+ var artboardRect = null;
16
+ if (coordSystem === "artboard-web") {
17
+ artboardRect = getActiveArtboardRect();
18
+ }
19
+
20
+ function extractLayerColor(layer) {
21
+ try {
22
+ var c = layer.color;
23
+ return { r: c.red, g: c.green, b: c.blue };
24
+ } catch (e) {
25
+ return null;
26
+ }
27
+ }
28
+
29
+ function extractItems(layer) {
30
+ var items = [];
31
+ for (var i = 0; i < layer.pageItems.length; i++) {
32
+ var item = layer.pageItems[i];
33
+ items.push({
34
+ uuid: ensureUUID(item),
35
+ name: item.name || "",
36
+ type: getItemType(item),
37
+ bounds: getBounds(item, coordSystem, artboardRect)
38
+ });
39
+ }
40
+ return items;
41
+ }
42
+
43
+ function traverseLayer(layer) {
44
+ var info = {
45
+ name: layer.name,
46
+ visible: layer.visible,
47
+ locked: layer.locked,
48
+ color: extractLayerColor(layer),
49
+ item_count: layer.pageItems.length
50
+ };
51
+
52
+ if (includeItems) {
53
+ info.items = extractItems(layer);
54
+ }
55
+
56
+ if (includeSublayers && layer.layers.length > 0) {
57
+ var sublayers = [];
58
+ for (var j = 0; j < layer.layers.length; j++) {
59
+ sublayers.push(traverseLayer(layer.layers[j]));
60
+ }
61
+ info.sublayers = sublayers;
62
+ }
63
+
64
+ return info;
65
+ }
66
+
67
+ var layers = [];
68
+ for (var i = 0; i < doc.layers.length; i++) {
69
+ layers.push(traverseLayer(doc.layers[i]));
70
+ }
71
+
72
+ writeResultFile(RESULT_PATH, { layers: layers });
73
+ } catch (e) {
74
+ writeResultFile(RESULT_PATH, { error: true, message: "get_layers: " + e.message, line: e.line });
75
+ }
76
+ }
77
+ `;
78
+ export function register(server) {
79
+ server.registerTool('get_layers', {
80
+ title: 'Get Layers',
81
+ description: 'Get layer structure as a tree',
82
+ inputSchema: {
83
+ include_sublayers: z
84
+ .boolean()
85
+ .optional()
86
+ .default(true)
87
+ .describe('Include sublayers'),
88
+ include_items: z
89
+ .boolean()
90
+ .optional()
91
+ .default(false)
92
+ .describe('Include items within each layer'),
93
+ coordinate_system: z
94
+ .enum(['artboard-web', 'document'])
95
+ .optional()
96
+ .default('artboard-web')
97
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
98
+ },
99
+ annotations: {
100
+ readOnlyHint: true,
101
+ destructiveHint: false,
102
+ idempotentHint: true,
103
+ openWorldHint: false,
104
+ },
105
+ }, async (params) => {
106
+ const result = await executeJsx(jsxCode, params);
107
+ return {
108
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
109
+ };
110
+ });
111
+ }
112
+ //# sourceMappingURL=get-layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-layers.js","sourceRoot":"","sources":["../../../src/tools/read/get-layers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Ef,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE;YACX,iBAAiB,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,mBAAmB,CAAC;YAChC,aAAa,EAAE,CAAC;iBACb,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,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-overprint-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-overprint-info.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-overprint-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwFpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}