illustrator-mcp-server 1.2.3 → 1.2.5

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 (246) hide show
  1. package/README.ja.md +525 -107
  2. package/README.md +510 -89
  3. package/dist/executor/jsx-runner.d.ts +1 -0
  4. package/dist/executor/jsx-runner.d.ts.map +1 -1
  5. package/dist/executor/jsx-runner.js +33 -19
  6. package/dist/executor/jsx-runner.js.map +1 -1
  7. package/dist/jsx/helpers/common.jsx +113 -7
  8. package/dist/prompts/print-preflight-workflow.d.ts +3 -0
  9. package/dist/prompts/print-preflight-workflow.d.ts.map +1 -0
  10. package/dist/prompts/print-preflight-workflow.js +45 -0
  11. package/dist/prompts/print-preflight-workflow.js.map +1 -0
  12. package/dist/prompts/quick-layout.d.ts +3 -0
  13. package/dist/prompts/quick-layout.d.ts.map +1 -0
  14. package/dist/prompts/quick-layout.js +42 -0
  15. package/dist/prompts/quick-layout.js.map +1 -0
  16. package/dist/prompts/registry.d.ts +3 -0
  17. package/dist/prompts/registry.d.ts.map +1 -0
  18. package/dist/prompts/registry.js +7 -0
  19. package/dist/prompts/registry.js.map +1 -0
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +3 -1
  22. package/dist/server.js.map +1 -1
  23. package/dist/tools/export/export-pdf.d.ts.map +1 -1
  24. package/dist/tools/export/export-pdf.js +48 -18
  25. package/dist/tools/export/export-pdf.js.map +1 -1
  26. package/dist/tools/export/export.d.ts.map +1 -1
  27. package/dist/tools/export/export.js +41 -49
  28. package/dist/tools/export/export.js.map +1 -1
  29. package/dist/tools/modify/align-objects.d.ts +3 -0
  30. package/dist/tools/modify/align-objects.d.ts.map +1 -0
  31. package/dist/tools/modify/align-objects.js +195 -0
  32. package/dist/tools/modify/align-objects.js.map +1 -0
  33. package/dist/tools/modify/apply-color-profile.d.ts.map +1 -1
  34. package/dist/tools/modify/apply-color-profile.js +12 -10
  35. package/dist/tools/modify/apply-color-profile.js.map +1 -1
  36. package/dist/tools/modify/apply-graphic-style.d.ts +3 -0
  37. package/dist/tools/modify/apply-graphic-style.d.ts.map +1 -0
  38. package/dist/tools/modify/apply-graphic-style.js +100 -0
  39. package/dist/tools/modify/apply-graphic-style.js.map +1 -0
  40. package/dist/tools/modify/apply-text-style.d.ts +3 -0
  41. package/dist/tools/modify/apply-text-style.d.ts.map +1 -0
  42. package/dist/tools/modify/apply-text-style.js +117 -0
  43. package/dist/tools/modify/apply-text-style.js.map +1 -0
  44. package/dist/tools/modify/close-document.d.ts +3 -0
  45. package/dist/tools/modify/close-document.d.ts.map +1 -0
  46. package/dist/tools/modify/close-document.js +46 -0
  47. package/dist/tools/modify/close-document.js.map +1 -0
  48. package/dist/tools/modify/convert-to-outlines.d.ts.map +1 -1
  49. package/dist/tools/modify/convert-to-outlines.js +7 -29
  50. package/dist/tools/modify/convert-to-outlines.js.map +1 -1
  51. package/dist/tools/modify/create-document.d.ts +3 -0
  52. package/dist/tools/modify/create-document.d.ts.map +1 -0
  53. package/dist/tools/modify/create-document.js +67 -0
  54. package/dist/tools/modify/create-document.js.map +1 -0
  55. package/dist/tools/modify/create-ellipse.d.ts.map +1 -1
  56. package/dist/tools/modify/create-ellipse.js +15 -32
  57. package/dist/tools/modify/create-ellipse.js.map +1 -1
  58. package/dist/tools/modify/create-gradient.d.ts +3 -0
  59. package/dist/tools/modify/create-gradient.d.ts.map +1 -0
  60. package/dist/tools/modify/create-gradient.js +111 -0
  61. package/dist/tools/modify/create-gradient.js.map +1 -0
  62. package/dist/tools/modify/create-line.d.ts.map +1 -1
  63. package/dist/tools/modify/create-line.js +16 -36
  64. package/dist/tools/modify/create-line.js.map +1 -1
  65. package/dist/tools/modify/create-path-text.d.ts +3 -0
  66. package/dist/tools/modify/create-path-text.d.ts.map +1 -0
  67. package/dist/tools/modify/create-path-text.js +85 -0
  68. package/dist/tools/modify/create-path-text.js.map +1 -0
  69. package/dist/tools/modify/create-path.d.ts.map +1 -1
  70. package/dist/tools/modify/create-path.js +18 -38
  71. package/dist/tools/modify/create-path.js.map +1 -1
  72. package/dist/tools/modify/create-rectangle.d.ts.map +1 -1
  73. package/dist/tools/modify/create-rectangle.js +16 -32
  74. package/dist/tools/modify/create-rectangle.js.map +1 -1
  75. package/dist/tools/modify/create-text-frame.d.ts.map +1 -1
  76. package/dist/tools/modify/create-text-frame.js +27 -40
  77. package/dist/tools/modify/create-text-frame.js.map +1 -1
  78. package/dist/tools/modify/duplicate-objects.d.ts +3 -0
  79. package/dist/tools/modify/duplicate-objects.d.ts.map +1 -0
  80. package/dist/tools/modify/duplicate-objects.js +97 -0
  81. package/dist/tools/modify/duplicate-objects.js.map +1 -0
  82. package/dist/tools/modify/group-objects.d.ts +3 -0
  83. package/dist/tools/modify/group-objects.d.ts.map +1 -0
  84. package/dist/tools/modify/group-objects.js +79 -0
  85. package/dist/tools/modify/group-objects.js.map +1 -0
  86. package/dist/tools/modify/manage-artboards.d.ts +3 -0
  87. package/dist/tools/modify/manage-artboards.d.ts.map +1 -0
  88. package/dist/tools/modify/manage-artboards.js +142 -0
  89. package/dist/tools/modify/manage-artboards.js.map +1 -0
  90. package/dist/tools/modify/manage-datasets.d.ts +3 -0
  91. package/dist/tools/modify/manage-datasets.d.ts.map +1 -0
  92. package/dist/tools/modify/manage-datasets.js +126 -0
  93. package/dist/tools/modify/manage-datasets.js.map +1 -0
  94. package/dist/tools/modify/manage-layers.d.ts +3 -0
  95. package/dist/tools/modify/manage-layers.d.ts.map +1 -0
  96. package/dist/tools/modify/manage-layers.js +141 -0
  97. package/dist/tools/modify/manage-layers.js.map +1 -0
  98. package/dist/tools/modify/manage-linked-images.d.ts +3 -0
  99. package/dist/tools/modify/manage-linked-images.d.ts.map +1 -0
  100. package/dist/tools/modify/manage-linked-images.js +96 -0
  101. package/dist/tools/modify/manage-linked-images.js.map +1 -0
  102. package/dist/tools/modify/manage-swatches.d.ts +3 -0
  103. package/dist/tools/modify/manage-swatches.d.ts.map +1 -0
  104. package/dist/tools/modify/manage-swatches.js +78 -0
  105. package/dist/tools/modify/manage-swatches.js.map +1 -0
  106. package/dist/tools/modify/modify-object.d.ts.map +1 -1
  107. package/dist/tools/modify/modify-object.js +31 -47
  108. package/dist/tools/modify/modify-object.js.map +1 -1
  109. package/dist/tools/modify/move-to-layer.d.ts +3 -0
  110. package/dist/tools/modify/move-to-layer.d.ts.map +1 -0
  111. package/dist/tools/modify/move-to-layer.js +73 -0
  112. package/dist/tools/modify/move-to-layer.js.map +1 -0
  113. package/dist/tools/modify/open-document.d.ts +3 -0
  114. package/dist/tools/modify/open-document.d.ts.map +1 -0
  115. package/dist/tools/modify/open-document.js +72 -0
  116. package/dist/tools/modify/open-document.js.map +1 -0
  117. package/dist/tools/modify/place-color-chips.d.ts +3 -0
  118. package/dist/tools/modify/place-color-chips.d.ts.map +1 -0
  119. package/dist/tools/modify/place-color-chips.js +218 -0
  120. package/dist/tools/modify/place-color-chips.js.map +1 -0
  121. package/dist/tools/modify/place-image.d.ts +3 -0
  122. package/dist/tools/modify/place-image.d.ts.map +1 -0
  123. package/dist/tools/modify/place-image.js +113 -0
  124. package/dist/tools/modify/place-image.js.map +1 -0
  125. package/dist/tools/modify/place-symbol.d.ts +3 -0
  126. package/dist/tools/modify/place-symbol.d.ts.map +1 -0
  127. package/dist/tools/modify/place-symbol.js +96 -0
  128. package/dist/tools/modify/place-symbol.js.map +1 -0
  129. package/dist/tools/modify/replace-color.d.ts +3 -0
  130. package/dist/tools/modify/replace-color.d.ts.map +1 -0
  131. package/dist/tools/modify/replace-color.js +136 -0
  132. package/dist/tools/modify/replace-color.js.map +1 -0
  133. package/dist/tools/modify/resize-for-variation.d.ts +3 -0
  134. package/dist/tools/modify/resize-for-variation.d.ts.map +1 -0
  135. package/dist/tools/modify/resize-for-variation.js +169 -0
  136. package/dist/tools/modify/resize-for-variation.js.map +1 -0
  137. package/dist/tools/modify/save-document.d.ts +3 -0
  138. package/dist/tools/modify/save-document.d.ts.map +1 -0
  139. package/dist/tools/modify/save-document.js +63 -0
  140. package/dist/tools/modify/save-document.js.map +1 -0
  141. package/dist/tools/modify/set-z-order.d.ts +3 -0
  142. package/dist/tools/modify/set-z-order.d.ts.map +1 -0
  143. package/dist/tools/modify/set-z-order.js +60 -0
  144. package/dist/tools/modify/set-z-order.js.map +1 -0
  145. package/dist/tools/modify/shared.d.ts +49 -1
  146. package/dist/tools/modify/shared.d.ts.map +1 -1
  147. package/dist/tools/modify/shared.js +48 -4
  148. package/dist/tools/modify/shared.js.map +1 -1
  149. package/dist/tools/modify/undo.d.ts +3 -0
  150. package/dist/tools/modify/undo.d.ts.map +1 -0
  151. package/dist/tools/modify/undo.js +64 -0
  152. package/dist/tools/modify/undo.js.map +1 -0
  153. package/dist/tools/modify/ungroup-objects.d.ts +3 -0
  154. package/dist/tools/modify/ungroup-objects.d.ts.map +1 -0
  155. package/dist/tools/modify/ungroup-objects.js +67 -0
  156. package/dist/tools/modify/ungroup-objects.js.map +1 -0
  157. package/dist/tools/read/check-contrast.d.ts +3 -0
  158. package/dist/tools/read/check-contrast.d.ts.map +1 -0
  159. package/dist/tools/read/check-contrast.js +239 -0
  160. package/dist/tools/read/check-contrast.js.map +1 -0
  161. package/dist/tools/read/convert-coordinate.d.ts +3 -0
  162. package/dist/tools/read/convert-coordinate.d.ts.map +1 -0
  163. package/dist/tools/read/convert-coordinate.js +74 -0
  164. package/dist/tools/read/convert-coordinate.js.map +1 -0
  165. package/dist/tools/read/extract-design-tokens.d.ts +3 -0
  166. package/dist/tools/read/extract-design-tokens.d.ts.map +1 -0
  167. package/dist/tools/read/extract-design-tokens.js +258 -0
  168. package/dist/tools/read/extract-design-tokens.js.map +1 -0
  169. package/dist/tools/read/find-objects.d.ts.map +1 -1
  170. package/dist/tools/read/find-objects.js +16 -37
  171. package/dist/tools/read/find-objects.js.map +1 -1
  172. package/dist/tools/read/get-artboards.d.ts.map +1 -1
  173. package/dist/tools/read/get-artboards.js +15 -13
  174. package/dist/tools/read/get-artboards.js.map +1 -1
  175. package/dist/tools/read/get-colors.d.ts.map +1 -1
  176. package/dist/tools/read/get-colors.js +93 -15
  177. package/dist/tools/read/get-colors.js.map +1 -1
  178. package/dist/tools/read/get-document-info.d.ts.map +1 -1
  179. package/dist/tools/read/get-document-info.js +47 -19
  180. package/dist/tools/read/get-document-info.js.map +1 -1
  181. package/dist/tools/read/get-document-structure.d.ts.map +1 -1
  182. package/dist/tools/read/get-document-structure.js +16 -24
  183. package/dist/tools/read/get-document-structure.js.map +1 -1
  184. package/dist/tools/read/get-effects.d.ts.map +1 -1
  185. package/dist/tools/read/get-effects.js +32 -43
  186. package/dist/tools/read/get-effects.js.map +1 -1
  187. package/dist/tools/read/get-groups.d.ts.map +1 -1
  188. package/dist/tools/read/get-groups.js +22 -26
  189. package/dist/tools/read/get-groups.js.map +1 -1
  190. package/dist/tools/read/get-guidelines.d.ts.map +1 -1
  191. package/dist/tools/read/get-guidelines.js +13 -16
  192. package/dist/tools/read/get-guidelines.js.map +1 -1
  193. package/dist/tools/read/get-images.d.ts.map +1 -1
  194. package/dist/tools/read/get-images.js +43 -25
  195. package/dist/tools/read/get-images.js.map +1 -1
  196. package/dist/tools/read/get-layers.d.ts.map +1 -1
  197. package/dist/tools/read/get-layers.js +14 -15
  198. package/dist/tools/read/get-layers.js.map +1 -1
  199. package/dist/tools/read/get-overprint-info.d.ts.map +1 -1
  200. package/dist/tools/read/get-overprint-info.js +72 -63
  201. package/dist/tools/read/get-overprint-info.js.map +1 -1
  202. package/dist/tools/read/get-path-items.d.ts.map +1 -1
  203. package/dist/tools/read/get-path-items.js +26 -20
  204. package/dist/tools/read/get-path-items.js.map +1 -1
  205. package/dist/tools/read/get-selection.d.ts.map +1 -1
  206. package/dist/tools/read/get-selection.js +19 -33
  207. package/dist/tools/read/get-selection.js.map +1 -1
  208. package/dist/tools/read/get-separation-info.d.ts +3 -0
  209. package/dist/tools/read/get-separation-info.d.ts.map +1 -0
  210. package/dist/tools/read/get-separation-info.js +94 -0
  211. package/dist/tools/read/get-separation-info.js.map +1 -0
  212. package/dist/tools/read/get-symbols.d.ts.map +1 -1
  213. package/dist/tools/read/get-symbols.js +19 -23
  214. package/dist/tools/read/get-symbols.js.map +1 -1
  215. package/dist/tools/read/get-text-frame-detail.d.ts.map +1 -1
  216. package/dist/tools/read/get-text-frame-detail.js +270 -67
  217. package/dist/tools/read/get-text-frame-detail.js.map +1 -1
  218. package/dist/tools/read/list-fonts.d.ts +3 -0
  219. package/dist/tools/read/list-fonts.d.ts.map +1 -0
  220. package/dist/tools/read/list-fonts.js +78 -0
  221. package/dist/tools/read/list-fonts.js.map +1 -0
  222. package/dist/tools/read/list-text-frames.d.ts.map +1 -1
  223. package/dist/tools/read/list-text-frames.js +99 -36
  224. package/dist/tools/read/list-text-frames.js.map +1 -1
  225. package/dist/tools/registry.d.ts.map +1 -1
  226. package/dist/tools/registry.js +68 -0
  227. package/dist/tools/registry.js.map +1 -1
  228. package/dist/tools/session.d.ts +36 -0
  229. package/dist/tools/session.d.ts.map +1 -0
  230. package/dist/tools/session.js +246 -0
  231. package/dist/tools/session.js.map +1 -0
  232. package/dist/tools/utility/check-text-consistency.d.ts +3 -0
  233. package/dist/tools/utility/check-text-consistency.d.ts.map +1 -0
  234. package/dist/tools/utility/check-text-consistency.js +303 -0
  235. package/dist/tools/utility/check-text-consistency.js.map +1 -0
  236. package/dist/tools/utility/preflight-check.d.ts.map +1 -1
  237. package/dist/tools/utility/preflight-check.js +141 -43
  238. package/dist/tools/utility/preflight-check.js.map +1 -1
  239. package/dist/tools/utility/set-workflow.d.ts +3 -0
  240. package/dist/tools/utility/set-workflow.d.ts.map +1 -0
  241. package/dist/tools/utility/set-workflow.js +95 -0
  242. package/dist/tools/utility/set-workflow.js.map +1 -0
  243. package/dist/utils/image-header.d.ts.map +1 -1
  244. package/dist/utils/image-header.js +5 -1
  245. package/dist/utils/image-header.js.map +1 -1
  246. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } from '../../executor/jsx-runner.js';
3
+ import { coordinateSystemSchema, resolveCoordinateSystem, } from '../session.js';
4
+ import { WRITE_ANNOTATIONS } from './shared.js';
5
+ /**
6
+ * place_image — 画像の配置(リンク/埋め込み)
7
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/PlacedItems/ — PlacedItems.add()
8
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/PlacedItem/ — file, embed()
9
+ *
10
+ * 注意: PlacedItem.file はリファレンスで read-only と記載されているが、
11
+ * PlacedItems.add() 後に設定する方法が PlacedItems のドキュメントで推奨されている。
12
+ */
13
+ const jsxCode = `
14
+ var preflight = preflightChecks();
15
+ if (preflight) {
16
+ writeResultFile(RESULT_PATH, preflight);
17
+ } else {
18
+ try {
19
+ var params = readParamsFile(PARAMS_PATH);
20
+ var doc = app.activeDocument;
21
+ var coordSystem = params.coordinate_system || "artboard-web";
22
+
23
+ var filePath = params.file_path;
24
+ var imgFile = new File(filePath);
25
+ if (!imgFile.exists) {
26
+ writeResultFile(RESULT_PATH, { error: true, message: "Image file not found: " + filePath });
27
+ } else {
28
+ var targetLayer = resolveTargetLayer(doc, params.layer_name);
29
+
30
+ var placed = targetLayer.placedItems.add();
31
+ placed.file = imgFile;
32
+
33
+ // Position
34
+ if (typeof params.x === "number" && typeof params.y === "number") {
35
+ var abRect = (coordSystem === "artboard-web") ? getActiveArtboardRect() : null;
36
+ var pos = webToAiPoint(params.x, params.y, coordSystem, abRect);
37
+ placed.left = pos[0];
38
+ placed.top = pos[1];
39
+ }
40
+
41
+ if (params.name) {
42
+ placed.name = params.name;
43
+ }
44
+
45
+ // Embed if requested — embed() transforms PlacedItem into RasterItem
46
+ var resultItem = placed;
47
+ if (params.embed === true) {
48
+ // Mark with a temporary tag before embed so we can find the resulting RasterItem
49
+ var tag = "__place_image_embed_" + (new Date()).getTime();
50
+ placed.name = tag;
51
+ placed.embed();
52
+ // After embed(), 'placed' is no longer valid. Find the RasterItem by name.
53
+ var foundEmbedded = false;
54
+ for (var ri = 0; ri < doc.rasterItems.length; ri++) {
55
+ if (doc.rasterItems[ri].name === tag) {
56
+ resultItem = doc.rasterItems[ri];
57
+ foundEmbedded = true;
58
+ break;
59
+ }
60
+ }
61
+ if (!foundEmbedded) {
62
+ writeResultFile(RESULT_PATH, { error: true, message: "embed() succeeded but resulting RasterItem could not be found" });
63
+ return;
64
+ }
65
+ // タグ名をクリア(ユーザー指定名があれば復元、なければ空文字に)
66
+ resultItem.name = params.name || "";
67
+ }
68
+
69
+ var uuid = ensureUUID(resultItem);
70
+ var bounds = resultItem.geometricBounds;
71
+ var widthPt = bounds[2] - bounds[0];
72
+ var heightPt = -(bounds[3] - bounds[1]);
73
+ if (widthPt < 0) widthPt = -widthPt;
74
+ if (heightPt < 0) heightPt = -heightPt;
75
+
76
+ writeResultFile(RESULT_PATH, {
77
+ uuid: uuid,
78
+ type: params.embed ? "embedded" : "linked",
79
+ filePath: filePath,
80
+ widthPt: widthPt,
81
+ heightPt: heightPt
82
+ });
83
+ }
84
+ } catch (e) {
85
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to place image: " + e.message, line: e.line });
86
+ }
87
+ }
88
+ `;
89
+ export function register(server) {
90
+ server.registerTool('place_image', {
91
+ title: 'Place Image',
92
+ description: 'Place an image file (PNG, JPG, TIFF, PSD, etc.) into the document as a linked or embedded image. Note: Illustrator will be activated (brought to foreground) during execution.',
93
+ inputSchema: {
94
+ file_path: z.string().describe('Absolute path to the image file'),
95
+ x: z.number().optional().describe('X position'),
96
+ y: z.number().optional().describe('Y position'),
97
+ embed: z
98
+ .boolean()
99
+ .optional()
100
+ .default(false)
101
+ .describe('Embed the image instead of linking (default: false)'),
102
+ layer_name: z.string().optional().describe('Target layer name'),
103
+ name: z.string().optional().describe('Object name'),
104
+ coordinate_system: coordinateSystemSchema,
105
+ },
106
+ annotations: WRITE_ANNOTATIONS,
107
+ }, async (params) => {
108
+ const resolvedParams = { ...params, coordinate_system: await resolveCoordinateSystem(params.coordinate_system) };
109
+ const result = await executeJsx(jsxCode, resolvedParams, { activate: true });
110
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
111
+ });
112
+ }
113
+ //# sourceMappingURL=place-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place-image.js","sourceRoot":"","sources":["../../../src/tools/modify/place-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Ef,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,gLAAgL;QAClL,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACjE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/C,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/C,KAAK,EAAE,CAAC;iBACL,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,qDAAqD,CAAC;YAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACnD,iBAAiB,EAAE,sBAAsB;SAC1C;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,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=place-symbol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place-symbol.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/place-symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyEpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6BhD"}
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } from '../../executor/jsx-runner.js';
3
+ import { coordinateSystemSchema } from '../session.js';
4
+ import { WRITE_ANNOTATIONS } from './shared.js';
5
+ /**
6
+ * place_symbol — シンボルインスタンスの配置・シンボル定義の差し替え
7
+ *
8
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/SymbolItems/ — SymbolItems.add(), SymbolItem.symbol
9
+ *
10
+ * JSX API:
11
+ * Document.symbolItems.add(symbol: Symbol) → SymbolItem
12
+ * Document.symbols.getByName(name: String) → Symbol
13
+ * SymbolItem.position → [x, y] (writable)
14
+ * SymbolItem.symbol → Symbol (writable — 差し替え可能)
15
+ */
16
+ const jsxCode = `
17
+ var preflight = preflightChecks();
18
+ if (preflight) {
19
+ writeResultFile(RESULT_PATH, preflight);
20
+ } else {
21
+ try {
22
+ var params = readParamsFile(PARAMS_PATH);
23
+ var doc = app.activeDocument;
24
+ var coordSystem = params.coordinate_system || "artboard-web";
25
+
26
+ if (params.action === "place") {
27
+ var sym = null;
28
+ try {
29
+ sym = doc.symbols.getByName(params.symbol_name);
30
+ } catch(e) {
31
+ writeResultFile(RESULT_PATH, { error: true, message: "Symbol not found: " + params.symbol_name });
32
+ }
33
+ if (sym) {
34
+ var si = doc.symbolItems.add(sym);
35
+ if (typeof params.x === "number" && typeof params.y === "number") {
36
+ var abIndex = doc.artboards.getActiveArtboardIndex();
37
+ var abRect = getArtboardRectByIndex(abIndex);
38
+ si.position = webToAiPoint(params.x, params.y, coordSystem, abRect);
39
+ }
40
+ var uuid = ensureUUID(si);
41
+ writeResultFile(RESULT_PATH, { success: true, uuid: uuid, symbolName: params.symbol_name });
42
+ }
43
+ } else if (params.action === "replace") {
44
+ if (!params.uuid) {
45
+ writeResultFile(RESULT_PATH, { error: true, message: "uuid is required for replace action" });
46
+ } else {
47
+ var item = findItemByUUID(params.uuid);
48
+ if (!item || item.typename !== "SymbolItem") {
49
+ writeResultFile(RESULT_PATH, { error: true, message: "Symbol item not found: " + params.uuid });
50
+ } else {
51
+ var newSym = null;
52
+ try {
53
+ newSym = doc.symbols.getByName(params.symbol_name);
54
+ } catch(e) {
55
+ writeResultFile(RESULT_PATH, { error: true, message: "Symbol not found: " + params.symbol_name });
56
+ }
57
+ if (newSym) {
58
+ item.symbol = newSym;
59
+ writeResultFile(RESULT_PATH, { success: true, uuid: params.uuid, newSymbolName: params.symbol_name });
60
+ }
61
+ }
62
+ }
63
+ } else {
64
+ writeResultFile(RESULT_PATH, { error: true, message: "Unknown action: " + params.action });
65
+ }
66
+ } catch (e) {
67
+ writeResultFile(RESULT_PATH, { error: true, message: "place_symbol failed: " + e.message, line: e.line });
68
+ }
69
+ }
70
+ `;
71
+ export function register(server) {
72
+ server.registerTool('place_symbol', {
73
+ title: 'Place Symbol',
74
+ description: 'Place a new symbol instance or replace the symbol definition of an existing instance. Note: Illustrator will be activated (brought to foreground) during execution.',
75
+ inputSchema: {
76
+ action: z
77
+ .enum(['place', 'replace'])
78
+ .describe('place = new instance, replace = swap symbol definition'),
79
+ symbol_name: z
80
+ .string()
81
+ .describe('Symbol name to place or new symbol name for replace'),
82
+ x: z.number().optional().describe('X position (for place action)'),
83
+ y: z.number().optional().describe('Y position (for place action)'),
84
+ uuid: z
85
+ .string()
86
+ .optional()
87
+ .describe('UUID of existing symbol item (for replace action)'),
88
+ coordinate_system: coordinateSystemSchema,
89
+ },
90
+ annotations: WRITE_ANNOTATIONS,
91
+ }, async (params) => {
92
+ const result = await executeJsx(jsxCode, params, { activate: true });
93
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
94
+ });
95
+ }
96
+ //# sourceMappingURL=place-symbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place-symbol.js","sourceRoot":"","sources":["../../../src/tools/modify/place-symbol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,qKAAqK;QACvK,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;iBAC1B,QAAQ,CAAC,wDAAwD,CAAC;YACrE,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,qDAAqD,CAAC;YAClE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAClE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAClE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mDAAmD,CAAC;YAChE,iBAAiB,EAAE,sBAAsB;SAC1C;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,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=replace-color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-color.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/replace-color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4GpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiChD"}
@@ -0,0 +1,136 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } from '../../executor/jsx-runner.js';
3
+ import { colorSchema, COLOR_HELPERS_JSX, DESTRUCTIVE_ANNOTATIONS } from './shared.js';
4
+ /**
5
+ * replace_color — 塗り/線の色を一括置換
6
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/PathItem/ — fillColor, strokeColor
7
+ *
8
+ * 制限事項: SpotColor, GrayColor のマッチングは未対応。
9
+ * クロスカラースペース(RGB→CMYK等)のマッチングも不可。
10
+ */
11
+ const jsxCode = `
12
+ ${COLOR_HELPERS_JSX}
13
+
14
+ var preflight = preflightChecks();
15
+ if (preflight) {
16
+ writeResultFile(RESULT_PATH, preflight);
17
+ } else {
18
+ try {
19
+ var params = readParamsFile(PARAMS_PATH);
20
+ var doc = app.activeDocument;
21
+ var fromColor = params.from_color;
22
+ var toColor = params.to_color;
23
+ var tolerance = (typeof params.tolerance === "number") ? params.tolerance : 0;
24
+ var target = params.target || "both";
25
+ var scope = params.scope || null;
26
+
27
+ function colorsMatch(c1, c2, tol) {
28
+ try {
29
+ if (c1.typename === "CMYKColor" && c2.type === "cmyk") {
30
+ return Math.abs(c1.cyan - c2.c) <= tol &&
31
+ Math.abs(c1.magenta - c2.m) <= tol &&
32
+ Math.abs(c1.yellow - c2.y) <= tol &&
33
+ Math.abs(c1.black - c2.k) <= tol;
34
+ } else if (c1.typename === "RGBColor" && c2.type === "rgb") {
35
+ return Math.abs(c1.red - c2.r) <= tol &&
36
+ Math.abs(c1.green - c2.g) <= tol &&
37
+ Math.abs(c1.blue - c2.b) <= tol;
38
+ }
39
+ } catch(e) {}
40
+ return false;
41
+ }
42
+
43
+ var newColorObj = createColor(toColor);
44
+ var replacedCount = 0;
45
+
46
+ // Determine scope
47
+ var pathSource;
48
+ if (scope) {
49
+ var foundLayer = null;
50
+ function findLayerByName(layers, name) {
51
+ for (var li = 0; li < layers.length; li++) {
52
+ if (layers[li].name === name) return layers[li];
53
+ try {
54
+ var sub = findLayerByName(layers[li].layers, name);
55
+ if (sub) return sub;
56
+ } catch(e2) {}
57
+ }
58
+ return null;
59
+ }
60
+ foundLayer = findLayerByName(doc.layers, scope);
61
+ if (foundLayer) {
62
+ pathSource = foundLayer.pathItems;
63
+ } else {
64
+ writeResultFile(RESULT_PATH, { error: true, message: "Layer not found: " + scope });
65
+ pathSource = null;
66
+ }
67
+ } else {
68
+ pathSource = doc.pathItems;
69
+ }
70
+
71
+ if (pathSource) {
72
+ for (var i = 0; i < pathSource.length; i++) {
73
+ var item = pathSource[i];
74
+ // Replace fill
75
+ if ((target === "fill" || target === "both") && item.filled) {
76
+ try {
77
+ if (colorsMatch(item.fillColor, fromColor, tolerance)) {
78
+ item.fillColor = newColorObj;
79
+ replacedCount++;
80
+ }
81
+ } catch(e) {}
82
+ }
83
+ // Replace stroke
84
+ if ((target === "stroke" || target === "both") && item.stroked) {
85
+ try {
86
+ if (colorsMatch(item.strokeColor, fromColor, tolerance)) {
87
+ item.strokeColor = newColorObj;
88
+ replacedCount++;
89
+ }
90
+ } catch(e) {}
91
+ }
92
+ }
93
+
94
+ writeResultFile(RESULT_PATH, {
95
+ success: true,
96
+ replacedCount: replacedCount,
97
+ fromColor: fromColor,
98
+ toColor: toColor
99
+ });
100
+ }
101
+ } catch (e) {
102
+ writeResultFile(RESULT_PATH, { error: true, message: "Replace color failed: " + e.message, line: e.line });
103
+ }
104
+ }
105
+ `;
106
+ export function register(server) {
107
+ server.registerTool('replace_color', {
108
+ title: 'Replace Color',
109
+ description: 'Find and replace colors across the document or within a specific layer. Limitations: SpotColor and GrayColor matching not supported. Cross-colorspace matching (e.g. RGB→CMYK) not possible — from_color and to_color must use the same color type as the target objects.',
110
+ inputSchema: {
111
+ from_color: colorSchema.unwrap().describe('Color to find (required)'),
112
+ to_color: colorSchema.unwrap().describe('Replacement color (required)'),
113
+ tolerance: z
114
+ .number()
115
+ .min(0)
116
+ .max(100)
117
+ .optional()
118
+ .default(0)
119
+ .describe('Color matching tolerance per channel (0 = exact match, 100 = match any)'),
120
+ target: z
121
+ .enum(['fill', 'stroke', 'both'])
122
+ .optional()
123
+ .default('both')
124
+ .describe('Which color attributes to replace'),
125
+ scope: z
126
+ .string()
127
+ .optional()
128
+ .describe('Layer name to limit replacement scope (default: entire document)'),
129
+ },
130
+ annotations: DESTRUCTIVE_ANNOTATIONS,
131
+ }, async (params) => {
132
+ const result = await executeJsx(jsxCode, params);
133
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
134
+ });
135
+ }
136
+ //# sourceMappingURL=replace-color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-color.js","sourceRoot":"","sources":["../../../src/tools/modify/replace-color.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;;GAMG;AACH,MAAM,OAAO,GAAG;EACd,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FlB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,2QAA2Q;QACxR,WAAW,EAAE;YACX,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACrE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YACvE,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;iBAChC,QAAQ,EAAE;iBACV,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CAAC,mCAAmC,CAAC;YAChD,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;SAChF;QACD,WAAW,EAAE,uBAAuB;KACrC,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=resize-for-variation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-for-variation.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/resize-for-variation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6IpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuChD"}
@@ -0,0 +1,169 @@
1
+ import { z } from 'zod';
2
+ import { executeJsxHeavy } from '../../executor/jsx-runner.js';
3
+ import { coordinateSystemSchema, resolveCoordinateSystem, } from '../session.js';
4
+ import { WRITE_ANNOTATIONS } from './shared.js';
5
+ /**
6
+ * resize_for_variation — アートボード単位のサイズバリエーション生成
7
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Artboards/ — Artboards.add()
8
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/PageItem/ — duplicate(), resize()
9
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Document/ — selectObjectsOnActiveArtboard()
10
+ */
11
+ const jsxCode = `
12
+ var preflight = preflightChecks();
13
+ if (preflight) {
14
+ writeResultFile(RESULT_PATH, preflight);
15
+ } else {
16
+ try {
17
+ var params = readParamsFile(PARAMS_PATH);
18
+ var doc = app.activeDocument;
19
+ var srcIdx = params.source_artboard_index;
20
+ var targetSizes = params.target_sizes;
21
+ var scaleMode = params.scale_mode || "proportional";
22
+
23
+ if (srcIdx < 0 || srcIdx >= doc.artboards.length) {
24
+ writeResultFile(RESULT_PATH, {
25
+ error: true,
26
+ message: "Source artboard index " + srcIdx + " is out of range (0-" + (doc.artboards.length - 1) + ")"
27
+ });
28
+ } else {
29
+ var srcAb = doc.artboards[srcIdx];
30
+ var srcRect = srcAb.artboardRect; // [left, top, right, bottom]
31
+ var srcWidth = srcRect[2] - srcRect[0];
32
+ var srcHeight = srcRect[1] - srcRect[3]; // top - bottom (AI coords: top > bottom)
33
+
34
+ // Collect all items on source artboard
35
+ doc.artboards.setActiveArtboardIndex(srcIdx);
36
+ doc.selectObjectsOnActiveArtboard();
37
+ var srcItems = doc.selection;
38
+
39
+ if (!srcItems || srcItems.length === 0) {
40
+ writeResultFile(RESULT_PATH, {
41
+ error: true,
42
+ message: "No objects found on source artboard " + srcIdx
43
+ });
44
+ } else {
45
+ var createdArtboards = [];
46
+
47
+ for (var ti = 0; ti < targetSizes.length; ti++) {
48
+ var target = targetSizes[ti];
49
+ // Convert mm to points if coordinate_system is artboard-web (assume points input)
50
+ var tgtWidthPt = target.width;
51
+ var tgtHeightPt = target.height;
52
+
53
+ // Calculate new artboard position (place to the right of existing artboards)
54
+ var lastAb = doc.artboards[doc.artboards.length - 1];
55
+ var lastRect = lastAb.artboardRect;
56
+ var offsetX = lastRect[2] + 50; // 50pt gap
57
+ var newRect = [offsetX, lastRect[1], offsetX + tgtWidthPt, lastRect[1] - tgtHeightPt];
58
+
59
+ // Create new artboard
60
+ var newAb = doc.artboards.add(newRect);
61
+ var newAbIdx = doc.artboards.length - 1;
62
+ if (target.name) {
63
+ newAb.name = target.name;
64
+ }
65
+
66
+ // Calculate scale factor
67
+ var scaleX = tgtWidthPt / srcWidth;
68
+ var scaleY = tgtHeightPt / srcHeight;
69
+ var scale = 1;
70
+ if (scaleMode === "proportional") {
71
+ scale = Math.min(scaleX, scaleY);
72
+ } else if (scaleMode === "fit_width") {
73
+ scale = scaleX;
74
+ } else if (scaleMode === "fit_height") {
75
+ scale = scaleY;
76
+ }
77
+
78
+ // Re-select source items (selection may have been lost)
79
+ doc.artboards.setActiveArtboardIndex(srcIdx);
80
+ doc.selectObjectsOnActiveArtboard();
81
+ var itemsToCopy = doc.selection;
82
+
83
+ // Duplicate and transform each item
84
+ var duplicatedItems = [];
85
+ for (var ii = 0; ii < itemsToCopy.length; ii++) {
86
+ var srcItem = itemsToCopy[ii];
87
+ var dup = srcItem.duplicate();
88
+ duplicatedItems.push(dup);
89
+ }
90
+
91
+ // Move and scale duplicated items
92
+ for (var di = 0; di < duplicatedItems.length; di++) {
93
+ var dupItem = duplicatedItems[di];
94
+ var origPos = duplicatedItems[di].position; // [x, y] in doc coords
95
+
96
+ // Calculate relative position within source artboard (0-1)
97
+ var relX = (origPos[0] - srcRect[0]) / srcWidth;
98
+ var relY = (origPos[1] - srcRect[1]) / srcHeight; // srcRect[1] is top
99
+
100
+ // Scale the item
101
+ var scalePercent = scale * 100;
102
+ dupItem.resize(scalePercent, scalePercent);
103
+
104
+ // Position on target artboard
105
+ var newX = newRect[0] + relX * tgtWidthPt;
106
+ var newY = newRect[1] + relY * tgtHeightPt;
107
+ dupItem.position = [newX, newY];
108
+ }
109
+
110
+ createdArtboards.push({
111
+ artboardIndex: newAbIdx,
112
+ name: target.name || ("Variation " + (ti + 1)),
113
+ width: tgtWidthPt,
114
+ height: tgtHeightPt,
115
+ scaleFactor: Math.round(scale * 100),
116
+ objectCount: duplicatedItems.length
117
+ });
118
+ }
119
+
120
+ // Deselect
121
+ doc.selection = null;
122
+
123
+ writeResultFile(RESULT_PATH, {
124
+ success: true,
125
+ sourceArtboard: srcIdx,
126
+ createdCount: createdArtboards.length,
127
+ artboards: createdArtboards
128
+ });
129
+ }
130
+ }
131
+ } catch (e) {
132
+ writeResultFile(RESULT_PATH, { error: true, message: "Resize for variation failed: " + e.message, line: e.line });
133
+ }
134
+ }
135
+ `;
136
+ export function register(server) {
137
+ server.registerTool('resize_for_variation', {
138
+ title: 'Resize for Variation',
139
+ description: 'Create size variations from a source artboard. Duplicates all objects and scales/repositions them proportionally to fit target sizes. Limitations: no text reflow, effects/strokes scale with objects but may need manual adjustment, proportional placement only (not smart layout).',
140
+ inputSchema: {
141
+ source_artboard_index: z
142
+ .number()
143
+ .int()
144
+ .min(0)
145
+ .describe('Source artboard index to duplicate from (0-based)'),
146
+ target_sizes: z
147
+ .array(z.object({
148
+ width: z.number().describe('Target width in points'),
149
+ height: z.number().describe('Target height in points'),
150
+ name: z.string().optional().describe('Artboard name for this variation'),
151
+ }))
152
+ .min(1)
153
+ .max(10)
154
+ .describe('Target sizes for variations'),
155
+ scale_mode: z
156
+ .enum(['proportional', 'fit_width', 'fit_height'])
157
+ .optional()
158
+ .default('proportional')
159
+ .describe('How to scale objects: proportional (fit within, maintain aspect), fit_width, or fit_height'),
160
+ coordinate_system: coordinateSystemSchema,
161
+ },
162
+ annotations: WRITE_ANNOTATIONS,
163
+ }, async (params) => {
164
+ const resolvedParams = { ...params, coordinate_system: await resolveCoordinateSystem(params.coordinate_system) };
165
+ const result = await executeJsxHeavy(jsxCode, resolvedParams);
166
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
167
+ });
168
+ }
169
+ //# sourceMappingURL=resize-for-variation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-for-variation.js","sourceRoot":"","sources":["../../../src/tools/modify/resize-for-variation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Hf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,uRAAuR;QACzR,WAAW,EAAE;YACX,qBAAqB,EAAE,CAAC;iBACrB,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,mDAAmD,CAAC;YAChE,YAAY,EAAE,CAAC;iBACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACpD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;gBACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;aACzE,CAAC,CACH;iBACA,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,CAAC,6BAA6B,CAAC;YAC1C,UAAU,EAAE,CAAC;iBACV,IAAI,CAAC,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;iBACjD,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;iBACvB,QAAQ,CAAC,4FAA4F,CAAC;YACzG,iBAAiB,EAAE,sBAAsB;SAC1C;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC9D,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=save-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-document.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/save-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4CpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyBhD"}
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ import { executeJsx } from '../../executor/jsx-runner.js';
3
+ import { WRITE_IDEMPOTENT_ANNOTATIONS } from './shared.js';
4
+ /**
5
+ * save_document — ドキュメントの上書き保存・別名保存
6
+ *
7
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Document/ — Document.save(), Document.saveAs()
8
+ *
9
+ * JSX API:
10
+ * Document.save() → void (上書き保存)
11
+ * Document.saveAs(saveIn: File [, options]) → void (別名保存)
12
+ */
13
+ const jsxCode = `
14
+ var preflight = preflightChecks();
15
+ if (preflight) {
16
+ writeResultFile(RESULT_PATH, preflight);
17
+ } else {
18
+ try {
19
+ var params = readParamsFile(PARAMS_PATH);
20
+ var doc = app.activeDocument;
21
+ var mode = params.mode || "save";
22
+
23
+ if (mode === "save") {
24
+ doc.save();
25
+ writeResultFile(RESULT_PATH, { success: true, mode: "save" });
26
+ } else if (mode === "save_as") {
27
+ if (!params.path) {
28
+ writeResultFile(RESULT_PATH, { error: true, message: "path is required for save_as mode" });
29
+ } else {
30
+ var saveFile = new File(params.path);
31
+ doc.saveAs(saveFile);
32
+ writeResultFile(RESULT_PATH, { success: true, mode: "save_as", path: params.path });
33
+ }
34
+ } else {
35
+ writeResultFile(RESULT_PATH, { error: true, message: "Unknown mode: " + mode });
36
+ }
37
+ } catch (e) {
38
+ writeResultFile(RESULT_PATH, { error: true, message: "save_document failed: " + e.message, line: e.line });
39
+ }
40
+ }
41
+ `;
42
+ export function register(server) {
43
+ server.registerTool('save_document', {
44
+ title: 'Save Document',
45
+ description: 'Save the active Illustrator document. Note: Illustrator will be activated (brought to foreground) during execution.',
46
+ inputSchema: {
47
+ mode: z
48
+ .enum(['save', 'save_as'])
49
+ .optional()
50
+ .default('save')
51
+ .describe('save = overwrite, save_as = save to new path'),
52
+ path: z
53
+ .string()
54
+ .optional()
55
+ .describe('File path for save_as mode (required when mode is save_as)'),
56
+ },
57
+ annotations: WRITE_IDEMPOTENT_ANNOTATIONS,
58
+ }, async (params) => {
59
+ const result = await executeJsx(jsxCode, params, { activate: true });
60
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
61
+ });
62
+ }
63
+ //# sourceMappingURL=save-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-document.js","sourceRoot":"","sources":["../../../src/tools/modify/save-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,qHAAqH;QACvH,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;iBACzB,QAAQ,EAAE;iBACV,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;SAC1E;QACD,WAAW,EAAE,4BAA4B;KAC1C,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,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=set-z-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-z-order.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/set-z-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoBhD"}