easyeda-mcp-pro 0.3.2 → 0.5.2

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 (173) hide show
  1. package/README.md +369 -52
  2. package/dist/bom-quality/adapter.d.ts +90 -0
  3. package/dist/bom-quality/adapter.js +295 -0
  4. package/dist/bom-quality/adapter.js.map +1 -0
  5. package/dist/bom-quality/index.d.ts +10 -0
  6. package/dist/bom-quality/index.js +9 -0
  7. package/dist/bom-quality/index.js.map +1 -0
  8. package/dist/bom-quality/quality.d.ts +28 -0
  9. package/dist/bom-quality/quality.js +179 -0
  10. package/dist/bom-quality/quality.js.map +1 -0
  11. package/dist/bom-quality/types.d.ts +94 -0
  12. package/dist/bom-quality/types.js +12 -0
  13. package/dist/bom-quality/types.js.map +1 -0
  14. package/dist/bridge/manager.d.ts +41 -0
  15. package/dist/bridge/manager.js +334 -47
  16. package/dist/bridge/manager.js.map +1 -1
  17. package/dist/bridge/protocol.d.ts +48 -1
  18. package/dist/bridge/protocol.js +43 -1
  19. package/dist/bridge/protocol.js.map +1 -1
  20. package/dist/bridge/types.d.ts +6 -0
  21. package/dist/bridge/types.js +6 -0
  22. package/dist/bridge/types.js.map +1 -1
  23. package/dist/catalog/errors.d.ts +49 -0
  24. package/dist/catalog/errors.js +60 -0
  25. package/dist/catalog/errors.js.map +1 -0
  26. package/dist/catalog/index.d.ts +15 -0
  27. package/dist/catalog/index.js +17 -0
  28. package/dist/catalog/index.js.map +1 -0
  29. package/dist/catalog/schema.d.ts +268 -0
  30. package/dist/catalog/schema.js +245 -0
  31. package/dist/catalog/schema.js.map +1 -0
  32. package/dist/catalog/starter.d.ts +159 -0
  33. package/dist/catalog/starter.js +579 -0
  34. package/dist/catalog/starter.js.map +1 -0
  35. package/dist/catalog/validation.d.ts +48 -0
  36. package/dist/catalog/validation.js +263 -0
  37. package/dist/catalog/validation.js.map +1 -0
  38. package/dist/circuit/circuit-ir.d.ts +460 -0
  39. package/dist/circuit/circuit-ir.js +292 -0
  40. package/dist/circuit/circuit-ir.js.map +1 -0
  41. package/dist/circuit/compiler.d.ts +55 -0
  42. package/dist/circuit/compiler.js +197 -0
  43. package/dist/circuit/compiler.js.map +1 -0
  44. package/dist/circuit/design-intent.d.ts +94 -0
  45. package/dist/circuit/design-intent.js +118 -0
  46. package/dist/circuit/design-intent.js.map +1 -0
  47. package/dist/circuit/errors.d.ts +50 -0
  48. package/dist/circuit/errors.js +61 -0
  49. package/dist/circuit/errors.js.map +1 -0
  50. package/dist/circuit/index.d.ts +17 -0
  51. package/dist/circuit/index.js +18 -0
  52. package/dist/circuit/index.js.map +1 -0
  53. package/dist/circuit/types.d.ts +186 -0
  54. package/dist/circuit/types.js +123 -0
  55. package/dist/circuit/types.js.map +1 -0
  56. package/dist/cli/auto-setup.d.ts +5 -0
  57. package/dist/cli/auto-setup.js +355 -0
  58. package/dist/cli/auto-setup.js.map +1 -0
  59. package/dist/cli/client-definitions.d.ts +34 -0
  60. package/dist/cli/client-definitions.js +194 -0
  61. package/dist/cli/client-definitions.js.map +1 -0
  62. package/dist/cli/local-setup.d.ts +5 -1
  63. package/dist/cli/local-setup.js +40 -6
  64. package/dist/cli/local-setup.js.map +1 -1
  65. package/dist/config/env.d.ts +6 -1
  66. package/dist/config/env.js +93 -5
  67. package/dist/config/env.js.map +1 -1
  68. package/dist/config/profiles.js +4 -4
  69. package/dist/config/version.d.ts +1 -1
  70. package/dist/config/version.js +1 -1
  71. package/dist/export-manifest/errors.d.ts +55 -0
  72. package/dist/export-manifest/errors.js +69 -0
  73. package/dist/export-manifest/errors.js.map +1 -0
  74. package/dist/export-manifest/index.d.ts +10 -0
  75. package/dist/export-manifest/index.js +9 -0
  76. package/dist/export-manifest/index.js.map +1 -0
  77. package/dist/export-manifest/types.d.ts +170 -0
  78. package/dist/export-manifest/types.js +36 -0
  79. package/dist/export-manifest/types.js.map +1 -0
  80. package/dist/export-manifest/validation.d.ts +39 -0
  81. package/dist/export-manifest/validation.js +298 -0
  82. package/dist/export-manifest/validation.js.map +1 -0
  83. package/dist/index.js +20 -0
  84. package/dist/index.js.map +1 -1
  85. package/dist/net-validation/errors.d.ts +89 -0
  86. package/dist/net-validation/errors.js +69 -0
  87. package/dist/net-validation/errors.js.map +1 -0
  88. package/dist/net-validation/fixtures.d.ts +38 -0
  89. package/dist/net-validation/fixtures.js +215 -0
  90. package/dist/net-validation/fixtures.js.map +1 -0
  91. package/dist/net-validation/index.d.ts +10 -0
  92. package/dist/net-validation/index.js +9 -0
  93. package/dist/net-validation/index.js.map +1 -0
  94. package/dist/net-validation/schema.d.ts +118 -0
  95. package/dist/net-validation/schema.js +140 -0
  96. package/dist/net-validation/schema.js.map +1 -0
  97. package/dist/net-validation/validation.d.ts +45 -0
  98. package/dist/net-validation/validation.js +369 -0
  99. package/dist/net-validation/validation.js.map +1 -0
  100. package/dist/pcb-constraints/errors.d.ts +39 -0
  101. package/dist/pcb-constraints/errors.js +133 -0
  102. package/dist/pcb-constraints/errors.js.map +1 -0
  103. package/dist/pcb-constraints/index.d.ts +9 -0
  104. package/dist/pcb-constraints/index.js +9 -0
  105. package/dist/pcb-constraints/index.js.map +1 -0
  106. package/dist/pcb-constraints/types.d.ts +102 -0
  107. package/dist/pcb-constraints/types.js +7 -0
  108. package/dist/pcb-constraints/types.js.map +1 -0
  109. package/dist/pcb-constraints/validation.d.ts +70 -0
  110. package/dist/pcb-constraints/validation.js +309 -0
  111. package/dist/pcb-constraints/validation.js.map +1 -0
  112. package/dist/server/factory.js +2 -0
  113. package/dist/server/factory.js.map +1 -1
  114. package/dist/server/transports/http.d.ts +20 -1
  115. package/dist/server/transports/http.js +156 -34
  116. package/dist/server/transports/http.js.map +1 -1
  117. package/dist/storage/database.d.ts +25 -0
  118. package/dist/storage/database.js +126 -51
  119. package/dist/storage/database.js.map +1 -1
  120. package/dist/tools/{L0_diagnostics.d.ts → L0_diagnostics_api.d.ts} +2 -2
  121. package/dist/tools/L0_diagnostics_api.js +152 -0
  122. package/dist/tools/L0_diagnostics_api.js.map +1 -0
  123. package/dist/tools/L0_diagnostics_core.d.ts +6 -0
  124. package/dist/tools/{L0_diagnostics.js → L0_diagnostics_core.js} +50 -124
  125. package/dist/tools/L0_diagnostics_core.js.map +1 -0
  126. package/dist/tools/L1_board.js +20 -4
  127. package/dist/tools/L1_board.js.map +1 -1
  128. package/dist/tools/{L1_bom.d.ts → L1_bom_core.d.ts} +2 -2
  129. package/dist/tools/{L1_bom.js → L1_bom_core.js} +21 -101
  130. package/dist/tools/L1_bom_core.js.map +1 -0
  131. package/dist/tools/{L1_schematic.d.ts → L1_bom_sourcing.d.ts} +2 -2
  132. package/dist/tools/L1_bom_sourcing.js +265 -0
  133. package/dist/tools/L1_bom_sourcing.js.map +1 -0
  134. package/dist/tools/L1_drc_erc.js +15 -3
  135. package/dist/tools/L1_drc_erc.js.map +1 -1
  136. package/dist/tools/L1_export.js +20 -4
  137. package/dist/tools/L1_export.js.map +1 -1
  138. package/dist/tools/L1_pcb_constraints.d.ts +6 -0
  139. package/dist/tools/L1_pcb_constraints.js +234 -0
  140. package/dist/tools/L1_pcb_constraints.js.map +1 -0
  141. package/dist/tools/L1_pcb_write.js +26 -12
  142. package/dist/tools/L1_pcb_write.js.map +1 -1
  143. package/dist/tools/L1_schematic_read.d.ts +6 -0
  144. package/dist/tools/{L1_schematic.js → L1_schematic_read.js} +125 -190
  145. package/dist/tools/L1_schematic_read.js.map +1 -0
  146. package/dist/tools/L1_schematic_write.d.ts +6 -0
  147. package/dist/tools/L1_schematic_write.js +516 -0
  148. package/dist/tools/L1_schematic_write.js.map +1 -0
  149. package/dist/tools/register.js +15 -7
  150. package/dist/tools/register.js.map +1 -1
  151. package/dist/tools/registry.d.ts +41 -7
  152. package/dist/tools/registry.js +111 -12
  153. package/dist/tools/registry.js.map +1 -1
  154. package/dist/tools/types.d.ts +16 -0
  155. package/dist/utils/logger.d.ts +1 -1
  156. package/dist/utils/logger.js +1 -1
  157. package/dist/utils/logger.js.map +1 -1
  158. package/dist/vendors/base-http-client.d.ts +48 -0
  159. package/dist/vendors/base-http-client.js +75 -0
  160. package/dist/vendors/base-http-client.js.map +1 -0
  161. package/dist/vendors/digikey/client.js +10 -19
  162. package/dist/vendors/digikey/client.js.map +1 -1
  163. package/dist/vendors/jlcpcb/client.js +41 -70
  164. package/dist/vendors/jlcpcb/client.js.map +1 -1
  165. package/dist/vendors/lcsc/client.js +5 -18
  166. package/dist/vendors/lcsc/client.js.map +1 -1
  167. package/dist/vendors/mouser/client.js +4 -12
  168. package/dist/vendors/mouser/client.js.map +1 -1
  169. package/easyeda-bridge-extension.eext +0 -0
  170. package/package.json +41 -26
  171. package/dist/tools/L0_diagnostics.js.map +0 -1
  172. package/dist/tools/L1_bom.js.map +0 -1
  173. package/dist/tools/L1_schematic.js.map +0 -1
@@ -0,0 +1,516 @@
1
+ import { z } from 'zod';
2
+ const deviceItemSchema = z
3
+ .object({
4
+ libraryUuid: z.string(),
5
+ uuid: z.string(),
6
+ })
7
+ .passthrough();
8
+ const placeComponentInputSchema = z.object({
9
+ deviceItem: deviceItemSchema,
10
+ x: z.number(),
11
+ y: z.number(),
12
+ subPartName: z.string().optional(),
13
+ rotation: z.number().optional(),
14
+ mirror: z.boolean().optional(),
15
+ addIntoBom: z.boolean().optional(),
16
+ addIntoPcb: z.boolean().optional(),
17
+ confirmWrite: z.literal(true),
18
+ });
19
+ const addWireInputSchema = z.object({
20
+ points: z.array(z.object({
21
+ x: z.number(),
22
+ y: z.number(),
23
+ })),
24
+ netName: z.string().optional(),
25
+ color: z.string().optional(),
26
+ lineWidth: z.number().optional(),
27
+ lineType: z.string().optional(),
28
+ confirmWrite: z.literal(true),
29
+ });
30
+ const deletePrimitiveInputSchema = z.object({
31
+ primitiveIds: z.array(z.string()),
32
+ confirmWrite: z.literal(true),
33
+ });
34
+ const modifyPrimitiveInputSchema = z.object({
35
+ primitiveId: z.string(),
36
+ property: z.record(z.string(), z.unknown()),
37
+ confirmWrite: z.literal(true),
38
+ });
39
+ function registerSchematicWriteTools(registry, _config) {
40
+ registry.register({
41
+ name: 'easyeda_schematic_place_component',
42
+ title: 'Place schematic component',
43
+ description: 'Place a library component/device on the active schematic sheet.',
44
+ profile: 'core',
45
+ evidence: ['official-docs'],
46
+ risk: 'medium',
47
+ confirmWrite: true,
48
+ group: 'schematic',
49
+ version: '1.0.0',
50
+ annotations: {
51
+ readOnlyHint: false,
52
+ idempotentHint: false,
53
+ },
54
+ inputSchema: placeComponentInputSchema,
55
+ outputSchema: z.object({
56
+ success: z.boolean(),
57
+ component: z.unknown().optional(),
58
+ error: z.string().optional(),
59
+ }),
60
+ handler: async (ctx, params) => {
61
+ const p = placeComponentInputSchema.parse(params);
62
+ try {
63
+ const result = await ctx.bridge.call('schematic.placeComponent', {
64
+ deviceItem: p.deviceItem,
65
+ x: p.x,
66
+ y: p.y,
67
+ subPartName: p.subPartName,
68
+ rotation: p.rotation,
69
+ mirror: p.mirror,
70
+ addIntoBom: p.addIntoBom,
71
+ addIntoPcb: p.addIntoPcb,
72
+ });
73
+ return {
74
+ success: true,
75
+ component: result,
76
+ };
77
+ }
78
+ catch (err) {
79
+ return {
80
+ success: false,
81
+ error: err instanceof Error ? err.message : String(err),
82
+ };
83
+ }
84
+ },
85
+ });
86
+ registry.register({
87
+ name: 'easyeda_schematic_add_wire',
88
+ title: 'Add schematic wire',
89
+ description: 'Add a wire segment connecting schematic coordinates/pins.',
90
+ profile: 'core',
91
+ evidence: ['official-docs'],
92
+ risk: 'medium',
93
+ confirmWrite: true,
94
+ group: 'schematic',
95
+ version: '1.0.0',
96
+ annotations: {
97
+ readOnlyHint: false,
98
+ idempotentHint: false,
99
+ },
100
+ inputSchema: addWireInputSchema,
101
+ outputSchema: z.object({
102
+ success: z.boolean(),
103
+ wire: z.unknown().optional(),
104
+ error: z.string().optional(),
105
+ }),
106
+ handler: async (ctx, params) => {
107
+ const p = addWireInputSchema.parse(params);
108
+ try {
109
+ const result = await ctx.bridge.call('schematic.addWire', {
110
+ points: p.points,
111
+ netName: p.netName,
112
+ color: p.color,
113
+ lineWidth: p.lineWidth,
114
+ lineType: p.lineType,
115
+ });
116
+ return {
117
+ success: true,
118
+ wire: result,
119
+ };
120
+ }
121
+ catch (err) {
122
+ return {
123
+ success: false,
124
+ error: err instanceof Error ? err.message : String(err),
125
+ };
126
+ }
127
+ },
128
+ });
129
+ registry.register({
130
+ name: 'easyeda_schematic_delete_primitive',
131
+ title: 'Delete schematic primitives',
132
+ description: 'Delete components, wires, or other drawing objects from the schematic by their primitive UUIDs.',
133
+ profile: 'core',
134
+ evidence: ['official-docs'],
135
+ risk: 'medium',
136
+ confirmWrite: true,
137
+ group: 'schematic',
138
+ version: '1.0.0',
139
+ annotations: {
140
+ readOnlyHint: false,
141
+ idempotentHint: false,
142
+ },
143
+ inputSchema: deletePrimitiveInputSchema,
144
+ outputSchema: z.object({
145
+ success: z.boolean(),
146
+ error: z.string().optional(),
147
+ }),
148
+ handler: async (ctx, params) => {
149
+ const { primitiveIds } = deletePrimitiveInputSchema.parse(params);
150
+ try {
151
+ await ctx.bridge.call('schematic.deletePrimitive', { primitiveIds });
152
+ return {
153
+ success: true,
154
+ };
155
+ }
156
+ catch (err) {
157
+ return {
158
+ success: false,
159
+ error: err instanceof Error ? err.message : String(err),
160
+ };
161
+ }
162
+ },
163
+ });
164
+ registry.register({
165
+ name: 'easyeda_schematic_modify_primitive',
166
+ title: 'Modify schematic primitive',
167
+ description: 'Modify properties (value, reference, attributes, etc.) of a schematic component/object.',
168
+ profile: 'core',
169
+ evidence: ['official-docs'],
170
+ risk: 'medium',
171
+ confirmWrite: true,
172
+ group: 'schematic',
173
+ version: '1.0.0',
174
+ annotations: {
175
+ readOnlyHint: false,
176
+ idempotentHint: false,
177
+ },
178
+ inputSchema: modifyPrimitiveInputSchema,
179
+ outputSchema: z.object({
180
+ success: z.boolean(),
181
+ result: z.unknown().optional(),
182
+ error: z.string().optional(),
183
+ }),
184
+ handler: async (ctx, params) => {
185
+ const { primitiveId, property } = modifyPrimitiveInputSchema.parse(params);
186
+ try {
187
+ const result = await ctx.bridge.call('schematic.modifyPrimitive', {
188
+ primitiveId,
189
+ property,
190
+ });
191
+ return {
192
+ success: true,
193
+ result,
194
+ };
195
+ }
196
+ catch (err) {
197
+ return {
198
+ success: false,
199
+ error: err instanceof Error ? err.message : String(err),
200
+ };
201
+ }
202
+ },
203
+ });
204
+ registry.register({
205
+ name: 'easyeda_schematic_create_net_flag',
206
+ title: 'Create net flag',
207
+ description: 'Place a net flag (net label) on the schematic canvas at specified coordinates. ' +
208
+ 'A net flag declares a named net on a wire segment, creating real SCH_Net connectivity ' +
209
+ 'in the EasyEDA Pro netlist. Unlike easyeda_schematic_add_wire (which creates graphical wires ' +
210
+ 'that may not appear in SCH_Net/SCH_Netlist), this tool actually populates the netlist.',
211
+ profile: 'core',
212
+ evidence: ['inferred'],
213
+ risk: 'medium',
214
+ confirmWrite: true,
215
+ group: 'schematic',
216
+ version: '1.0.0',
217
+ annotations: {
218
+ readOnlyHint: false,
219
+ idempotentHint: false,
220
+ },
221
+ inputSchema: z.object({
222
+ projectId: z.string().describe('The project/schematic ID'),
223
+ netName: z.string().min(1).describe('The net name to assign (e.g. VCC, GND, TEST_NET)'),
224
+ x: z.number().describe('X coordinate on the schematic canvas'),
225
+ y: z.number().describe('Y coordinate on the schematic canvas'),
226
+ rotation: z.number().optional().describe('Rotation in degrees (0, 90, 180, 270)'),
227
+ confirmWrite: z.literal(true),
228
+ }),
229
+ outputSchema: z.object({
230
+ success: z.boolean(),
231
+ netFlag: z
232
+ .object({
233
+ primitiveId: z.string(),
234
+ netName: z.string(),
235
+ })
236
+ .optional(),
237
+ error: z.string().optional(),
238
+ }),
239
+ handler: async (ctx, params) => {
240
+ const p = params;
241
+ try {
242
+ const result = await ctx.bridge.call('schematic.createNetFlag', {
243
+ projectId: p.projectId,
244
+ netName: p.netName,
245
+ x: p.x,
246
+ y: p.y,
247
+ rotation: p.rotation,
248
+ });
249
+ const data = result;
250
+ return {
251
+ success: true,
252
+ netFlag: {
253
+ primitiveId: data.primitiveId ?? '',
254
+ netName: data.netName ?? p.netName,
255
+ },
256
+ };
257
+ }
258
+ catch (err) {
259
+ return {
260
+ success: false,
261
+ error: err instanceof Error ? err.message : String(err),
262
+ };
263
+ }
264
+ },
265
+ });
266
+ registry.register({
267
+ name: 'easyeda_schematic_create_net_port',
268
+ title: 'Create net port',
269
+ description: 'Place a hierarchical net port (off-sheet connector) on the schematic. ' +
270
+ 'Net ports create named connections that span multiple schematic sheets, ' +
271
+ 'appearing as real SCH_Net entries in the netlist.',
272
+ profile: 'core',
273
+ evidence: ['inferred'],
274
+ risk: 'medium',
275
+ confirmWrite: true,
276
+ group: 'schematic',
277
+ version: '1.0.0',
278
+ annotations: {
279
+ readOnlyHint: false,
280
+ idempotentHint: false,
281
+ },
282
+ inputSchema: z.object({
283
+ projectId: z.string().describe('The project/schematic ID'),
284
+ netName: z.string().min(1).describe('The net name for the port (e.g. VCC, GND, DATA_BUS)'),
285
+ x: z.number().describe('X coordinate on the schematic canvas'),
286
+ y: z.number().describe('Y coordinate on the schematic canvas'),
287
+ portType: z
288
+ .enum(['input', 'output', 'bidirectional', 'triState', 'passive'])
289
+ .optional()
290
+ .describe('Electrical type of the port'),
291
+ rotation: z.number().optional().describe('Rotation in degrees (0, 90, 180, 270)'),
292
+ confirmWrite: z.literal(true),
293
+ }),
294
+ outputSchema: z.object({
295
+ success: z.boolean(),
296
+ netPort: z
297
+ .object({
298
+ primitiveId: z.string(),
299
+ netName: z.string(),
300
+ })
301
+ .optional(),
302
+ error: z.string().optional(),
303
+ }),
304
+ handler: async (ctx, params) => {
305
+ const p = params;
306
+ try {
307
+ const result = await ctx.bridge.call('schematic.createNetPort', {
308
+ projectId: p.projectId,
309
+ netName: p.netName,
310
+ x: p.x,
311
+ y: p.y,
312
+ portType: p.portType,
313
+ rotation: p.rotation,
314
+ });
315
+ const data = result;
316
+ return {
317
+ success: true,
318
+ netPort: {
319
+ primitiveId: data.primitiveId ?? '',
320
+ netName: data.netName ?? p.netName,
321
+ },
322
+ };
323
+ }
324
+ catch (err) {
325
+ return {
326
+ success: false,
327
+ error: err instanceof Error ? err.message : String(err),
328
+ };
329
+ }
330
+ },
331
+ });
332
+ registry.register({
333
+ name: 'easyeda_schematic_connect_pin_to_net',
334
+ title: 'Connect pin to net',
335
+ description: 'Connect a specific component pin to a named net. This creates an actual SCH_Netlist entry ' +
336
+ 'associating the pin with the net. If the net does not exist yet, it is created on the fly. ' +
337
+ 'This is the core tool for populating the real EasyEDA netlist with pin-to-net connectivity.',
338
+ profile: 'core',
339
+ evidence: ['inferred'],
340
+ risk: 'medium',
341
+ confirmWrite: true,
342
+ group: 'schematic',
343
+ version: '1.0.0',
344
+ annotations: {
345
+ readOnlyHint: false,
346
+ idempotentHint: false,
347
+ },
348
+ inputSchema: z.object({
349
+ projectId: z.string().describe('The project/schematic ID'),
350
+ primitiveId: z.string().describe('The primitive ID of the component'),
351
+ pinNumber: z
352
+ .string()
353
+ .describe('The pin number or pin name on the component (e.g. "1", "VCC", "GND")'),
354
+ netName: z
355
+ .string()
356
+ .min(1)
357
+ .describe('The net name to connect the pin to (e.g. VCC, GND, DATA0)'),
358
+ confirmWrite: z.literal(true),
359
+ }),
360
+ outputSchema: z.object({
361
+ success: z.boolean(),
362
+ connection: z
363
+ .object({
364
+ primitiveId: z.string(),
365
+ pinNumber: z.string(),
366
+ netName: z.string(),
367
+ })
368
+ .optional(),
369
+ error: z.string().optional(),
370
+ }),
371
+ handler: async (ctx, params) => {
372
+ const p = params;
373
+ try {
374
+ const result = await ctx.bridge.call('schematic.connectPinToNet', {
375
+ projectId: p.projectId,
376
+ primitiveId: p.primitiveId,
377
+ pinNumber: p.pinNumber,
378
+ netName: p.netName,
379
+ });
380
+ const data = result;
381
+ return {
382
+ success: data?.connected !== false,
383
+ connection: {
384
+ primitiveId: p.primitiveId,
385
+ pinNumber: p.pinNumber,
386
+ netName: p.netName,
387
+ },
388
+ };
389
+ }
390
+ catch (err) {
391
+ return {
392
+ success: false,
393
+ error: err instanceof Error ? err.message : String(err),
394
+ };
395
+ }
396
+ },
397
+ });
398
+ registry.register({
399
+ name: 'easyeda_schematic_connect_pins_by_net',
400
+ title: 'Connect pins by net',
401
+ description: 'Connect multiple component pins to a named net in a single operation. ' +
402
+ 'All specified pins will be assigned to the same net, creating SCH_Netlist entries. ' +
403
+ 'If the net does not exist, it is created. This is the bulk equivalent of connect_pin_to_net.',
404
+ profile: 'core',
405
+ evidence: ['inferred'],
406
+ risk: 'medium',
407
+ confirmWrite: true,
408
+ group: 'schematic',
409
+ version: '1.0.0',
410
+ annotations: {
411
+ readOnlyHint: false,
412
+ idempotentHint: false,
413
+ },
414
+ inputSchema: z.object({
415
+ projectId: z.string().describe('The project/schematic ID'),
416
+ netName: z.string().min(1).describe('The net name to assign pins to'),
417
+ pins: z
418
+ .array(z.object({
419
+ primitiveId: z.string().describe('The primitive ID of the component'),
420
+ pinNumber: z.string().describe('The pin number or name'),
421
+ }))
422
+ .min(1)
423
+ .max(500)
424
+ .describe('List of component pins to connect to the net'),
425
+ confirmWrite: z.literal(true),
426
+ }),
427
+ outputSchema: z.object({
428
+ success: z.boolean(),
429
+ connections: z
430
+ .array(z.object({
431
+ primitiveId: z.string(),
432
+ pinNumber: z.string(),
433
+ netName: z.string(),
434
+ }))
435
+ .optional(),
436
+ count: z.number().int().nonnegative(),
437
+ error: z.string().optional(),
438
+ }),
439
+ handler: async (ctx, params) => {
440
+ const p = params;
441
+ try {
442
+ const result = await ctx.bridge.call('schematic.connectPinsByNet', {
443
+ projectId: p.projectId,
444
+ netName: p.netName,
445
+ pins: p.pins,
446
+ });
447
+ const data = result;
448
+ const count = data?.count ?? p.pins.length;
449
+ return {
450
+ success: true,
451
+ connections: p.pins.map((pin) => ({
452
+ primitiveId: pin.primitiveId,
453
+ pinNumber: pin.pinNumber,
454
+ netName: p.netName,
455
+ })),
456
+ count,
457
+ };
458
+ }
459
+ catch (err) {
460
+ return {
461
+ success: false,
462
+ count: 0,
463
+ error: err instanceof Error ? err.message : String(err),
464
+ };
465
+ }
466
+ },
467
+ });
468
+ registry.register({
469
+ name: 'easyeda_project_save',
470
+ title: 'Save project',
471
+ description: 'Explicitly save the current EasyEDA Pro project. This ensures all netlist changes, ' +
472
+ 'net flags, pin connections, and other mutations are persisted to the project file. ' +
473
+ 'Save is never implicit — the caller must explicitly request it. Requires confirmWrite.',
474
+ profile: 'core',
475
+ evidence: ['inferred'],
476
+ risk: 'medium',
477
+ confirmWrite: true,
478
+ group: 'schematic',
479
+ version: '1.0.0',
480
+ annotations: {
481
+ readOnlyHint: false,
482
+ idempotentHint: false,
483
+ },
484
+ inputSchema: z.object({
485
+ projectId: z.string().describe('The project/schematic ID to save'),
486
+ confirmWrite: z.literal(true),
487
+ }),
488
+ outputSchema: z.object({
489
+ success: z.boolean(),
490
+ project_id: z.string(),
491
+ saved_at: z.string().optional(),
492
+ error: z.string().optional(),
493
+ }),
494
+ handler: async (ctx, params) => {
495
+ const { projectId } = params;
496
+ try {
497
+ const result = await ctx.bridge.call('project.save', { projectId });
498
+ const data = result;
499
+ return {
500
+ success: true,
501
+ project_id: projectId,
502
+ saved_at: data.savedAt ?? new Date().toISOString(),
503
+ };
504
+ }
505
+ catch (err) {
506
+ return {
507
+ success: false,
508
+ project_id: projectId,
509
+ error: err instanceof Error ? err.message : String(err),
510
+ };
511
+ }
512
+ },
513
+ });
514
+ }
515
+ export { registerSchematicWriteTools };
516
+ //# sourceMappingURL=L1_schematic_write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L1_schematic_write.js","sourceRoot":"","sources":["../../src/tools/L1_schematic_write.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,25 @@
1
1
  import { registerBoardTools } from './L1_board.js';
2
- import { registerBomTools } from './L1_bom.js';
3
- import { registerDiagnostics } from './L0_diagnostics.js';
2
+ import { registerBomCoreTools } from './L1_bom_core.js';
3
+ import { registerBomSourcingTools } from './L1_bom_sourcing.js';
4
+ import { registerDiagnosticsCore } from './L0_diagnostics_core.js';
5
+ import { registerDiagnosticsApi } from './L0_diagnostics_api.js';
4
6
  import { registerDrcErcTools } from './L1_drc_erc.js';
5
7
  import { registerExportTools } from './L1_export.js';
6
- import { registerSchematicTools } from './L1_schematic.js';
8
+ import { registerPcbConstraintTools } from './L1_pcb_constraints.js';
7
9
  import { registerPcbWriteTools } from './L1_pcb_write.js';
10
+ import { registerSchematicReadTools } from './L1_schematic_read.js';
11
+ import { registerSchematicWriteTools } from './L1_schematic_write.js';
8
12
  export function registerBuiltinTools(registry, config) {
9
- registerDiagnostics(registry, config);
10
- registerSchematicTools(registry, config);
11
- registerBomTools(registry, config);
13
+ registerDiagnosticsCore(registry, config);
14
+ registerDiagnosticsApi(registry, config);
15
+ registerSchematicReadTools(registry, config);
16
+ registerSchematicWriteTools(registry, config);
17
+ registerBomCoreTools(registry, config);
18
+ registerBomSourcingTools(registry, config);
12
19
  registerDrcErcTools(registry, config);
13
20
  registerBoardTools(registry, config);
14
- registerExportTools(registry, config);
21
+ registerPcbConstraintTools(registry, config);
15
22
  registerPcbWriteTools(registry, config);
23
+ registerExportTools(registry, config);
16
24
  }
17
25
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,UAAU,oBAAoB,CAAC,QAAsB,EAAE,MAAiB;IAC5E,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAGtE,MAAM,UAAU,oBAAoB,CAAC,QAAsB,EAAE,MAAiB;IAC5E,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -2,6 +2,32 @@ import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { type ToolDefinition, type ToolContext } from './types.js';
3
3
  import { type ToolProfile } from '../config/profiles.js';
4
4
  import { type z } from 'zod';
5
+ export declare const ErrorCodes: {
6
+ readonly CONFIRM_WRITE_REQUIRED: "ERR_CONFIRM_WRITE_REQUIRED";
7
+ readonly BRIDGE_DISCONNECTED: "ERR_BRIDGE_DISCONNECTED";
8
+ readonly TOOL_EXECUTION: "ERR_TOOL_EXECUTION";
9
+ readonly TOOL_NOT_FOUND: "ERR_TOOL_NOT_FOUND";
10
+ readonly INVALID_INPUT: "ERR_INVALID_INPUT";
11
+ };
12
+ export type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
13
+ export interface StructuredError {
14
+ errorCode: ErrorCode;
15
+ message: string;
16
+ /** Optional structured details for the client */
17
+ details?: Record<string, unknown>;
18
+ }
19
+ export interface ToolMetadata {
20
+ name: string;
21
+ title: string;
22
+ description: string;
23
+ profile: ToolProfile;
24
+ risk: 'low' | 'medium' | 'high';
25
+ confirmWrite: boolean;
26
+ group: string;
27
+ version: string;
28
+ evidence: ToolDefinition['evidence'];
29
+ annotations: ToolDefinition['annotations'];
30
+ }
5
31
  export declare class ToolRegistry {
6
32
  private tools;
7
33
  private currentProfile;
@@ -10,12 +36,20 @@ export declare class ToolRegistry {
10
36
  get(name: string): ToolDefinition | undefined;
11
37
  getEnabledTools(): ToolDefinition[];
12
38
  getAllTools(): ToolDefinition[];
39
+ /** Register all enabled tools onto an MCP server.
40
+ * Each handler is wrapped with:
41
+ * - confirmWrite gate (rejects calls that omit the required acknowledgment)
42
+ * - structured error codes
43
+ * - bridge‑disconnected friendly error interception
44
+ */
13
45
  registerAllOnServer(server: McpServer, context: ToolContext): void;
14
- getToolDefinitions(): {
15
- name: string;
16
- description: string;
17
- inputSchema: {
18
- type: "object";
19
- };
20
- }[];
46
+ /** Return rich metadata for every enabled tool. */
47
+ getToolDefinitions(): ToolMetadata[];
48
+ /** Return a summary snapshot for diagnostics / health‑check endpoints. */
49
+ getSummary(): {
50
+ total: number;
51
+ enabled: number;
52
+ profile: ToolProfile;
53
+ serverVersion: string;
54
+ };
21
55
  }