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,150 @@
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 coordSystem = params.coordinate_system || "artboard-web";
12
+
13
+ function createColor(colorObj) {
14
+ if (!colorObj || colorObj.type === "none") return new NoColor();
15
+ if (colorObj.type === "cmyk") {
16
+ var c = new CMYKColor();
17
+ c.cyan = (typeof colorObj.c === "number") ? colorObj.c : 0;
18
+ c.magenta = (typeof colorObj.m === "number") ? colorObj.m : 0;
19
+ c.yellow = (typeof colorObj.y === "number") ? colorObj.y : 0;
20
+ c.black = (typeof colorObj.k === "number") ? colorObj.k : 0;
21
+ return c;
22
+ }
23
+ if (colorObj.type === "rgb") {
24
+ var c = new RGBColor();
25
+ c.red = (typeof colorObj.r === "number") ? colorObj.r : 0;
26
+ c.green = (typeof colorObj.g === "number") ? colorObj.g : 0;
27
+ c.blue = (typeof colorObj.b === "number") ? colorObj.b : 0;
28
+ return c;
29
+ }
30
+ return new NoColor();
31
+ }
32
+
33
+ var ix1 = params.x1;
34
+ var iy1 = params.y1;
35
+ var ix2 = params.x2;
36
+ var iy2 = params.y2;
37
+
38
+ var px1, py1, px2, py2;
39
+ if (coordSystem === "artboard-web") {
40
+ var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()];
41
+ var abRect = ab.artboardRect;
42
+ px1 = abRect[0] + ix1;
43
+ py1 = abRect[1] + (-iy1);
44
+ px2 = abRect[0] + ix2;
45
+ py2 = abRect[1] + (-iy2);
46
+ } else {
47
+ px1 = ix1;
48
+ py1 = iy1;
49
+ px2 = ix2;
50
+ py2 = iy2;
51
+ }
52
+
53
+ var targetLayer = doc.activeLayer;
54
+ if (params.layer_name) {
55
+ try {
56
+ targetLayer = doc.layers.getByName(params.layer_name);
57
+ } catch (e) {
58
+ targetLayer = doc.layers.add();
59
+ targetLayer.name = params.layer_name;
60
+ }
61
+ }
62
+
63
+ var line = targetLayer.pathItems.add();
64
+ line.setEntirePath([[px1, py1], [px2, py2]]);
65
+ line.filled = false;
66
+
67
+ if (params.stroke) {
68
+ line.stroked = true;
69
+ if (params.stroke.color) {
70
+ line.strokeColor = createColor(params.stroke.color);
71
+ }
72
+ if (typeof params.stroke.width === "number") {
73
+ line.strokeWidth = params.stroke.width;
74
+ }
75
+ if (params.stroke.cap) {
76
+ if (params.stroke.cap === "round") {
77
+ line.strokeCap = StrokeCap.ROUNDENDCAP;
78
+ } else if (params.stroke.cap === "projecting") {
79
+ line.strokeCap = StrokeCap.PROJECTINGENDCAP;
80
+ } else {
81
+ line.strokeCap = StrokeCap.BUTTENDCAP;
82
+ }
83
+ }
84
+ } else {
85
+ line.stroked = true;
86
+ }
87
+
88
+ if (params.name) {
89
+ line.name = params.name;
90
+ }
91
+
92
+ var uuid = ensureUUID(line);
93
+ writeResultFile(RESULT_PATH, { uuid: uuid });
94
+ } catch (e) {
95
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to create line: " + e.message, line: e.line });
96
+ }
97
+ }
98
+ `;
99
+ const colorSchema = z
100
+ .object({
101
+ type: z.enum(['cmyk', 'rgb', 'none']).describe('Color type'),
102
+ c: z.number().optional(),
103
+ m: z.number().optional(),
104
+ y: z.number().optional(),
105
+ k: z.number().optional(),
106
+ r: z.number().optional(),
107
+ g: z.number().optional(),
108
+ b: z.number().optional(),
109
+ })
110
+ .optional();
111
+ export function register(server) {
112
+ server.registerTool('create_line', {
113
+ title: 'Create Line',
114
+ description: 'Create a line',
115
+ inputSchema: {
116
+ x1: z.number().describe('Start point X coordinate'),
117
+ y1: z.number().describe('Start point Y coordinate'),
118
+ x2: z.number().describe('End point X coordinate'),
119
+ y2: z.number().describe('End point Y coordinate'),
120
+ stroke: z
121
+ .object({
122
+ color: colorSchema.describe('Stroke color'),
123
+ width: z.number().describe('Stroke width'),
124
+ cap: z
125
+ .enum(['butt', 'round', 'projecting'])
126
+ .optional()
127
+ .describe('Line cap style'),
128
+ })
129
+ .optional()
130
+ .describe('Stroke settings'),
131
+ layer_name: z.string().optional().describe('Target layer name'),
132
+ name: z.string().optional().describe('Object name'),
133
+ coordinate_system: z
134
+ .enum(['artboard-web', 'document'])
135
+ .optional()
136
+ .default('artboard-web')
137
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
138
+ },
139
+ annotations: {
140
+ readOnlyHint: false,
141
+ destructiveHint: false,
142
+ idempotentHint: false,
143
+ openWorldHint: false,
144
+ },
145
+ }, async (params) => {
146
+ const result = await executeJsx(jsxCode, params);
147
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
148
+ });
149
+ }
150
+ //# sourceMappingURL=create-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-line.js","sourceRoot":"","sources":["../../../src/tools/modify/create-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=create-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-path.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/create-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkKpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqChD"}
@@ -0,0 +1,192 @@
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 coordSystem = params.coordinate_system || "artboard-web";
12
+
13
+ function createColor(colorObj) {
14
+ if (!colorObj || colorObj.type === "none") return new NoColor();
15
+ if (colorObj.type === "cmyk") {
16
+ var c = new CMYKColor();
17
+ c.cyan = (typeof colorObj.c === "number") ? colorObj.c : 0;
18
+ c.magenta = (typeof colorObj.m === "number") ? colorObj.m : 0;
19
+ c.yellow = (typeof colorObj.y === "number") ? colorObj.y : 0;
20
+ c.black = (typeof colorObj.k === "number") ? colorObj.k : 0;
21
+ return c;
22
+ }
23
+ if (colorObj.type === "rgb") {
24
+ var c = new RGBColor();
25
+ c.red = (typeof colorObj.r === "number") ? colorObj.r : 0;
26
+ c.green = (typeof colorObj.g === "number") ? colorObj.g : 0;
27
+ c.blue = (typeof colorObj.b === "number") ? colorObj.b : 0;
28
+ return c;
29
+ }
30
+ return new NoColor();
31
+ }
32
+
33
+ function webToAiCoords(x, y, artboardRect) {
34
+ if (artboardRect) {
35
+ return [artboardRect[0] + x, artboardRect[1] - y];
36
+ }
37
+ return [x, y];
38
+ }
39
+
40
+ var abRect = null;
41
+ if (coordSystem === "artboard-web") {
42
+ var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()];
43
+ abRect = ab.artboardRect;
44
+ }
45
+
46
+ var targetLayer = doc.activeLayer;
47
+ if (params.layer_name) {
48
+ try {
49
+ targetLayer = doc.layers.getByName(params.layer_name);
50
+ } catch (e) {
51
+ targetLayer = doc.layers.add();
52
+ targetLayer.name = params.layer_name;
53
+ }
54
+ }
55
+
56
+ var anchors = params.anchors;
57
+ var closed = params.closed || false;
58
+
59
+ // まずアンカーポイントの座標を変換
60
+ var anchorPositions = [];
61
+ for (var i = 0; i < anchors.length; i++) {
62
+ var pt = anchors[i];
63
+ var aiCoords = webToAiCoords(pt.x, pt.y, abRect);
64
+ anchorPositions.push(aiCoords);
65
+ }
66
+
67
+ var path = targetLayer.pathItems.add();
68
+ path.closed = closed;
69
+
70
+ // setEntirePathでアンカー位置を設定
71
+ path.setEntirePath(anchorPositions);
72
+
73
+ // ハンドルやポイントタイプの設定
74
+ for (var i = 0; i < anchors.length; i++) {
75
+ var pt = anchors[i];
76
+ var pp = path.pathPoints[i];
77
+
78
+ if (pt.point_type === "smooth") {
79
+ pp.pointType = PointType.SMOOTH;
80
+ } else {
81
+ pp.pointType = PointType.CORNER;
82
+ }
83
+
84
+ if (pt.left_handle) {
85
+ var lh = webToAiCoords(pt.left_handle.x, pt.left_handle.y, abRect);
86
+ pp.leftDirection = lh;
87
+ }
88
+
89
+ if (pt.right_handle) {
90
+ var rh = webToAiCoords(pt.right_handle.x, pt.right_handle.y, abRect);
91
+ pp.rightDirection = rh;
92
+ }
93
+ }
94
+
95
+ if (params.fill) {
96
+ path.filled = true;
97
+ path.fillColor = createColor(params.fill);
98
+ } else {
99
+ path.filled = false;
100
+ }
101
+
102
+ if (params.stroke) {
103
+ path.stroked = true;
104
+ if (params.stroke.color) {
105
+ path.strokeColor = createColor(params.stroke.color);
106
+ }
107
+ if (typeof params.stroke.width === "number") {
108
+ path.strokeWidth = params.stroke.width;
109
+ }
110
+ }
111
+
112
+ if (params.name) {
113
+ path.name = params.name;
114
+ }
115
+
116
+ var uuid = ensureUUID(path);
117
+ writeResultFile(RESULT_PATH, { uuid: uuid });
118
+ } catch (e) {
119
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to create path: " + e.message, line: e.line });
120
+ }
121
+ }
122
+ `;
123
+ const colorSchema = z
124
+ .object({
125
+ type: z.enum(['cmyk', 'rgb', 'none']).describe('Color type'),
126
+ c: z.number().optional(),
127
+ m: z.number().optional(),
128
+ y: z.number().optional(),
129
+ k: z.number().optional(),
130
+ r: z.number().optional(),
131
+ g: z.number().optional(),
132
+ b: z.number().optional(),
133
+ })
134
+ .optional();
135
+ const anchorSchema = z.object({
136
+ x: z.number().describe('Anchor point X coordinate'),
137
+ y: z.number().describe('Anchor point Y coordinate'),
138
+ left_handle: z
139
+ .object({
140
+ x: z.number(),
141
+ y: z.number(),
142
+ })
143
+ .optional()
144
+ .describe('Left direction handle coordinates'),
145
+ right_handle: z
146
+ .object({
147
+ x: z.number(),
148
+ y: z.number(),
149
+ })
150
+ .optional()
151
+ .describe('Right direction handle coordinates'),
152
+ point_type: z
153
+ .enum(['corner', 'smooth'])
154
+ .optional()
155
+ .default('corner')
156
+ .describe('Point type'),
157
+ });
158
+ export function register(server) {
159
+ server.registerTool('create_path', {
160
+ title: 'Create Path',
161
+ description: 'Create a custom path',
162
+ inputSchema: {
163
+ anchors: z.array(anchorSchema).describe('Array of anchor points'),
164
+ closed: z.boolean().optional().default(false).describe('Whether to close the path'),
165
+ fill: colorSchema.describe('Fill color'),
166
+ stroke: z
167
+ .object({
168
+ color: colorSchema.describe('Stroke color'),
169
+ width: z.number().describe('Stroke width'),
170
+ })
171
+ .optional()
172
+ .describe('Stroke settings'),
173
+ layer_name: z.string().optional().describe('Target layer name'),
174
+ name: z.string().optional().describe('Object name'),
175
+ coordinate_system: z
176
+ .enum(['artboard-web', 'document'])
177
+ .optional()
178
+ .default('artboard-web')
179
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
180
+ },
181
+ annotations: {
182
+ readOnlyHint: false,
183
+ destructiveHint: false,
184
+ idempotentHint: false,
185
+ openWorldHint: false,
186
+ },
187
+ }, async (params) => {
188
+ const result = await executeJsx(jsxCode, params);
189
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
190
+ });
191
+ }
192
+ //# sourceMappingURL=create-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-path.js","sourceRoot":"","sources":["../../../src/tools/modify/create-path.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuHf,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC5D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACzB,CAAC;KACD,QAAQ,EAAE,CAAC;AAEd,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnD,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnD,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACd,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;IAChD,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACd,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;IACjD,UAAU,EAAE,CAAC;SACV,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC1B,QAAQ,EAAE;SACV,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,YAAY,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,sBAAsB;QACnC,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACjE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YACnF,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxC,MAAM,EAAE,CAAC;iBACN,MAAM,CAAC;gBACN,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;aAC3C,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,iBAAiB,CAAC;YAC9B,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,CAAC;iBACjB,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;iBACvB,QAAQ,CAAC,sGAAsG,CAAC;SACpH;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,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=create-rectangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rectangle.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/create-rectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4GpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwChD"}
@@ -0,0 +1,142 @@
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 coordSystem = params.coordinate_system || "artboard-web";
12
+
13
+ function createColor(colorObj) {
14
+ if (!colorObj || colorObj.type === "none") return new NoColor();
15
+ if (colorObj.type === "cmyk") {
16
+ var c = new CMYKColor();
17
+ c.cyan = (typeof colorObj.c === "number") ? colorObj.c : 0;
18
+ c.magenta = (typeof colorObj.m === "number") ? colorObj.m : 0;
19
+ c.yellow = (typeof colorObj.y === "number") ? colorObj.y : 0;
20
+ c.black = (typeof colorObj.k === "number") ? colorObj.k : 0;
21
+ return c;
22
+ }
23
+ if (colorObj.type === "rgb") {
24
+ var c = new RGBColor();
25
+ c.red = (typeof colorObj.r === "number") ? colorObj.r : 0;
26
+ c.green = (typeof colorObj.g === "number") ? colorObj.g : 0;
27
+ c.blue = (typeof colorObj.b === "number") ? colorObj.b : 0;
28
+ return c;
29
+ }
30
+ return new NoColor();
31
+ }
32
+
33
+ var inputX = params.x;
34
+ var inputY = params.y;
35
+ var w = params.width;
36
+ var h = params.height;
37
+ var cornerRadius = params.corner_radius || 0;
38
+
39
+ var left = inputX;
40
+ var top;
41
+ if (coordSystem === "artboard-web") {
42
+ var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()];
43
+ var abRect = ab.artboardRect;
44
+ left = abRect[0] + inputX;
45
+ top = abRect[1] + (-inputY);
46
+ } else {
47
+ top = inputY;
48
+ }
49
+
50
+ var targetLayer = doc.activeLayer;
51
+ if (params.layer_name) {
52
+ try {
53
+ targetLayer = doc.layers.getByName(params.layer_name);
54
+ } catch (e) {
55
+ targetLayer = doc.layers.add();
56
+ targetLayer.name = params.layer_name;
57
+ }
58
+ }
59
+
60
+ var rect;
61
+ if (cornerRadius > 0) {
62
+ rect = targetLayer.pathItems.roundedRectangle(top, left, w, h, cornerRadius, cornerRadius);
63
+ } else {
64
+ rect = targetLayer.pathItems.rectangle(top, left, w, h);
65
+ }
66
+
67
+ if (params.fill) {
68
+ rect.filled = true;
69
+ rect.fillColor = createColor(params.fill);
70
+ }
71
+
72
+ if (params.stroke) {
73
+ rect.stroked = true;
74
+ if (params.stroke.color) {
75
+ rect.strokeColor = createColor(params.stroke.color);
76
+ }
77
+ if (typeof params.stroke.width === "number") {
78
+ rect.strokeWidth = params.stroke.width;
79
+ }
80
+ }
81
+
82
+ if (params.name) {
83
+ rect.name = params.name;
84
+ }
85
+
86
+ var uuid = ensureUUID(rect);
87
+ writeResultFile(RESULT_PATH, { uuid: uuid });
88
+ } catch (e) {
89
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to create rectangle: " + e.message, line: e.line });
90
+ }
91
+ }
92
+ `;
93
+ const colorSchema = z
94
+ .object({
95
+ type: z.enum(['cmyk', 'rgb', 'none']).describe('Color type'),
96
+ c: z.number().optional(),
97
+ m: z.number().optional(),
98
+ y: z.number().optional(),
99
+ k: z.number().optional(),
100
+ r: z.number().optional(),
101
+ g: z.number().optional(),
102
+ b: z.number().optional(),
103
+ })
104
+ .optional();
105
+ export function register(server) {
106
+ server.registerTool('create_rectangle', {
107
+ title: 'Create Rectangle',
108
+ description: 'Create a rectangle',
109
+ inputSchema: {
110
+ x: z.number().describe('Top-left X coordinate'),
111
+ y: z.number().describe('Top-left Y coordinate'),
112
+ width: z.number().describe('Width'),
113
+ height: z.number().describe('Height'),
114
+ corner_radius: z.number().optional().default(0).describe('Corner radius'),
115
+ fill: colorSchema.describe('Fill color'),
116
+ stroke: z
117
+ .object({
118
+ color: colorSchema.describe('Stroke color'),
119
+ width: z.number().describe('Stroke width'),
120
+ })
121
+ .optional()
122
+ .describe('Stroke settings'),
123
+ layer_name: z.string().optional().describe('Target layer name'),
124
+ name: z.string().optional().describe('Object name'),
125
+ coordinate_system: z
126
+ .enum(['artboard-web', 'document'])
127
+ .optional()
128
+ .default('artboard-web')
129
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
130
+ },
131
+ annotations: {
132
+ readOnlyHint: false,
133
+ destructiveHint: false,
134
+ idempotentHint: false,
135
+ openWorldHint: false,
136
+ },
137
+ }, async (params) => {
138
+ const result = await executeJsx(jsxCode, params);
139
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
140
+ });
141
+ }
142
+ //# sourceMappingURL=create-rectangle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rectangle.js","sourceRoot":"","sources":["../../../src/tools/modify/create-rectangle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=create-text-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-text-frame.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/create-text-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwHpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwChD"}
@@ -0,0 +1,154 @@
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 coordSystem = params.coordinate_system || "artboard-web";
12
+
13
+ function createColor(colorObj) {
14
+ if (!colorObj || colorObj.type === "none") return new NoColor();
15
+ if (colorObj.type === "cmyk") {
16
+ var c = new CMYKColor();
17
+ c.cyan = (typeof colorObj.c === "number") ? colorObj.c : 0;
18
+ c.magenta = (typeof colorObj.m === "number") ? colorObj.m : 0;
19
+ c.yellow = (typeof colorObj.y === "number") ? colorObj.y : 0;
20
+ c.black = (typeof colorObj.k === "number") ? colorObj.k : 0;
21
+ return c;
22
+ }
23
+ if (colorObj.type === "rgb") {
24
+ var c = new RGBColor();
25
+ c.red = (typeof colorObj.r === "number") ? colorObj.r : 0;
26
+ c.green = (typeof colorObj.g === "number") ? colorObj.g : 0;
27
+ c.blue = (typeof colorObj.b === "number") ? colorObj.b : 0;
28
+ return c;
29
+ }
30
+ return new NoColor();
31
+ }
32
+
33
+ function webToAiCoords(x, y, artboardRect) {
34
+ if (artboardRect) {
35
+ return [artboardRect[0] + x, artboardRect[1] - y];
36
+ }
37
+ return [x, y];
38
+ }
39
+
40
+ var inputX = params.x;
41
+ var inputY = params.y;
42
+ var kind = params.kind || "point";
43
+
44
+ var abRect = null;
45
+ if (coordSystem === "artboard-web") {
46
+ var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()];
47
+ abRect = ab.artboardRect;
48
+ }
49
+
50
+ var aiCoords = webToAiCoords(inputX, inputY, abRect);
51
+ var aiX = aiCoords[0];
52
+ var aiY = aiCoords[1];
53
+
54
+ var targetLayer = doc.activeLayer;
55
+ if (params.layer_name) {
56
+ try {
57
+ targetLayer = doc.layers.getByName(params.layer_name);
58
+ } catch (e) {
59
+ targetLayer = doc.layers.add();
60
+ targetLayer.name = params.layer_name;
61
+ }
62
+ }
63
+
64
+ var tf;
65
+ if (kind === "area") {
66
+ var w = params.width || 100;
67
+ var h = params.height || 100;
68
+ var rectPath = targetLayer.pathItems.rectangle(aiY, aiX, w, h);
69
+ tf = targetLayer.textFrames.areaText(rectPath);
70
+ } else {
71
+ tf = targetLayer.textFrames.pointText([aiX, aiY]);
72
+ }
73
+
74
+ tf.contents = params.contents || "";
75
+
76
+ if (params.name) {
77
+ tf.name = params.name;
78
+ }
79
+
80
+ var charAttrs = tf.textRange.characterAttributes;
81
+
82
+ if (params.font_name) {
83
+ try {
84
+ charAttrs.textFont = app.textFonts.getByName(params.font_name);
85
+ } catch (e) {
86
+ // フォントが見つからない場合は無視
87
+ }
88
+ }
89
+
90
+ if (typeof params.font_size === "number") {
91
+ charAttrs.size = params.font_size;
92
+ }
93
+
94
+ if (params.fill) {
95
+ charAttrs.fillColor = createColor(params.fill);
96
+ }
97
+
98
+ var uuid = ensureUUID(tf);
99
+ writeResultFile(RESULT_PATH, { uuid: uuid });
100
+ } catch (e) {
101
+ writeResultFile(RESULT_PATH, { error: true, message: "Failed to create text frame: " + e.message, line: e.line });
102
+ }
103
+ }
104
+ `;
105
+ const colorSchema = z
106
+ .object({
107
+ type: z.enum(['cmyk', 'rgb', 'none']).describe('Color type'),
108
+ c: z.number().optional(),
109
+ m: z.number().optional(),
110
+ y: z.number().optional(),
111
+ k: z.number().optional(),
112
+ r: z.number().optional(),
113
+ g: z.number().optional(),
114
+ b: z.number().optional(),
115
+ })
116
+ .optional();
117
+ export function register(server) {
118
+ server.registerTool('create_text_frame', {
119
+ title: 'Create Text Frame',
120
+ description: 'Create a text frame',
121
+ inputSchema: {
122
+ x: z.number().describe('X coordinate'),
123
+ y: z.number().describe('Y coordinate'),
124
+ contents: z.string().describe('Text contents'),
125
+ kind: z
126
+ .enum(['point', 'area'])
127
+ .optional()
128
+ .default('point')
129
+ .describe('Text frame type (point or area)'),
130
+ width: z.number().optional().describe('Area text width'),
131
+ height: z.number().optional().describe('Area text height'),
132
+ font_name: z.string().optional().describe('Font name (PostScript name)'),
133
+ font_size: z.number().optional().describe('Font size (pt)'),
134
+ fill: colorSchema.describe('Text color'),
135
+ layer_name: z.string().optional().describe('Target layer name'),
136
+ name: z.string().optional().describe('Object name'),
137
+ coordinate_system: z
138
+ .enum(['artboard-web', 'document'])
139
+ .optional()
140
+ .default('artboard-web')
141
+ .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
142
+ },
143
+ annotations: {
144
+ readOnlyHint: false,
145
+ destructiveHint: false,
146
+ idempotentHint: false,
147
+ openWorldHint: false,
148
+ },
149
+ }, async (params) => {
150
+ const result = await executeJsx(jsxCode, params);
151
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
152
+ });
153
+ }
154
+ //# sourceMappingURL=create-text-frame.js.map