easyeda-mcp-pro 0.2.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 (92) hide show
  1. package/README.md +304 -0
  2. package/dist/bridge/client.d.ts +16 -0
  3. package/dist/bridge/client.js +48 -0
  4. package/dist/bridge/client.js.map +1 -0
  5. package/dist/bridge/extension.d.ts +26 -0
  6. package/dist/bridge/extension.js +556 -0
  7. package/dist/bridge/extension.js.map +1 -0
  8. package/dist/bridge/manager.d.ts +37 -0
  9. package/dist/bridge/manager.js +225 -0
  10. package/dist/bridge/manager.js.map +1 -0
  11. package/dist/bridge/protocol.d.ts +68 -0
  12. package/dist/bridge/protocol.js +56 -0
  13. package/dist/bridge/protocol.js.map +1 -0
  14. package/dist/bridge/types.d.ts +52 -0
  15. package/dist/bridge/types.js +19 -0
  16. package/dist/bridge/types.js.map +1 -0
  17. package/dist/config/env.d.ts +98 -0
  18. package/dist/config/env.js +103 -0
  19. package/dist/config/env.js.map +1 -0
  20. package/dist/config/feature-flags.d.ts +16 -0
  21. package/dist/config/feature-flags.js +17 -0
  22. package/dist/config/feature-flags.js.map +1 -0
  23. package/dist/config/profiles.d.ts +10 -0
  24. package/dist/config/profiles.js +45 -0
  25. package/dist/config/profiles.js.map +1 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +76 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/schemas/common.d.ts +123 -0
  30. package/dist/schemas/common.js +79 -0
  31. package/dist/schemas/common.js.map +1 -0
  32. package/dist/server/errors.d.ts +3 -0
  33. package/dist/server/errors.js +59 -0
  34. package/dist/server/errors.js.map +1 -0
  35. package/dist/server/factory.d.ts +17 -0
  36. package/dist/server/factory.js +60 -0
  37. package/dist/server/factory.js.map +1 -0
  38. package/dist/server/transports/http.d.ts +10 -0
  39. package/dist/server/transports/http.js +54 -0
  40. package/dist/server/transports/http.js.map +1 -0
  41. package/dist/storage/database.d.ts +19 -0
  42. package/dist/storage/database.js +136 -0
  43. package/dist/storage/database.js.map +1 -0
  44. package/dist/storage/index.d.ts +2 -0
  45. package/dist/storage/index.js +2 -0
  46. package/dist/storage/index.js.map +1 -0
  47. package/dist/storage/types.d.ts +26 -0
  48. package/dist/storage/types.js +9 -0
  49. package/dist/storage/types.js.map +1 -0
  50. package/dist/tools/L0_diagnostics.d.ts +6 -0
  51. package/dist/tools/L0_diagnostics.js +297 -0
  52. package/dist/tools/L0_diagnostics.js.map +1 -0
  53. package/dist/tools/L1_board.d.ts +6 -0
  54. package/dist/tools/L1_board.js +182 -0
  55. package/dist/tools/L1_board.js.map +1 -0
  56. package/dist/tools/L1_bom.d.ts +6 -0
  57. package/dist/tools/L1_bom.js +267 -0
  58. package/dist/tools/L1_bom.js.map +1 -0
  59. package/dist/tools/L1_drc_erc.d.ts +6 -0
  60. package/dist/tools/L1_drc_erc.js +235 -0
  61. package/dist/tools/L1_drc_erc.js.map +1 -0
  62. package/dist/tools/L1_export.d.ts +6 -0
  63. package/dist/tools/L1_export.js +214 -0
  64. package/dist/tools/L1_export.js.map +1 -0
  65. package/dist/tools/L1_schematic.d.ts +6 -0
  66. package/dist/tools/L1_schematic.js +182 -0
  67. package/dist/tools/L1_schematic.js.map +1 -0
  68. package/dist/tools/registry.d.ts +21 -0
  69. package/dist/tools/registry.js +55 -0
  70. package/dist/tools/registry.js.map +1 -0
  71. package/dist/tools/types.d.ts +53 -0
  72. package/dist/tools/types.js +2 -0
  73. package/dist/tools/types.js.map +1 -0
  74. package/dist/utils/logger.d.ts +4 -0
  75. package/dist/utils/logger.js +54 -0
  76. package/dist/utils/logger.js.map +1 -0
  77. package/dist/utils/redaction.d.ts +2 -0
  78. package/dist/utils/redaction.js +56 -0
  79. package/dist/utils/redaction.js.map +1 -0
  80. package/dist/vendors/digikey/client.d.ts +49 -0
  81. package/dist/vendors/digikey/client.js +200 -0
  82. package/dist/vendors/digikey/client.js.map +1 -0
  83. package/dist/vendors/jlcpcb/client.d.ts +79 -0
  84. package/dist/vendors/jlcpcb/client.js +156 -0
  85. package/dist/vendors/jlcpcb/client.js.map +1 -0
  86. package/dist/vendors/lcsc/client.d.ts +57 -0
  87. package/dist/vendors/lcsc/client.js +140 -0
  88. package/dist/vendors/lcsc/client.js.map +1 -0
  89. package/dist/vendors/mouser/client.d.ts +46 -0
  90. package/dist/vendors/mouser/client.js +141 -0
  91. package/dist/vendors/mouser/client.js.map +1 -0
  92. package/package.json +74 -0
@@ -0,0 +1,235 @@
1
+ import { z } from 'zod';
2
+ function registerDrcErcTools(registry, _config) {
3
+ registry.register({
4
+ name: 'easyeda_drc_run',
5
+ title: 'Run design rule check',
6
+ description: 'Run design rule check (DRC) on the project to identify rule violations, clearance issues, and manufacturing constraints.',
7
+ profile: 'core',
8
+ evidence: ['official-docs'],
9
+ risk: 'medium',
10
+ annotations: {
11
+ readOnlyHint: false,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ },
15
+ inputSchema: z.object({
16
+ projectId: z.string(),
17
+ rules: z.array(z.string()).optional(),
18
+ }),
19
+ outputSchema: z.object({
20
+ project_id: z.string(),
21
+ violations: z.array(z.object({
22
+ rule: z.string(),
23
+ description: z.string(),
24
+ location: z
25
+ .object({
26
+ x: z.number(),
27
+ y: z.number(),
28
+ layer: z.string().optional(),
29
+ })
30
+ .optional(),
31
+ severity: z.enum(['error', 'warning', 'info']),
32
+ net: z.string().optional(),
33
+ component: z.string().optional(),
34
+ })),
35
+ total_violations: z.number().int().nonnegative(),
36
+ error_count: z.number().int().nonnegative(),
37
+ warning_count: z.number().int().nonnegative(),
38
+ passed: z.boolean(),
39
+ not_available: z.boolean().optional(),
40
+ }),
41
+ handler: async (ctx, params) => {
42
+ const { projectId, rules } = params;
43
+ try {
44
+ const result = await ctx.bridge.call('design.drc', { projectId, rules });
45
+ const data = result;
46
+ const violations = (data.violations ?? []).map((v) => ({
47
+ rule: v.rule ?? '',
48
+ description: v.description ?? '',
49
+ location: v.location
50
+ ? {
51
+ x: v.location.x ?? 0,
52
+ y: v.location.y ?? 0,
53
+ layer: v.location.layer,
54
+ }
55
+ : undefined,
56
+ severity: (v.severity === 'error' || v.severity === 'warning' || v.severity === 'info'
57
+ ? v.severity
58
+ : 'info'),
59
+ net: v.net,
60
+ component: v.component,
61
+ }));
62
+ return {
63
+ project_id: projectId,
64
+ violations,
65
+ total_violations: data.totalViolations ?? violations.length,
66
+ error_count: data.errorCount ?? violations.filter((v) => v.severity === 'error').length,
67
+ warning_count: data.warningCount ?? violations.filter((v) => v.severity === 'warning').length,
68
+ passed: (data.errorCount ?? 0) === 0,
69
+ };
70
+ }
71
+ catch {
72
+ return {
73
+ project_id: projectId,
74
+ violations: [],
75
+ total_violations: 0,
76
+ error_count: 0,
77
+ warning_count: 0,
78
+ passed: false,
79
+ not_available: true,
80
+ };
81
+ }
82
+ },
83
+ });
84
+ registry.register({
85
+ name: 'easyeda_erc_run',
86
+ title: 'Run electrical rule check',
87
+ description: 'Run electrical rule check (ERC) on the schematic to detect unconnected nets, short circuits, and electrical conflicts.',
88
+ profile: 'core',
89
+ evidence: ['official-docs'],
90
+ risk: 'medium',
91
+ annotations: {
92
+ readOnlyHint: false,
93
+ destructiveHint: false,
94
+ idempotentHint: true,
95
+ },
96
+ inputSchema: z.object({
97
+ projectId: z.string(),
98
+ checks: z.array(z.string()).optional(),
99
+ }),
100
+ outputSchema: z.object({
101
+ project_id: z.string(),
102
+ violations: z.array(z.object({
103
+ net: z.string().optional(),
104
+ component: z.string().optional(),
105
+ description: z.string(),
106
+ severity: z.enum(['error', 'warning', 'info']),
107
+ location: z
108
+ .object({
109
+ x: z.number(),
110
+ y: z.number(),
111
+ })
112
+ .optional(),
113
+ })),
114
+ total_violations: z.number().int().nonnegative(),
115
+ error_count: z.number().int().nonnegative(),
116
+ warning_count: z.number().int().nonnegative(),
117
+ passed: z.boolean(),
118
+ not_available: z.boolean().optional(),
119
+ }),
120
+ handler: async (ctx, params) => {
121
+ const { projectId, checks } = params;
122
+ try {
123
+ const result = await ctx.bridge.call('design.erc', { projectId, checks });
124
+ const data = result;
125
+ const violations = (data.violations ?? []).map((v) => ({
126
+ net: v.net,
127
+ component: v.component,
128
+ description: v.description ?? '',
129
+ severity: (v.severity === 'error' || v.severity === 'warning' || v.severity === 'info'
130
+ ? v.severity
131
+ : 'info'),
132
+ location: v.location
133
+ ? {
134
+ x: v.location.x ?? 0,
135
+ y: v.location.y ?? 0,
136
+ }
137
+ : undefined,
138
+ }));
139
+ return {
140
+ project_id: projectId,
141
+ violations,
142
+ total_violations: data.totalViolations ?? violations.length,
143
+ error_count: data.errorCount ?? violations.filter((v) => v.severity === 'error').length,
144
+ warning_count: data.warningCount ?? violations.filter((v) => v.severity === 'warning').length,
145
+ passed: (data.errorCount ?? 0) === 0,
146
+ };
147
+ }
148
+ catch {
149
+ return {
150
+ project_id: projectId,
151
+ violations: [],
152
+ total_violations: 0,
153
+ error_count: 0,
154
+ warning_count: 0,
155
+ passed: false,
156
+ not_available: true,
157
+ };
158
+ }
159
+ },
160
+ });
161
+ registry.register({
162
+ name: 'easyeda_rule_check_summary',
163
+ title: 'Get rule check summary',
164
+ description: 'Get a summary of all design and electrical rule check results for the project.',
165
+ profile: 'core',
166
+ evidence: ['official-docs'],
167
+ risk: 'low',
168
+ annotations: {
169
+ readOnlyHint: true,
170
+ idempotentHint: true,
171
+ },
172
+ inputSchema: z.object({
173
+ projectId: z.string(),
174
+ }),
175
+ outputSchema: z.object({
176
+ project_id: z.string(),
177
+ drc: z.object({
178
+ total: z.number().int().nonnegative(),
179
+ errors: z.number().int().nonnegative(),
180
+ warnings: z.number().int().nonnegative(),
181
+ passed: z.boolean(),
182
+ }),
183
+ erc: z.object({
184
+ total: z.number().int().nonnegative(),
185
+ errors: z.number().int().nonnegative(),
186
+ warnings: z.number().int().nonnegative(),
187
+ passed: z.boolean(),
188
+ }),
189
+ overall_passed: z.boolean(),
190
+ not_available: z.boolean().optional(),
191
+ }),
192
+ handler: async (ctx, params) => {
193
+ const { projectId } = params;
194
+ try {
195
+ const [drcResult, ercResult] = await Promise.all([
196
+ ctx.bridge.call('design.drc', { projectId }),
197
+ ctx.bridge.call('design.erc', { projectId }),
198
+ ]);
199
+ const drc = drcResult;
200
+ const erc = ercResult;
201
+ const drcErrors = drc.errorCount ?? 0;
202
+ const drcWarnings = drc.warningCount ?? 0;
203
+ const ercErrors = erc.errorCount ?? 0;
204
+ const ercWarnings = erc.warningCount ?? 0;
205
+ return {
206
+ project_id: projectId,
207
+ drc: {
208
+ total: drc.totalViolations ?? drcErrors + drcWarnings,
209
+ errors: drcErrors,
210
+ warnings: drcWarnings,
211
+ passed: drcErrors === 0,
212
+ },
213
+ erc: {
214
+ total: erc.totalViolations ?? ercErrors + ercWarnings,
215
+ errors: ercErrors,
216
+ warnings: ercWarnings,
217
+ passed: ercErrors === 0,
218
+ },
219
+ overall_passed: drcErrors === 0 && ercErrors === 0,
220
+ };
221
+ }
222
+ catch {
223
+ return {
224
+ project_id: projectId,
225
+ drc: { total: 0, errors: 0, warnings: 0, passed: false },
226
+ erc: { total: 0, errors: 0, warnings: 0, passed: false },
227
+ overall_passed: false,
228
+ not_available: true,
229
+ };
230
+ }
231
+ },
232
+ });
233
+ }
234
+ export { registerDrcErcTools };
235
+ //# sourceMappingURL=L1_drc_erc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L1_drc_erc.js","sourceRoot":"","sources":["../../src/tools/L1_drc_erc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ToolDefinition } from './types.js';
2
+ import { type EnvConfig } from '../config/env.js';
3
+ declare function registerExportTools(registry: {
4
+ register: (def: ToolDefinition) => void;
5
+ }, _config: EnvConfig): void;
6
+ export { registerExportTools };
@@ -0,0 +1,214 @@
1
+ import { z } from 'zod';
2
+ function registerExportTools(registry, _config) {
3
+ registry.register({
4
+ name: 'easyeda_export_gerbers',
5
+ title: 'Export Gerber files',
6
+ description: 'Export PCB design to Gerber files for PCB fabrication.',
7
+ profile: 'core',
8
+ evidence: ['official-docs'],
9
+ risk: 'medium',
10
+ annotations: {
11
+ readOnlyHint: false,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ },
15
+ inputSchema: z.object({
16
+ projectId: z.string(),
17
+ drillFormat: z.enum(['excellon', 'millimeter', 'inch']).optional(),
18
+ excludeLayer: z.array(z.string()).optional(),
19
+ ledPanel: z.boolean().optional(),
20
+ }),
21
+ outputSchema: z.object({
22
+ project_id: z.string(),
23
+ artifact_path: z.string().optional(),
24
+ file_count: z.number().int().nonnegative().optional(),
25
+ exported: z.boolean(),
26
+ not_available: z.boolean().optional(),
27
+ }),
28
+ handler: async (ctx, params) => {
29
+ const { projectId, drillFormat, excludeLayer, ledPanel } = params;
30
+ try {
31
+ const result = await ctx.bridge.call('board.exportGerbers', {
32
+ projectId,
33
+ drillFormat,
34
+ excludeLayer,
35
+ ledPanel,
36
+ });
37
+ const data = result;
38
+ return {
39
+ project_id: projectId,
40
+ artifact_path: data.artifactPath,
41
+ file_count: data.fileCount,
42
+ exported: true,
43
+ };
44
+ }
45
+ catch {
46
+ return {
47
+ project_id: projectId,
48
+ exported: false,
49
+ not_available: true,
50
+ };
51
+ }
52
+ },
53
+ });
54
+ registry.register({
55
+ name: 'easyeda_export_pick_place',
56
+ title: 'Export pick-and-place file',
57
+ description: 'Export pick-and-place (centroid) file for PCB assembly. Contains component reference, position, rotation, and layer.',
58
+ profile: 'pro',
59
+ evidence: ['official-docs'],
60
+ risk: 'low',
61
+ annotations: {
62
+ readOnlyHint: false,
63
+ destructiveHint: false,
64
+ idempotentHint: true,
65
+ },
66
+ inputSchema: z.object({
67
+ projectId: z.string(),
68
+ format: z.enum(['csv', 'txt']).default('csv'),
69
+ }),
70
+ outputSchema: z.object({
71
+ project_id: z.string(),
72
+ format: z.string(),
73
+ file_path: z.string().optional(),
74
+ component_count: z.number().int().nonnegative().optional(),
75
+ exported: z.boolean(),
76
+ not_available: z.boolean().optional(),
77
+ }),
78
+ handler: async (ctx, params) => {
79
+ const { projectId, format } = params;
80
+ try {
81
+ const result = await ctx.bridge.call('project.export', {
82
+ projectId,
83
+ type: 'pick_place',
84
+ format,
85
+ });
86
+ const data = result;
87
+ return {
88
+ project_id: projectId,
89
+ format,
90
+ file_path: data.filePath,
91
+ component_count: data.componentCount,
92
+ exported: true,
93
+ };
94
+ }
95
+ catch {
96
+ return {
97
+ project_id: projectId,
98
+ format,
99
+ exported: false,
100
+ not_available: true,
101
+ };
102
+ }
103
+ },
104
+ });
105
+ registry.register({
106
+ name: 'easyeda_export_pdf',
107
+ title: 'Export to PDF',
108
+ description: 'Export the schematic and/or board layout to PDF.',
109
+ profile: 'pro',
110
+ evidence: ['official-docs'],
111
+ risk: 'low',
112
+ annotations: {
113
+ readOnlyHint: false,
114
+ destructiveHint: false,
115
+ idempotentHint: true,
116
+ },
117
+ inputSchema: z.object({
118
+ projectId: z.string(),
119
+ scope: z.enum(['schematic', 'board', 'both']).default('both'),
120
+ orientation: z.enum(['portrait', 'landscape']).default('landscape'),
121
+ }),
122
+ outputSchema: z.object({
123
+ project_id: z.string(),
124
+ scope: z.string(),
125
+ orientation: z.string(),
126
+ file_path: z.string().optional(),
127
+ pages: z.number().int().nonnegative().optional(),
128
+ exported: z.boolean(),
129
+ not_available: z.boolean().optional(),
130
+ }),
131
+ handler: async (ctx, params) => {
132
+ const { projectId, scope, orientation } = params;
133
+ try {
134
+ const result = await ctx.bridge.call('project.export', {
135
+ projectId,
136
+ type: 'pdf',
137
+ scope,
138
+ orientation,
139
+ });
140
+ const data = result;
141
+ return {
142
+ project_id: projectId,
143
+ scope,
144
+ orientation,
145
+ file_path: data.filePath,
146
+ pages: data.pages,
147
+ exported: true,
148
+ };
149
+ }
150
+ catch {
151
+ return {
152
+ project_id: projectId,
153
+ scope,
154
+ orientation,
155
+ exported: false,
156
+ not_available: true,
157
+ };
158
+ }
159
+ },
160
+ });
161
+ registry.register({
162
+ name: 'easyeda_export_netlist',
163
+ title: 'Export netlist',
164
+ description: 'Export the schematic netlist in a specified EDA tool format (PADS, Allegro, or Altium).',
165
+ profile: 'pro',
166
+ evidence: ['official-docs'],
167
+ risk: 'low',
168
+ annotations: {
169
+ readOnlyHint: false,
170
+ destructiveHint: false,
171
+ idempotentHint: true,
172
+ },
173
+ inputSchema: z.object({
174
+ projectId: z.string(),
175
+ format: z.enum(['pads', 'allegro', 'altium']).default('pads'),
176
+ }),
177
+ outputSchema: z.object({
178
+ project_id: z.string(),
179
+ format: z.string(),
180
+ file_path: z.string().optional(),
181
+ net_count: z.number().int().nonnegative().optional(),
182
+ exported: z.boolean(),
183
+ not_available: z.boolean().optional(),
184
+ }),
185
+ handler: async (ctx, params) => {
186
+ const { projectId, format } = params;
187
+ try {
188
+ const result = await ctx.bridge.call('project.export', {
189
+ projectId,
190
+ type: 'netlist',
191
+ format,
192
+ });
193
+ const data = result;
194
+ return {
195
+ project_id: projectId,
196
+ format,
197
+ file_path: data.filePath,
198
+ net_count: data.netCount,
199
+ exported: true,
200
+ };
201
+ }
202
+ catch {
203
+ return {
204
+ project_id: projectId,
205
+ format,
206
+ exported: false,
207
+ not_available: true,
208
+ };
209
+ }
210
+ },
211
+ });
212
+ }
213
+ export { registerExportTools };
214
+ //# sourceMappingURL=L1_export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L1_export.js","sourceRoot":"","sources":["../../src/tools/L1_export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ToolDefinition } from './types.js';
2
+ import { type EnvConfig } from '../config/env.js';
3
+ declare function registerSchematicTools(registry: {
4
+ register: (def: ToolDefinition) => void;
5
+ }, _config: EnvConfig): void;
6
+ export { registerSchematicTools };
@@ -0,0 +1,182 @@
1
+ import { z } from 'zod';
2
+ function registerSchematicTools(registry, _config) {
3
+ registry.register({
4
+ name: 'easyeda_schematic_nets',
5
+ title: 'List schematic nets',
6
+ description: 'List all nets in the schematic with their node connections.',
7
+ profile: 'core',
8
+ evidence: ['official-docs'],
9
+ risk: 'low',
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ idempotentHint: true,
13
+ },
14
+ inputSchema: z.object({
15
+ projectId: z.string(),
16
+ }),
17
+ outputSchema: z.object({
18
+ project_id: z.string(),
19
+ nets: z.array(z.object({
20
+ net_name: z.string(),
21
+ node_count: z.number().int().nonnegative(),
22
+ nodes: z.array(z.object({
23
+ component_ref: z.string(),
24
+ pin: z.string(),
25
+ })),
26
+ })),
27
+ total: z.number().int().nonnegative(),
28
+ not_available: z.boolean().optional(),
29
+ }),
30
+ handler: async (ctx, params) => {
31
+ const { projectId } = params;
32
+ try {
33
+ const result = await ctx.bridge.call('schematic.listNets', { projectId });
34
+ const nets = result;
35
+ return {
36
+ project_id: projectId,
37
+ nets: (nets ?? []).map((n) => ({
38
+ net_name: n.netName ?? '',
39
+ node_count: n.nodes?.length ?? 0,
40
+ nodes: (n.nodes ?? []).map((nd) => ({
41
+ component_ref: nd.component ?? '',
42
+ pin: nd.pin ?? '',
43
+ })),
44
+ })),
45
+ total: nets?.length ?? 0,
46
+ };
47
+ }
48
+ catch {
49
+ return {
50
+ project_id: projectId,
51
+ nets: [],
52
+ total: 0,
53
+ not_available: true,
54
+ };
55
+ }
56
+ },
57
+ });
58
+ registry.register({
59
+ name: 'easyeda_schematic_components',
60
+ title: 'List schematic components',
61
+ description: 'List all components in the schematic with their properties including reference, value, footprint, LCSC part number, manufacturer, and datasheet.',
62
+ profile: 'core',
63
+ evidence: ['official-docs'],
64
+ risk: 'low',
65
+ annotations: {
66
+ readOnlyHint: true,
67
+ idempotentHint: true,
68
+ },
69
+ inputSchema: z.object({
70
+ projectId: z.string(),
71
+ limit: z.number().int().min(1).max(500).default(100),
72
+ offset: z.number().int().min(0).default(0),
73
+ }),
74
+ outputSchema: z.object({
75
+ project_id: z.string(),
76
+ components: z.array(z.object({
77
+ reference: z.string(),
78
+ value: z.string(),
79
+ footprint: z.string(),
80
+ lcsc: z.string().optional(),
81
+ manufacturer: z.string().optional(),
82
+ datasheet: z.string().optional(),
83
+ })),
84
+ total: z.number().int().nonnegative(),
85
+ not_available: z.boolean().optional(),
86
+ }),
87
+ handler: async (ctx, params) => {
88
+ const { projectId, limit, offset } = params;
89
+ try {
90
+ const result = await ctx.bridge.call('schematic.listComponents', {
91
+ projectId,
92
+ limit,
93
+ offset,
94
+ });
95
+ const comps = result;
96
+ return {
97
+ project_id: projectId,
98
+ components: (comps ?? []).map((c) => ({
99
+ reference: c.reference ?? '',
100
+ value: c.value ?? '',
101
+ footprint: c.footprint ?? '',
102
+ lcsc: c.lcsc,
103
+ manufacturer: c.manufacturer,
104
+ datasheet: c.datasheet,
105
+ })),
106
+ total: comps?.length ?? 0,
107
+ };
108
+ }
109
+ catch {
110
+ return {
111
+ project_id: projectId,
112
+ components: [],
113
+ total: 0,
114
+ not_available: true,
115
+ };
116
+ }
117
+ },
118
+ });
119
+ registry.register({
120
+ name: 'easyeda_schematic_net_detail',
121
+ title: 'Get schematic net detail',
122
+ description: 'Get full details for a specific net in the schematic including all connected pins and components.',
123
+ profile: 'core',
124
+ evidence: ['official-docs'],
125
+ risk: 'low',
126
+ annotations: {
127
+ readOnlyHint: true,
128
+ idempotentHint: true,
129
+ },
130
+ inputSchema: z.object({
131
+ projectId: z.string(),
132
+ netName: z.string(),
133
+ }),
134
+ outputSchema: z.object({
135
+ project_id: z.string(),
136
+ net_name: z.string(),
137
+ node_count: z.number().int().nonnegative(),
138
+ nodes: z.array(z.object({
139
+ component_ref: z.string(),
140
+ pin: z.string(),
141
+ })),
142
+ not_available: z.boolean().optional(),
143
+ }),
144
+ handler: async (ctx, params) => {
145
+ const { projectId, netName } = params;
146
+ try {
147
+ const result = await ctx.bridge.call('schematic.listNets', { projectId });
148
+ const nets = result;
149
+ const net = (nets ?? []).find((n) => n.netName === netName);
150
+ if (!net) {
151
+ return {
152
+ project_id: projectId,
153
+ net_name: netName,
154
+ node_count: 0,
155
+ nodes: [],
156
+ not_available: true,
157
+ };
158
+ }
159
+ return {
160
+ project_id: projectId,
161
+ net_name: net.netName ?? netName,
162
+ node_count: net.nodes?.length ?? 0,
163
+ nodes: (net.nodes ?? []).map((nd) => ({
164
+ component_ref: nd.component ?? '',
165
+ pin: nd.pin ?? '',
166
+ })),
167
+ };
168
+ }
169
+ catch {
170
+ return {
171
+ project_id: projectId,
172
+ net_name: netName,
173
+ node_count: 0,
174
+ nodes: [],
175
+ not_available: true,
176
+ };
177
+ }
178
+ },
179
+ });
180
+ }
181
+ export { registerSchematicTools };
182
+ //# sourceMappingURL=L1_schematic.js.map