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.
- package/README.md +304 -0
- package/dist/bridge/client.d.ts +16 -0
- package/dist/bridge/client.js +48 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/extension.d.ts +26 -0
- package/dist/bridge/extension.js +556 -0
- package/dist/bridge/extension.js.map +1 -0
- package/dist/bridge/manager.d.ts +37 -0
- package/dist/bridge/manager.js +225 -0
- package/dist/bridge/manager.js.map +1 -0
- package/dist/bridge/protocol.d.ts +68 -0
- package/dist/bridge/protocol.js +56 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/types.d.ts +52 -0
- package/dist/bridge/types.js +19 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/config/env.d.ts +98 -0
- package/dist/config/env.js +103 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/feature-flags.d.ts +16 -0
- package/dist/config/feature-flags.js +17 -0
- package/dist/config/feature-flags.js.map +1 -0
- package/dist/config/profiles.d.ts +10 -0
- package/dist/config/profiles.js +45 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +123 -0
- package/dist/schemas/common.js +79 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/server/errors.d.ts +3 -0
- package/dist/server/errors.js +59 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/factory.d.ts +17 -0
- package/dist/server/factory.js +60 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/server/transports/http.d.ts +10 -0
- package/dist/server/transports/http.js +54 -0
- package/dist/server/transports/http.js.map +1 -0
- package/dist/storage/database.d.ts +19 -0
- package/dist/storage/database.js +136 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/types.d.ts +26 -0
- package/dist/storage/types.js +9 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/L0_diagnostics.d.ts +6 -0
- package/dist/tools/L0_diagnostics.js +297 -0
- package/dist/tools/L0_diagnostics.js.map +1 -0
- package/dist/tools/L1_board.d.ts +6 -0
- package/dist/tools/L1_board.js +182 -0
- package/dist/tools/L1_board.js.map +1 -0
- package/dist/tools/L1_bom.d.ts +6 -0
- package/dist/tools/L1_bom.js +267 -0
- package/dist/tools/L1_bom.js.map +1 -0
- package/dist/tools/L1_drc_erc.d.ts +6 -0
- package/dist/tools/L1_drc_erc.js +235 -0
- package/dist/tools/L1_drc_erc.js.map +1 -0
- package/dist/tools/L1_export.d.ts +6 -0
- package/dist/tools/L1_export.js +214 -0
- package/dist/tools/L1_export.js.map +1 -0
- package/dist/tools/L1_schematic.d.ts +6 -0
- package/dist/tools/L1_schematic.js +182 -0
- package/dist/tools/L1_schematic.js.map +1 -0
- package/dist/tools/registry.d.ts +21 -0
- package/dist/tools/registry.js +55 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +53 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.js +54 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/redaction.d.ts +2 -0
- package/dist/utils/redaction.js +56 -0
- package/dist/utils/redaction.js.map +1 -0
- package/dist/vendors/digikey/client.d.ts +49 -0
- package/dist/vendors/digikey/client.js +200 -0
- package/dist/vendors/digikey/client.js.map +1 -0
- package/dist/vendors/jlcpcb/client.d.ts +79 -0
- package/dist/vendors/jlcpcb/client.js +156 -0
- package/dist/vendors/jlcpcb/client.js.map +1 -0
- package/dist/vendors/lcsc/client.d.ts +57 -0
- package/dist/vendors/lcsc/client.js +140 -0
- package/dist/vendors/lcsc/client.js.map +1 -0
- package/dist/vendors/mouser/client.d.ts +46 -0
- package/dist/vendors/mouser/client.js +141 -0
- package/dist/vendors/mouser/client.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
|
|
@@ -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,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)}¤cy=${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
|
+
}
|