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,136 @@
1
+ import Database from 'better-sqlite3';
2
+ import * as path from 'node:path';
3
+ import * as fs from 'node:fs';
4
+ import { getLogger } from '../utils/logger.js';
5
+ export class Storage {
6
+ db;
7
+ config;
8
+ initialized = false;
9
+ constructor(config) {
10
+ this.config = config;
11
+ const dir = path.dirname(config.SQLITE_PATH);
12
+ if (!fs.existsSync(dir)) {
13
+ fs.mkdirSync(dir, { recursive: true });
14
+ }
15
+ this.db = new Database(config.SQLITE_PATH);
16
+ this.db.pragma('journal_mode = WAL');
17
+ this.db.pragma('foreign_keys = ON');
18
+ }
19
+ initialize() {
20
+ if (this.initialized)
21
+ return;
22
+ const logger = getLogger();
23
+ this.db.exec(`
24
+ CREATE TABLE IF NOT EXISTS schema_version (
25
+ version INTEGER PRIMARY KEY,
26
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
27
+ );
28
+
29
+ CREATE TABLE IF NOT EXISTS cache (
30
+ key TEXT PRIMARY KEY,
31
+ value TEXT NOT NULL,
32
+ ttl INTEGER NOT NULL DEFAULT 0,
33
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
34
+ expires_at TEXT
35
+ );
36
+
37
+ CREATE TABLE IF NOT EXISTS project_cache (
38
+ project_hash TEXT PRIMARY KEY,
39
+ project_name TEXT NOT NULL,
40
+ schematic_snapshot TEXT,
41
+ board_snapshot TEXT,
42
+ bom_snapshot TEXT,
43
+ last_synced_at TEXT NOT NULL DEFAULT (datetime('now')),
44
+ easyeda_version TEXT
45
+ );
46
+
47
+ CREATE TABLE IF NOT EXISTS artifacts (
48
+ id TEXT PRIMARY KEY,
49
+ project_hash TEXT NOT NULL,
50
+ type TEXT NOT NULL CHECK (type IN ('gerber','bom','pdf','pick-place','netlist','schematic','board')),
51
+ file_path TEXT NOT NULL,
52
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
53
+ metadata TEXT
54
+ );
55
+
56
+ CREATE INDEX IF NOT EXISTS idx_artifacts_project ON artifacts(project_hash);
57
+ CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);
58
+ `);
59
+ this.initialized = true;
60
+ logger.info({ path: this.config.SQLITE_PATH }, 'storage initialized');
61
+ }
62
+ cacheGet(key) {
63
+ const row = this.db
64
+ .prepare(`SELECT value FROM cache WHERE key = ? AND (expires_at IS NULL OR expires_at > datetime('now'))`)
65
+ .get(key);
66
+ return row?.value ?? null;
67
+ }
68
+ cacheSet(key, value, ttlSec = 0) {
69
+ const expiresAt = ttlSec > 0 ? new Date(Date.now() + ttlSec * 1000).toISOString() : null;
70
+ this.db
71
+ .prepare(`INSERT OR REPLACE INTO cache (key, value, ttl, expires_at) VALUES (?, ?, ?, ?)`)
72
+ .run(key, value, ttlSec, expiresAt);
73
+ }
74
+ cacheDelete(key) {
75
+ this.db.prepare('DELETE FROM cache WHERE key = ?').run(key);
76
+ }
77
+ cacheClear() {
78
+ this.db.prepare('DELETE FROM cache').run();
79
+ }
80
+ getProjectCache(hash) {
81
+ const row = this.db.prepare('SELECT * FROM project_cache WHERE project_hash = ?').get(hash);
82
+ if (!row)
83
+ return null;
84
+ return {
85
+ projectHash: row.project_hash,
86
+ projectName: row.project_name,
87
+ schematicSnapshot: row.schematic_snapshot ?? null,
88
+ boardSnapshot: row.board_snapshot ?? null,
89
+ bomSnapshot: row.bom_snapshot ?? null,
90
+ lastSyncedAt: row.last_synced_at,
91
+ easyedaVersion: row.easyeda_version ?? null,
92
+ };
93
+ }
94
+ upsertProjectCache(cache) {
95
+ this.db
96
+ .prepare(`
97
+ INSERT OR REPLACE INTO project_cache
98
+ (project_hash, project_name, schematic_snapshot, board_snapshot, bom_snapshot, last_synced_at, easyeda_version)
99
+ VALUES (?, ?, ?, ?, ?, ?, ?)
100
+ `)
101
+ .run(cache.projectHash, cache.projectName, cache.schematicSnapshot, cache.boardSnapshot, cache.bomSnapshot, cache.lastSyncedAt, cache.easyedaVersion);
102
+ }
103
+ insertArtifact(artifact) {
104
+ this.db
105
+ .prepare(`
106
+ INSERT INTO artifacts (id, project_hash, type, file_path, created_at, metadata)
107
+ VALUES (?, ?, ?, ?, ?, ?)
108
+ `)
109
+ .run(artifact.id, artifact.projectHash, artifact.type, artifact.filePath, artifact.createdAt, artifact.metadata);
110
+ }
111
+ getArtifacts(projectHash, type) {
112
+ let query = 'SELECT * FROM artifacts WHERE project_hash = ?';
113
+ const params = [projectHash];
114
+ if (type) {
115
+ query += ' AND type = ?';
116
+ params.push(type);
117
+ }
118
+ query += ' ORDER BY created_at DESC';
119
+ const rows = this.db.prepare(query).all(...params);
120
+ return rows.map((r) => ({
121
+ id: r.id,
122
+ projectHash: r.project_hash,
123
+ type: r.type,
124
+ filePath: r.file_path,
125
+ createdAt: r.created_at,
126
+ metadata: r.metadata ?? null,
127
+ }));
128
+ }
129
+ vacuum() {
130
+ this.db.exec('VACUUM');
131
+ }
132
+ close() {
133
+ this.db.close();
134
+ }
135
+ }
136
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { Storage } from './database.js';
2
+ export type * from './types.js';
@@ -0,0 +1,2 @@
1
+ export { Storage } from './database.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ export declare const CacheEntrySchema: z.ZodObject<{
3
+ key: z.ZodString;
4
+ value: z.ZodString;
5
+ ttl: z.ZodNumber;
6
+ created_at: z.ZodString;
7
+ expires_at: z.ZodString;
8
+ }, z.core.$strip>;
9
+ export type CacheEntry = z.infer<typeof CacheEntrySchema>;
10
+ export interface ProjectCache {
11
+ projectHash: string;
12
+ projectName: string;
13
+ schematicSnapshot: string | null;
14
+ boardSnapshot: string | null;
15
+ bomSnapshot: string | null;
16
+ lastSyncedAt: string;
17
+ easyedaVersion: string | null;
18
+ }
19
+ export interface ArtifactRecord {
20
+ id: string;
21
+ projectHash: string;
22
+ type: 'gerber' | 'bom' | 'pdf' | 'pick-place' | 'netlist' | 'schematic' | 'board';
23
+ filePath: string;
24
+ createdAt: string;
25
+ metadata: string | null;
26
+ }
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export const CacheEntrySchema = z.object({
3
+ key: z.string(),
4
+ value: z.string(),
5
+ ttl: z.number().int().nonnegative(),
6
+ created_at: z.string(),
7
+ expires_at: z.string(),
8
+ });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type ToolDefinition } from './types.js';
2
+ import { type EnvConfig } from '../config/env.js';
3
+ declare function registerDiagnostics(registry: {
4
+ register: (def: ToolDefinition) => void;
5
+ }, config: EnvConfig): void;
6
+ export { registerDiagnostics };
@@ -0,0 +1,297 @@
1
+ import { z } from 'zod';
2
+ import { PROFILE_DEFINITIONS } from '../config/profiles.js';
3
+ function registerDiagnostics(registry, config) {
4
+ registry.register({
5
+ name: 'easyeda_health_check',
6
+ title: 'Health check',
7
+ description: 'Return server health status, including runtime version, active profile, bridge state, and config validity.',
8
+ profile: 'core',
9
+ evidence: ['official-docs'],
10
+ risk: 'low',
11
+ annotations: {
12
+ readOnlyHint: true,
13
+ idempotentHint: true,
14
+ },
15
+ inputSchema: z.object({}),
16
+ outputSchema: z.object({
17
+ status: z.enum(['ok', 'degraded', 'unavailable']),
18
+ version: z.string(),
19
+ node_version: z.string(),
20
+ profile: z.string(),
21
+ transport: z.string(),
22
+ bridge_connected: z.boolean(),
23
+ ups: z.number(),
24
+ }),
25
+ handler: async (ctx, _params) => {
26
+ return {
27
+ status: 'ok',
28
+ version: '0.2.0',
29
+ node_version: process.version,
30
+ profile: ctx.profile,
31
+ transport: config.TRANSPORT,
32
+ bridge_connected: false,
33
+ ups: process.uptime(),
34
+ };
35
+ },
36
+ });
37
+ registry.register({
38
+ name: 'easyeda_bridge_status',
39
+ title: 'Bridge status',
40
+ description: 'Check EasyEDA Pro bridge connection status, version, and capabilities.',
41
+ profile: 'core',
42
+ evidence: ['official-docs'],
43
+ risk: 'low',
44
+ annotations: {
45
+ readOnlyHint: true,
46
+ idempotentHint: true,
47
+ },
48
+ inputSchema: z.object({}),
49
+ outputSchema: z.object({
50
+ connected: z.boolean(),
51
+ bridge_version: z.string().optional(),
52
+ easyeda_version: z.string().optional(),
53
+ capabilities: z.array(z.string()).optional(),
54
+ dev_mode: z.boolean().optional(),
55
+ last_heartbeat_ms: z.number().optional(),
56
+ uptime_ms: z.number().optional(),
57
+ }),
58
+ handler: async (_ctx) => {
59
+ return {
60
+ connected: false,
61
+ uptime_ms: process.uptime() * 1000,
62
+ };
63
+ },
64
+ });
65
+ registry.register({
66
+ name: 'easyeda_get_capabilities',
67
+ title: 'Get capabilities',
68
+ description: 'Return server capabilities, including available profiles, enabled feature flags, and supported operations.',
69
+ profile: 'core',
70
+ evidence: ['official-docs'],
71
+ risk: 'low',
72
+ annotations: {
73
+ readOnlyHint: true,
74
+ idempotentHint: true,
75
+ },
76
+ inputSchema: z.object({}),
77
+ outputSchema: z.object({
78
+ server_name: z.string(),
79
+ server_version: z.string(),
80
+ protocol_version: z.string(),
81
+ profiles: z.array(z.object({
82
+ name: z.string(),
83
+ label: z.string(),
84
+ description: z.string(),
85
+ is_default: z.boolean(),
86
+ })),
87
+ current_profile: z.string(),
88
+ feature_flags: z.record(z.string(), z.boolean()),
89
+ transports: z.array(z.string()),
90
+ }),
91
+ handler: async (_ctx, _params) => {
92
+ const profiles = Object.values(PROFILE_DEFINITIONS).map((p) => ({
93
+ name: p.name,
94
+ label: p.label,
95
+ description: p.description,
96
+ is_default: p.isDefault,
97
+ }));
98
+ return {
99
+ server_name: 'easyeda-mcp-pro',
100
+ server_version: '0.2.0',
101
+ protocol_version: config.MCP_PROTOCOL_VERSION,
102
+ profiles,
103
+ current_profile: config.TOOL_PROFILE,
104
+ feature_flags: {
105
+ tasks_enabled: false,
106
+ apps_enabled: false,
107
+ v2_experimental: false,
108
+ ordering_enabled: false,
109
+ },
110
+ transports: [config.TRANSPORT],
111
+ };
112
+ },
113
+ });
114
+ registry.register({
115
+ name: 'easyeda_get_server_config',
116
+ title: 'Get server config',
117
+ description: 'Return safe (redacted) server configuration. Secrets are never exposed.',
118
+ profile: 'core',
119
+ evidence: ['official-docs'],
120
+ risk: 'low',
121
+ annotations: {
122
+ readOnlyHint: true,
123
+ idempotentHint: true,
124
+ },
125
+ inputSchema: z.object({
126
+ include_flags: z.boolean().default(false),
127
+ }),
128
+ outputSchema: z.object({
129
+ node_env: z.string(),
130
+ log_level: z.string(),
131
+ profile: z.string(),
132
+ transport: z.string(),
133
+ bridge_host: z.string(),
134
+ bridge_port: z.number(),
135
+ mcp_protocol_version: z.string(),
136
+ flags: z.record(z.string(), z.boolean()).optional(),
137
+ }),
138
+ handler: async (_ctx, _params) => {
139
+ return {
140
+ node_env: config.NODE_ENV,
141
+ log_level: config.LOG_LEVEL,
142
+ profile: config.TOOL_PROFILE,
143
+ transport: config.TRANSPORT,
144
+ bridge_host: config.BRIDGE_HOST,
145
+ bridge_port: config.BRIDGE_PORT,
146
+ mcp_protocol_version: config.MCP_PROTOCOL_VERSION,
147
+ };
148
+ },
149
+ });
150
+ registry.register({
151
+ name: 'easyeda_get_tool_profiles',
152
+ title: 'Get tool profiles',
153
+ description: 'List available tool profiles and their descriptions.',
154
+ profile: 'core',
155
+ evidence: ['official-docs'],
156
+ risk: 'low',
157
+ annotations: {
158
+ readOnlyHint: true,
159
+ idempotentHint: true,
160
+ },
161
+ inputSchema: z.object({}),
162
+ outputSchema: z.object({
163
+ current: z.string(),
164
+ profiles: z.array(z.object({
165
+ name: z.string(),
166
+ label: z.string(),
167
+ description: z.string(),
168
+ approx_tool_count: z.string(),
169
+ is_default: z.boolean(),
170
+ is_active: z.boolean(),
171
+ })),
172
+ }),
173
+ handler: async (ctx, _params) => {
174
+ const profiles = Object.values(PROFILE_DEFINITIONS).map((p) => ({
175
+ name: p.name,
176
+ label: p.label,
177
+ description: p.description,
178
+ approx_tool_count: p.approxToolCount,
179
+ is_default: p.isDefault,
180
+ is_active: p.name === ctx.profile,
181
+ }));
182
+ return {
183
+ current: ctx.profile,
184
+ profiles,
185
+ };
186
+ },
187
+ });
188
+ registry.register({
189
+ name: 'easyeda_get_feature_flags',
190
+ title: 'Get feature flags',
191
+ description: 'Return current feature flag values.',
192
+ profile: 'core',
193
+ evidence: ['official-docs'],
194
+ risk: 'low',
195
+ annotations: {
196
+ readOnlyHint: true,
197
+ idempotentHint: true,
198
+ },
199
+ inputSchema: z.object({}),
200
+ outputSchema: z.object({
201
+ flags: z.record(z.string(), z.boolean()),
202
+ }),
203
+ handler: async (_ctx, _params) => {
204
+ return {
205
+ flags: {
206
+ mcp_tasks_enabled: false,
207
+ mcp_apps_enabled: false,
208
+ mcp_v2_experimental: false,
209
+ jlcpcb_ordering_enabled: false,
210
+ jlcsearch_enabled: true,
211
+ mouser_enabled: false,
212
+ digikey_enabled: false,
213
+ oauth_enabled: false,
214
+ otel_enabled: false,
215
+ ai_enabled: false,
216
+ dev_bridge: false,
217
+ bridge_raw_exec_enabled: false,
218
+ },
219
+ };
220
+ },
221
+ });
222
+ registry.register({
223
+ name: 'easyeda_run_self_test',
224
+ title: 'Run self test',
225
+ description: 'Run internal self-test to verify server integrity, config, and bridge connectivity.',
226
+ profile: 'core',
227
+ evidence: ['official-docs'],
228
+ risk: 'low',
229
+ annotations: {
230
+ readOnlyHint: false,
231
+ idempotentHint: false,
232
+ },
233
+ inputSchema: z.object({}),
234
+ outputSchema: z.object({
235
+ passed: z.boolean(),
236
+ checks: z.array(z.object({
237
+ name: z.string(),
238
+ status: z.enum(['pass', 'warn', 'fail', 'skipped']),
239
+ message: z.string(),
240
+ })),
241
+ }),
242
+ handler: async (_ctx, _params) => {
243
+ const checks = [
244
+ {
245
+ name: 'config_valid',
246
+ status: 'pass',
247
+ message: 'Config valid',
248
+ },
249
+ {
250
+ name: 'bridge_connected',
251
+ status: 'skipped',
252
+ message: 'Bridge not available in test context',
253
+ },
254
+ {
255
+ name: 'sqlite_available',
256
+ status: 'skipped',
257
+ message: 'SQLite not initialized',
258
+ },
259
+ ];
260
+ return {
261
+ passed: checks.every((c) => c.status === 'pass' || c.status === 'skipped'),
262
+ checks,
263
+ };
264
+ },
265
+ });
266
+ registry.register({
267
+ name: 'easyeda_bridge_probe_methods',
268
+ title: 'Probe bridge methods',
269
+ description: 'Query the EasyEDA Pro bridge for available API methods. Requires bridge connection. (dev/pro only)',
270
+ profile: 'dev',
271
+ evidence: ['runtime-probe'],
272
+ risk: 'medium',
273
+ annotations: {
274
+ readOnlyHint: true,
275
+ destructiveHint: false,
276
+ },
277
+ inputSchema: z.object({
278
+ filter: z.string().optional(),
279
+ }),
280
+ outputSchema: z.object({
281
+ methods: z.array(z.object({
282
+ name: z.string(),
283
+ available: z.boolean(),
284
+ parameter_schema: z.unknown().optional(),
285
+ })),
286
+ total: z.number(),
287
+ }),
288
+ handler: async (_ctx, _params) => {
289
+ return {
290
+ methods: [],
291
+ total: 0,
292
+ };
293
+ },
294
+ });
295
+ }
296
+ export { registerDiagnostics };
297
+ //# sourceMappingURL=L0_diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L0_diagnostics.js","sourceRoot":"","sources":["../../src/tools/L0_diagnostics.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 registerBoardTools(registry: {
4
+ register: (def: ToolDefinition) => void;
5
+ }, _config: EnvConfig): void;
6
+ export { registerBoardTools };