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 @@
1
+ {"version":3,"file":"L1_schematic.js","sourceRoot":"","sources":["../../src/tools/L1_schematic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type ToolDefinition, type ToolContext } from './types.js';
2
+ import { type ToolProfile } from '../config/profiles.js';
3
+ import { type Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { type z } from 'zod';
5
+ export declare class ToolRegistry {
6
+ private tools;
7
+ private currentProfile;
8
+ setProfile(profile: ToolProfile): void;
9
+ register<TInput extends z.ZodType, TOutput extends z.ZodType>(definition: ToolDefinition<TInput, TOutput>): void;
10
+ get(name: string): ToolDefinition | undefined;
11
+ getEnabledTools(): ToolDefinition[];
12
+ getAllTools(): ToolDefinition[];
13
+ registerAllOnServer(server: Server, context: ToolContext): void;
14
+ getToolDefinitions(): {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: {
18
+ type: "object";
19
+ };
20
+ }[];
21
+ }
@@ -0,0 +1,55 @@
1
+ import { getEnabledProfiles } from '../config/profiles.js';
2
+ import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
3
+ export class ToolRegistry {
4
+ tools = new Map();
5
+ currentProfile = 'core';
6
+ setProfile(profile) {
7
+ this.currentProfile = profile;
8
+ }
9
+ register(definition) {
10
+ if (this.tools.has(definition.name)) {
11
+ throw new Error(`Tool "${definition.name}" is already registered.`);
12
+ }
13
+ this.tools.set(definition.name, definition);
14
+ }
15
+ get(name) {
16
+ return this.tools.get(name);
17
+ }
18
+ getEnabledTools() {
19
+ const enabledProfiles = new Set(getEnabledProfiles(this.currentProfile));
20
+ return Array.from(this.tools.values()).filter((t) => enabledProfiles.has(t.profile));
21
+ }
22
+ getAllTools() {
23
+ return Array.from(this.tools.values());
24
+ }
25
+ registerAllOnServer(server, context) {
26
+ const enabled = this.getEnabledTools();
27
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
28
+ const name = request.params.name;
29
+ const tool = enabled.find((t) => t.name === name);
30
+ if (!tool) {
31
+ return {
32
+ content: [{ type: 'text', text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
33
+ isError: true,
34
+ };
35
+ }
36
+ const inputSchema = tool.inputSchema;
37
+ const parsed = inputSchema.parse(request.params.arguments ?? {});
38
+ const result = await tool.handler(context, parsed);
39
+ return {
40
+ content: [{ type: 'text', text: JSON.stringify(result) }],
41
+ };
42
+ });
43
+ }
44
+ getToolDefinitions() {
45
+ const enabled = this.getEnabledTools();
46
+ return enabled.map((t) => ({
47
+ name: t.name,
48
+ description: t.description,
49
+ inputSchema: t.inputSchema.describe
50
+ ? { type: 'object' }
51
+ : { type: 'object' },
52
+ }));
53
+ }
54
+ }
55
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type z } from 'zod';
2
+ import { type ToolProfile } from '../config/profiles.js';
3
+ export interface ToolDefinition<TInput extends z.ZodType = z.ZodType, TOutput extends z.ZodType = z.ZodType> {
4
+ name: string;
5
+ title: string;
6
+ description: string;
7
+ profile: ToolProfile;
8
+ evidence: Array<'official-docs' | 'pro-api-types' | 'runtime-probe' | 'official-skill' | 'source-format' | 'vendor-api-docs' | 'inferred'>;
9
+ risk: 'low' | 'medium' | 'high';
10
+ annotations: {
11
+ readOnlyHint?: boolean;
12
+ destructiveHint?: boolean;
13
+ idempotentHint?: boolean;
14
+ openWorldHint?: boolean;
15
+ };
16
+ inputSchema: TInput;
17
+ outputSchema: TOutput;
18
+ handler: (context: ToolContext, input: z.infer<TInput>) => Promise<z.infer<TOutput>>;
19
+ }
20
+ export interface ToolContext {
21
+ profile: ToolProfile;
22
+ bridge: {
23
+ call: <TParams, TResult>(method: string, params?: TParams, opts?: {
24
+ timeoutMs?: number;
25
+ traceparent?: string;
26
+ }) => Promise<TResult>;
27
+ };
28
+ config: {
29
+ bridgeTimeoutMs: number;
30
+ [key: string]: unknown;
31
+ };
32
+ }
33
+ export interface ToolEnvelope<T> {
34
+ ok: true;
35
+ data: T;
36
+ meta: {
37
+ tool: string;
38
+ duration_ms: number;
39
+ bridge_duration_ms?: number;
40
+ source: Array<string>;
41
+ warnings: string[];
42
+ project_hash?: string;
43
+ easyeda_version?: string;
44
+ bridge_version?: string;
45
+ };
46
+ }
47
+ export interface ActionableErrorData {
48
+ code: string;
49
+ message: string;
50
+ suggestion: string;
51
+ retryable: boolean;
52
+ details?: unknown;
53
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import pino from 'pino';
2
+ import { type EnvConfig } from '../config/env.js';
3
+ export declare function createLogger(config: Pick<EnvConfig, 'LOG_LEVEL'>): pino.Logger;
4
+ export declare function getLogger(): pino.Logger;
@@ -0,0 +1,54 @@
1
+ import pino from 'pino';
2
+ let loggerInstance = null;
3
+ export function createLogger(config) {
4
+ if (loggerInstance)
5
+ return loggerInstance;
6
+ const pinoOpts = {
7
+ level: config.LOG_LEVEL,
8
+ ...(process.env.NODE_ENV !== 'production'
9
+ ? { transport: { target: 'pino/file', options: { destination: 2 } } }
10
+ : {}),
11
+ redact: {
12
+ paths: [
13
+ 'apiKey',
14
+ 'api_key',
15
+ 'API_KEY',
16
+ 'clientSecret',
17
+ 'client_secret',
18
+ 'CLIENT_SECRET',
19
+ 'token',
20
+ 'TOKEN',
21
+ 'sessionToken',
22
+ 'session_token',
23
+ 'password',
24
+ 'PASSWORD',
25
+ 'authorization',
26
+ 'AUTHORIZATION',
27
+ 'cookie',
28
+ 'COOKIE',
29
+ 'jwt',
30
+ 'JWT',
31
+ 'secret',
32
+ 'SECRET',
33
+ 'key',
34
+ 'KEY',
35
+ 'credential',
36
+ 'CREDENTIAL',
37
+ ],
38
+ censor: '[REDACTED]',
39
+ },
40
+ serializers: {
41
+ err: pino.stdSerializers.err,
42
+ error: pino.stdSerializers.err,
43
+ },
44
+ };
45
+ loggerInstance = pino(pinoOpts);
46
+ return loggerInstance;
47
+ }
48
+ export function getLogger() {
49
+ if (!loggerInstance) {
50
+ throw new Error('Logger not initialized. Call createLogger first.');
51
+ }
52
+ return loggerInstance;
53
+ }
54
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,IAAI,cAAc,GAAuB,IAAI,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAoC;IAC/D,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,QAAQ,GAAuB;QACnC,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACvC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,QAAQ;gBACR,SAAS;gBACT,SAAS;gBACT,cAAc;gBACd,eAAe;gBACf,eAAe;gBACf,OAAO;gBACP,OAAO;gBACP,cAAc;gBACd,eAAe;gBACf,UAAU;gBACV,UAAU;gBACV,eAAe;gBACf,eAAe;gBACf,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,YAAY;gBACZ,YAAY;aACb;YACD,MAAM,EAAE,YAAY;SACrB;QACD,WAAW,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;YAC5B,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;SAC/B;KACF,CAAC;IAEF,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function redactSecrets(input: string): string;
2
+ export declare function redactObject<T>(obj: T): T;
@@ -0,0 +1,56 @@
1
+ const SECRET_PATTERNS = [
2
+ /(api[_-]?key\s*[:=]\s*)(['"]?[a-zA-Z0-9_-]+['"]?)/gi,
3
+ /(client[_-]?secret\s*[:=]\s*)(['"]?[a-zA-Z0-9_-]+['"]?)/gi,
4
+ /(token\s*[:=]\s*)(['"]?[a-zA-Z0-9_\-.:=]+['"]?)/gi,
5
+ /(password\s*[:=]\s*)(['"]?[^\s'"]+['"]?)/gi,
6
+ /(bearer\s+)([a-zA-Z0-9_\-.:=]+)/gi,
7
+ /(-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)([\s\S]*?)(-----END\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/gi,
8
+ /(authorization:\s*bearer\s+)([a-zA-Z0-9_\-.:=]+)/gi,
9
+ ];
10
+ export function redactSecrets(input) {
11
+ let result = input;
12
+ for (const pattern of SECRET_PATTERNS) {
13
+ result = result.replace(pattern, (match, prefix) => {
14
+ return `${prefix}[REDACTED]`;
15
+ });
16
+ }
17
+ return result;
18
+ }
19
+ export function redactObject(obj) {
20
+ if (typeof obj === 'string') {
21
+ return redactSecrets(obj);
22
+ }
23
+ if (obj === null || obj === undefined) {
24
+ return obj;
25
+ }
26
+ if (Array.isArray(obj)) {
27
+ return obj.map(redactObject);
28
+ }
29
+ if (typeof obj === 'object') {
30
+ const redacted = {};
31
+ for (const [key, value] of Object.entries(obj)) {
32
+ const lowerKey = key.toLowerCase();
33
+ if (lowerKey.includes('key') ||
34
+ lowerKey.includes('secret') ||
35
+ lowerKey.includes('token') ||
36
+ lowerKey.includes('password') ||
37
+ lowerKey.includes('credential') ||
38
+ lowerKey === 'authorization' ||
39
+ lowerKey === 'cookie') {
40
+ redacted[key] = '[REDACTED]';
41
+ }
42
+ else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
43
+ redacted[key] = redactObject(value);
44
+ }
45
+ else if (typeof value === 'string') {
46
+ redacted[key] = redactSecrets(value);
47
+ }
48
+ else {
49
+ redacted[key] = value;
50
+ }
51
+ }
52
+ return redacted;
53
+ }
54
+ return obj;
55
+ }
56
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/utils/redaction.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAkB;IACrC,qDAAqD;IACrD,2DAA2D;IAC3D,mDAAmD;IACnD,4CAA4C;IAC5C,mCAAmC;IACnC,oGAAoG;IACpG,oDAAoD;CACrD,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjD,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,GAAM;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,aAAa,CAAC,GAAG,CAAiB,CAAC;IAC5C,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,YAAY,CAAiB,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,IACE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC3B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC7B,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC/B,QAAQ,KAAK,eAAe;gBAC5B,QAAQ,KAAK,QAAQ,EACrB,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChF,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,QAAwB,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type EnvConfig } from '../../config/env.js';
2
+ export interface DigiKeyPart {
3
+ digiKeyPartNumber: string;
4
+ manufacturerPartNumber: string;
5
+ manufacturer: string;
6
+ description: string;
7
+ quantityAvailable: number;
8
+ unitPrice: number;
9
+ datasheetUrl: string;
10
+ photoUrl: string;
11
+ rohsStatus: string;
12
+ }
13
+ export interface DigiKeyDigitalBomResult {
14
+ parts: DigiKeyPart[];
15
+ total: number;
16
+ }
17
+ export declare class DigiKeyClient {
18
+ private config;
19
+ private logger;
20
+ private baseUrl;
21
+ private authUrl;
22
+ private clientId;
23
+ private clientSecret;
24
+ private accessToken;
25
+ private tokenExpiresAt;
26
+ constructor(config: EnvConfig);
27
+ private ensureToken;
28
+ private apiGet;
29
+ private apiPost;
30
+ private parseDigiKeyPart;
31
+ /**
32
+ * Search DigiKey parts by keyword.
33
+ * @param query - The search keyword
34
+ * @returns Array of matching parts
35
+ */
36
+ searchByKeyword(query: string): Promise<DigiKeyPart[]>;
37
+ /**
38
+ * Get detailed product information for a specific DigiKey part number.
39
+ * @param digiKeyPartNumber - The DigiKey part number
40
+ * @returns Part details
41
+ */
42
+ getProductDetails(digiKeyPartNumber: string): Promise<DigiKeyPart>;
43
+ /**
44
+ * Get pricing and availability for multiple DigiKey parts (digital BOM).
45
+ * @param partNumbers - Array of DigiKey part numbers
46
+ * @returns BOM result with parts list and total count
47
+ */
48
+ getDigitalBom(partNumbers: string[]): Promise<DigiKeyDigitalBomResult>;
49
+ }
@@ -0,0 +1,200 @@
1
+ import { request } from 'undici';
2
+ import { EasyEdaMcpError } from '../../schemas/common.js';
3
+ import { getLogger } from '../../utils/logger.js';
4
+ async function readBody(stream) {
5
+ const chunks = [];
6
+ for await (const chunk of stream) {
7
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
8
+ }
9
+ return Buffer.concat(chunks).toString('utf-8');
10
+ }
11
+ export class DigiKeyClient {
12
+ config;
13
+ logger;
14
+ baseUrl;
15
+ authUrl;
16
+ clientId;
17
+ clientSecret;
18
+ accessToken = null;
19
+ tokenExpiresAt = 0;
20
+ constructor(config) {
21
+ this.config = config;
22
+ this.logger = getLogger();
23
+ this.clientId = config.DIGIKEY_CLIENT_ID;
24
+ this.clientSecret = config.DIGIKEY_CLIENT_SECRET;
25
+ if (!config.DIGIKEY_ENABLED) {
26
+ throw new EasyEdaMcpError({
27
+ code: 'FEATURE_DISABLED',
28
+ message: 'DigiKey API is not enabled. Set DIGIKEY_ENABLED=true to enable.',
29
+ suggestion: 'Set DIGIKEY_ENABLED=true and provide DIGIKEY_CLIENT_ID and DIGIKEY_CLIENT_SECRET.',
30
+ retryable: false,
31
+ });
32
+ }
33
+ if (!this.clientId || !this.clientSecret) {
34
+ throw new EasyEdaMcpError({
35
+ code: 'CREDENTIALS_MISSING',
36
+ message: 'DigiKey credentials are missing.',
37
+ suggestion: 'Set DIGIKEY_CLIENT_ID and DIGIKEY_CLIENT_SECRET environment variables.',
38
+ retryable: false,
39
+ });
40
+ }
41
+ if (config.DIGIKEY_SANDBOX) {
42
+ this.baseUrl = 'https://sandbox-api.digikey.com';
43
+ this.authUrl = 'https://sandbox-api.digikey.com/v1/oauth2/token';
44
+ }
45
+ else {
46
+ this.baseUrl = 'https://api.digikey.com';
47
+ this.authUrl = 'https://api.digikey.com/v1/oauth2/token';
48
+ }
49
+ }
50
+ async ensureToken() {
51
+ const now = Math.floor(Date.now() / 1000);
52
+ if (this.accessToken && now < this.tokenExpiresAt - 60) {
53
+ return this.accessToken;
54
+ }
55
+ this.logger.debug('digikey acquiring oauth2 token');
56
+ const basicAuth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
57
+ const { statusCode, body } = await request(this.authUrl, {
58
+ method: 'POST',
59
+ headers: {
60
+ authorization: `Basic ${basicAuth}`,
61
+ 'content-type': 'application/x-www-form-urlencoded',
62
+ },
63
+ body: 'grant_type=client_credentials&client_id=' + encodeURIComponent(this.clientId),
64
+ });
65
+ const responseText = await readBody(body);
66
+ if (statusCode < 200 || statusCode >= 300) {
67
+ throw new EasyEdaMcpError({
68
+ code: 'VENDOR_API_UNAVAILABLE',
69
+ message: `DigiKey OAuth2 token request failed with status ${statusCode}`,
70
+ suggestion: 'Check DIGIKEY_CLIENT_ID, DIGIKEY_CLIENT_SECRET, and network connectivity.',
71
+ retryable: false,
72
+ details: { statusCode },
73
+ });
74
+ }
75
+ const tokenData = JSON.parse(responseText);
76
+ this.accessToken = tokenData.access_token;
77
+ this.tokenExpiresAt = now + tokenData.expires_in;
78
+ return this.accessToken;
79
+ }
80
+ async apiGet(path) {
81
+ const token = await this.ensureToken();
82
+ const url = `${this.baseUrl}${path}`;
83
+ this.logger.debug({ url }, 'digikey api get');
84
+ const { statusCode, body } = await request(url, {
85
+ method: 'GET',
86
+ headers: {
87
+ authorization: `Bearer ${token}`,
88
+ accept: 'application/json',
89
+ 'X-DIGIKEY-Client-Id': this.clientId,
90
+ },
91
+ });
92
+ const responseText = await readBody(body);
93
+ if (statusCode === 429) {
94
+ throw new EasyEdaMcpError({
95
+ code: 'RATE_LIMITED',
96
+ message: 'DigiKey API rate limit exceeded.',
97
+ suggestion: 'Retry after a short delay or reduce request frequency.',
98
+ retryable: true,
99
+ });
100
+ }
101
+ if (statusCode < 200 || statusCode >= 300) {
102
+ throw new EasyEdaMcpError({
103
+ code: 'VENDOR_API_UNAVAILABLE',
104
+ message: `DigiKey API returned status ${statusCode}`,
105
+ suggestion: 'Check request parameters and DigiKey API status.',
106
+ retryable: statusCode >= 500,
107
+ details: { statusCode, response: responseText.slice(0, 500) },
108
+ });
109
+ }
110
+ return JSON.parse(responseText);
111
+ }
112
+ async apiPost(path, body) {
113
+ const token = await this.ensureToken();
114
+ const url = `${this.baseUrl}${path}`;
115
+ this.logger.debug({ url }, 'digikey api post');
116
+ const { statusCode, body: responseBody } = await request(url, {
117
+ method: 'POST',
118
+ headers: {
119
+ authorization: `Bearer ${token}`,
120
+ 'content-type': 'application/json',
121
+ accept: 'application/json',
122
+ 'X-DIGIKEY-Client-Id': this.clientId,
123
+ },
124
+ body: JSON.stringify(body),
125
+ });
126
+ const responseText = await readBody(responseBody);
127
+ if (statusCode === 429) {
128
+ throw new EasyEdaMcpError({
129
+ code: 'RATE_LIMITED',
130
+ message: 'DigiKey API rate limit exceeded.',
131
+ suggestion: 'Retry after a short delay or reduce request frequency.',
132
+ retryable: true,
133
+ });
134
+ }
135
+ if (statusCode < 200 || statusCode >= 300) {
136
+ throw new EasyEdaMcpError({
137
+ code: 'VENDOR_API_UNAVAILABLE',
138
+ message: `DigiKey API returned status ${statusCode}`,
139
+ suggestion: 'Check request parameters and DigiKey API status.',
140
+ retryable: statusCode >= 500,
141
+ details: { statusCode, response: responseText.slice(0, 500) },
142
+ });
143
+ }
144
+ return JSON.parse(responseText);
145
+ }
146
+ parseDigiKeyPart(raw) {
147
+ return {
148
+ digiKeyPartNumber: String(raw['DigiKeyPartNumber'] ?? raw['digiKeyPartNumber'] ?? ''),
149
+ manufacturerPartNumber: String(raw['ManufacturerPartNumber'] ?? raw['manufacturerPartNumber'] ?? ''),
150
+ manufacturer: String(raw['Manufacturer'] ?? raw['manufacturer'] ?? ''),
151
+ description: String(raw['Description'] ?? raw['description'] ?? ''),
152
+ quantityAvailable: Number(raw['QuantityAvailable'] ?? raw['quantityAvailable'] ?? 0),
153
+ unitPrice: Number(raw['UnitPrice'] ?? raw['unitPrice'] ?? 0),
154
+ datasheetUrl: String(raw['DataSheetUrl'] ?? raw['datasheetUrl'] ?? ''),
155
+ photoUrl: String(raw['PhotoUrl'] ?? raw['photoUrl'] ?? ''),
156
+ rohsStatus: String(raw['RoHSStatus'] ?? raw['rohsStatus'] ?? ''),
157
+ };
158
+ }
159
+ /**
160
+ * Search DigiKey parts by keyword.
161
+ * @param query - The search keyword
162
+ * @returns Array of matching parts
163
+ */
164
+ async searchByKeyword(query) {
165
+ const response = await this.apiPost('/search/v3/products/keyword', {
166
+ Keywords: query,
167
+ Limit: 25,
168
+ Offset: 0,
169
+ locale: this.config.DIGIKEY_LOCALE,
170
+ currency: this.config.DIGIKEY_CURRENCY,
171
+ });
172
+ const products = response.Products ?? [];
173
+ return products.map((p) => this.parseDigiKeyPart(p));
174
+ }
175
+ /**
176
+ * Get detailed product information for a specific DigiKey part number.
177
+ * @param digiKeyPartNumber - The DigiKey part number
178
+ * @returns Part details
179
+ */
180
+ async getProductDetails(digiKeyPartNumber) {
181
+ const response = await this.apiGet(`/products/v4/search/product-details?digikeyPartNumber=${encodeURIComponent(digiKeyPartNumber)}&locale=${encodeURIComponent(this.config.DIGIKEY_LOCALE)}&currency=${encodeURIComponent(this.config.DIGIKEY_CURRENCY)}`);
182
+ return this.parseDigiKeyPart(response);
183
+ }
184
+ /**
185
+ * Get pricing and availability for multiple DigiKey parts (digital BOM).
186
+ * @param partNumbers - Array of DigiKey part numbers
187
+ * @returns BOM result with parts list and total count
188
+ */
189
+ async getDigitalBom(partNumbers) {
190
+ const response = await this.apiPost('/bom/v1/bom', {
191
+ Parts: partNumbers.map((pn) => ({ DigiKeyPartNumber: pn })),
192
+ locale: this.config.DIGIKEY_LOCALE,
193
+ currency: this.config.DIGIKEY_CURRENCY,
194
+ });
195
+ const parts = (response.Parts ?? []).map((p) => this.parseDigiKeyPart(p));
196
+ const total = response.TotalCount ?? parts.length;
197
+ return { parts, total };
198
+ }
199
+ }
200
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/vendors/digikey/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type EnvConfig } from '../../config/env.js';
2
+ export interface JlcPcbLayerConfig {
3
+ layerId: number;
4
+ copperWeight: string;
5
+ thickness?: number;
6
+ }
7
+ export interface JlcPcbStencilConfig {
8
+ included: boolean;
9
+ type?: 'top' | 'bottom' | 'both';
10
+ }
11
+ export interface JlcPcbOrderRequest {
12
+ boardCount: number;
13
+ layers: number;
14
+ width: number;
15
+ height: number;
16
+ color?: string;
17
+ surfaceFinish?: string;
18
+ copperWeight?: string;
19
+ boardThickness?: number;
20
+ impedance?: boolean;
21
+ solderMask?: string;
22
+ silkscreen?: string;
23
+ stencil?: JlcPcbStencilConfig;
24
+ layerConfig?: JlcPcbLayerConfig[];
25
+ deliveryTime?: string;
26
+ pcbQty?: number;
27
+ }
28
+ export interface JlcPcbQuoteResult {
29
+ total: number;
30
+ currency: string;
31
+ breakdown: Array<{
32
+ item: string;
33
+ cost: number;
34
+ }>;
35
+ }
36
+ export interface JlcPcbOrderResult {
37
+ orderId: string;
38
+ }
39
+ export interface JlcPcbOrderStatus {
40
+ status: string;
41
+ details: unknown;
42
+ }
43
+ export interface JlcPcbCapability {
44
+ feature: string;
45
+ supported: boolean;
46
+ constraints?: string;
47
+ }
48
+ export declare class JlcpcbClient {
49
+ private config;
50
+ private logger;
51
+ private baseUrl;
52
+ constructor(config: EnvConfig);
53
+ private authHeaders;
54
+ private requestWithRetry;
55
+ /**
56
+ * Request a quotation for a PCB order from JLCPCB.
57
+ * @param request - The PCB order specification
58
+ * @returns Quote result with total cost and breakdown
59
+ */
60
+ getQuote(request: JlcPcbOrderRequest): Promise<JlcPcbQuoteResult>;
61
+ /**
62
+ * Place a PCB order with JLCPCB.
63
+ * @param request - The PCB order specification
64
+ * @returns Order result containing the order ID
65
+ */
66
+ placeOrder(request: JlcPcbOrderRequest): Promise<JlcPcbOrderResult>;
67
+ /**
68
+ * Get the current status of an existing JLCPCB order.
69
+ * @param orderId - The JLCPCB order ID
70
+ * @returns Order status and details
71
+ */
72
+ getOrderStatus(orderId: string): Promise<JlcPcbOrderStatus>;
73
+ /**
74
+ * Check JLCPCB capabilities for a given board specification.
75
+ * @param boardSpec - Board specification to check
76
+ * @returns Array of capability results
77
+ */
78
+ checkCapabilities(boardSpec: Partial<JlcPcbOrderRequest>): Promise<JlcPcbCapability[]>;
79
+ }