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,16 @@
1
+ import { type EnvConfig } from './env.js';
2
+ export interface FeatureFlags {
3
+ mcpTasksEnabled: boolean;
4
+ mcpAppsEnabled: boolean;
5
+ mcpV2Experimental: boolean;
6
+ jlcpcbOrderingEnabled: boolean;
7
+ jlcsearchEnabled: boolean;
8
+ mouserEnabled: boolean;
9
+ digikeyEnabled: boolean;
10
+ oauthEnabled: boolean;
11
+ otelEnabled: boolean;
12
+ aiEnabled: boolean;
13
+ devBridge: boolean;
14
+ bridgeRawExecEnabled: boolean;
15
+ }
16
+ export declare function loadFeatureFlags(config: EnvConfig): FeatureFlags;
@@ -0,0 +1,17 @@
1
+ export function loadFeatureFlags(config) {
2
+ return {
3
+ mcpTasksEnabled: config.MCP_TASKS_ENABLED,
4
+ mcpAppsEnabled: config.MCP_APPS_ENABLED,
5
+ mcpV2Experimental: config.MCP_V2_EXPERIMENTAL,
6
+ jlcpcbOrderingEnabled: config.JLCPCB_ENABLE_ORDERING,
7
+ jlcsearchEnabled: config.JLCSEARCH_ENABLED,
8
+ mouserEnabled: config.MOUSER_ENABLED,
9
+ digikeyEnabled: config.DIGIKEY_ENABLED,
10
+ oauthEnabled: config.OAUTH_ENABLED,
11
+ otelEnabled: config.OTEL_ENABLED,
12
+ aiEnabled: config.AI_PROVIDER !== 'none',
13
+ devBridge: config.EASYEDA_DEV_BRIDGE,
14
+ bridgeRawExecEnabled: config.BRIDGE_RAW_EXEC_ENABLED,
15
+ };
16
+ }
17
+ //# sourceMappingURL=feature-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../src/config/feature-flags.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,iBAAiB;QACzC,cAAc,EAAE,MAAM,CAAC,gBAAgB;QACvC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB;QAC7C,qBAAqB,EAAE,MAAM,CAAC,sBAAsB;QACpD,gBAAgB,EAAE,MAAM,CAAC,iBAAiB;QAC1C,aAAa,EAAE,MAAM,CAAC,cAAc;QACpC,cAAc,EAAE,MAAM,CAAC,eAAe;QACtC,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,SAAS,EAAE,MAAM,CAAC,WAAW,KAAK,MAAM;QACxC,SAAS,EAAE,MAAM,CAAC,kBAAkB;QACpC,oBAAoB,EAAE,MAAM,CAAC,uBAAuB;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type ToolProfile = 'core' | 'pro' | 'full' | 'dev' | 'experimental';
2
+ export interface ProfileDefinition {
3
+ name: ToolProfile;
4
+ label: string;
5
+ description: string;
6
+ approxToolCount: string;
7
+ isDefault: boolean;
8
+ }
9
+ export declare const PROFILE_DEFINITIONS: Record<ToolProfile, ProfileDefinition>;
10
+ export declare function getEnabledProfiles(active: ToolProfile): ToolProfile[];
@@ -0,0 +1,45 @@
1
+ export const PROFILE_DEFINITIONS = {
2
+ core: {
3
+ name: 'core',
4
+ label: 'Core',
5
+ description: 'High-confidence MVP tools: inspect, export, BOM, DRC/ERC, LCSC, snapshots',
6
+ approxToolCount: '35–50',
7
+ isDefault: true,
8
+ },
9
+ pro: {
10
+ name: 'pro',
11
+ label: 'Pro',
12
+ description: 'Workflows: manufacturing pack, sourcing, AI reviews, placement helpers',
13
+ approxToolCount: '80–120',
14
+ isDefault: false,
15
+ },
16
+ full: {
17
+ name: 'full',
18
+ label: 'Full',
19
+ description: 'All validated atomic EasyEDA wrappers',
20
+ approxToolCount: '200+ when validated',
21
+ isDefault: false,
22
+ },
23
+ dev: {
24
+ name: 'dev',
25
+ label: 'Dev',
26
+ description: 'Diagnostics, method probes, raw bridge calls',
27
+ approxToolCount: 'Variable',
28
+ isDefault: false,
29
+ },
30
+ experimental: {
31
+ name: 'experimental',
32
+ label: 'Experimental',
33
+ description: 'MCP Apps, Tasks, simulation, autorouter, AI action plans',
34
+ approxToolCount: 'Variable',
35
+ isDefault: false,
36
+ },
37
+ };
38
+ export function getEnabledProfiles(active) {
39
+ const order = ['core', 'pro', 'full', 'dev', 'experimental'];
40
+ const idx = order.indexOf(active);
41
+ if (idx === -1)
42
+ return ['core'];
43
+ return order.slice(0, idx + 1);
44
+ }
45
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,mBAAmB,GAA2C;IACzE,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,2EAA2E;QACxF,eAAe,EAAE,OAAO;QACxB,SAAS,EAAE,IAAI;KAChB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,wEAAwE;QACrF,eAAe,EAAE,QAAQ;QACzB,SAAS,EAAE,KAAK;KACjB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,uCAAuC;QACpD,eAAe,EAAE,qBAAqB;QACtC,SAAS,EAAE,KAAK;KACjB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,8CAA8C;QAC3D,eAAe,EAAE,UAAU;QAC3B,SAAS,EAAE,KAAK;KACjB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,0DAA0D;QACvE,eAAe,EAAE,UAAU;QAC3B,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,KAAK,GAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ import { config as loadDotEnv } from 'dotenv';
3
+ loadDotEnv({ quiet: true });
4
+ import { loadEnvConfig } from './config/env.js';
5
+ import { createServer } from './server/factory.js';
6
+ import { registerDiagnostics } from './tools/L0_diagnostics.js';
7
+ import { registerSchematicTools } from './tools/L1_schematic.js';
8
+ import { registerBomTools } from './tools/L1_bom.js';
9
+ import { registerDrcErcTools } from './tools/L1_drc_erc.js';
10
+ import { registerBoardTools } from './tools/L1_board.js';
11
+ import { registerExportTools } from './tools/L1_export.js';
12
+ import { getLogger } from './utils/logger.js';
13
+ import { BridgeManager } from './bridge/manager.js';
14
+ import { createHttpTransport } from './server/transports/http.js';
15
+ async function main() {
16
+ const envConfig = loadEnvConfig();
17
+ const { server, registry, transport, httpTransport, context, storage: _storage, shutdown, } = await createServer(envConfig);
18
+ registerDiagnostics(registry, envConfig);
19
+ registerSchematicTools(registry, envConfig);
20
+ registerBomTools(registry, envConfig);
21
+ registerDrcErcTools(registry, envConfig);
22
+ registerBoardTools(registry, envConfig);
23
+ registerExportTools(registry, envConfig);
24
+ const logger = getLogger();
25
+ registry.registerAllOnServer(server, context);
26
+ const bridgeManager = new BridgeManager(envConfig);
27
+ bridgeManager.on('connected', (hello) => {
28
+ logger.info({ bridgeVersion: hello.bridgeVersion }, 'bridge connected');
29
+ context.bridge.call = async (method, params, opts) => {
30
+ return bridgeManager.call(method, params, opts);
31
+ };
32
+ });
33
+ bridgeManager.on('error', (err) => {
34
+ logger.error({ err }, 'bridge error');
35
+ });
36
+ process.on('SIGINT', async () => {
37
+ logger.info('received SIGINT');
38
+ bridgeManager.disconnect('SIGINT');
39
+ if (httpTransport)
40
+ await httpTransport.close();
41
+ await shutdown();
42
+ process.exit(0);
43
+ });
44
+ process.on('SIGTERM', async () => {
45
+ logger.info('received SIGTERM');
46
+ bridgeManager.disconnect('SIGTERM');
47
+ if (httpTransport)
48
+ await httpTransport.close();
49
+ await shutdown();
50
+ process.exit(0);
51
+ });
52
+ process.on('uncaughtException', (err) => {
53
+ logger.fatal({ err }, 'uncaught exception');
54
+ process.exit(1);
55
+ });
56
+ process.on('unhandledRejection', (reason) => {
57
+ logger.error({ reason }, 'unhandled rejection');
58
+ });
59
+ if (envConfig.TRANSPORT === 'stdio') {
60
+ logger.info('starting server in stdio mode');
61
+ await server.connect(transport);
62
+ }
63
+ else {
64
+ logger.info({ host: envConfig.HTTP_HOST, port: envConfig.HTTP_PORT }, 'starting HTTP transport');
65
+ const http = createHttpTransport(envConfig);
66
+ await server.connect(http.transport);
67
+ await http.start();
68
+ const result = { ...httpTransport, ...http };
69
+ result.shutdown = shutdown;
70
+ }
71
+ }
72
+ main().catch((err) => {
73
+ console.error('Fatal startup error:', err);
74
+ process.exit(1);
75
+ });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { z } from 'zod';
2
+ export declare const PaginationInput: z.ZodObject<{
3
+ limit: z.ZodDefault<z.ZodNumber>;
4
+ offset: z.ZodDefault<z.ZodNumber>;
5
+ }, z.core.$strip>;
6
+ export declare const PaginationOutput: z.ZodObject<{
7
+ total: z.ZodNumber;
8
+ has_more: z.ZodBoolean;
9
+ }, z.core.$strip>;
10
+ export declare const ConfirmationInput: z.ZodObject<{
11
+ confirm: z.ZodDefault<z.ZodBoolean>;
12
+ confirmation_text: z.ZodOptional<z.ZodString>;
13
+ dry_run: z.ZodDefault<z.ZodBoolean>;
14
+ }, z.core.$strip>;
15
+ export declare const ErrorCode: z.ZodEnum<{
16
+ EASYEDA_API_ERROR: "EASYEDA_API_ERROR";
17
+ CONFIG_INVALID: "CONFIG_INVALID";
18
+ BRIDGE_NOT_CONNECTED: "BRIDGE_NOT_CONNECTED";
19
+ BRIDGE_TIMEOUT: "BRIDGE_TIMEOUT";
20
+ BRIDGE_METHOD_NOT_AVAILABLE: "BRIDGE_METHOD_NOT_AVAILABLE";
21
+ SCHEMA_VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED";
22
+ USER_CONFIRMATION_REQUIRED: "USER_CONFIRMATION_REQUIRED";
23
+ FEATURE_DISABLED: "FEATURE_DISABLED";
24
+ PROFILE_NOT_ENABLED: "PROFILE_NOT_ENABLED";
25
+ CREDENTIALS_MISSING: "CREDENTIALS_MISSING";
26
+ VENDOR_API_UNAVAILABLE: "VENDOR_API_UNAVAILABLE";
27
+ RATE_LIMITED: "RATE_LIMITED";
28
+ ARTIFACT_EXPORT_FAILED: "ARTIFACT_EXPORT_FAILED";
29
+ SNAPSHOT_FAILED: "SNAPSHOT_FAILED";
30
+ AI_PROVIDER_DISABLED: "AI_PROVIDER_DISABLED";
31
+ AI_RESPONSE_INVALID: "AI_RESPONSE_INVALID";
32
+ NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
33
+ INTERNAL_ERROR: "INTERNAL_ERROR";
34
+ }>;
35
+ export declare const ActionableError: z.ZodObject<{
36
+ code: z.ZodEnum<{
37
+ EASYEDA_API_ERROR: "EASYEDA_API_ERROR";
38
+ CONFIG_INVALID: "CONFIG_INVALID";
39
+ BRIDGE_NOT_CONNECTED: "BRIDGE_NOT_CONNECTED";
40
+ BRIDGE_TIMEOUT: "BRIDGE_TIMEOUT";
41
+ BRIDGE_METHOD_NOT_AVAILABLE: "BRIDGE_METHOD_NOT_AVAILABLE";
42
+ SCHEMA_VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED";
43
+ USER_CONFIRMATION_REQUIRED: "USER_CONFIRMATION_REQUIRED";
44
+ FEATURE_DISABLED: "FEATURE_DISABLED";
45
+ PROFILE_NOT_ENABLED: "PROFILE_NOT_ENABLED";
46
+ CREDENTIALS_MISSING: "CREDENTIALS_MISSING";
47
+ VENDOR_API_UNAVAILABLE: "VENDOR_API_UNAVAILABLE";
48
+ RATE_LIMITED: "RATE_LIMITED";
49
+ ARTIFACT_EXPORT_FAILED: "ARTIFACT_EXPORT_FAILED";
50
+ SNAPSHOT_FAILED: "SNAPSHOT_FAILED";
51
+ AI_PROVIDER_DISABLED: "AI_PROVIDER_DISABLED";
52
+ AI_RESPONSE_INVALID: "AI_RESPONSE_INVALID";
53
+ NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
54
+ INTERNAL_ERROR: "INTERNAL_ERROR";
55
+ }>;
56
+ message: z.ZodString;
57
+ suggestion: z.ZodString;
58
+ retryable: z.ZodBoolean;
59
+ details: z.ZodOptional<z.ZodUnknown>;
60
+ correlation_id: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip>;
62
+ export type EasyEdaMcpErrorCode = z.infer<typeof ErrorCode>;
63
+ export declare class EasyEdaMcpError extends Error {
64
+ readonly code: EasyEdaMcpErrorCode;
65
+ readonly suggestion: string;
66
+ readonly retryable: boolean;
67
+ readonly details: unknown;
68
+ readonly correlation_id: string | undefined;
69
+ constructor(opts: {
70
+ code: EasyEdaMcpErrorCode;
71
+ message: string;
72
+ suggestion: string;
73
+ retryable: boolean;
74
+ details?: unknown;
75
+ correlation_id?: string;
76
+ });
77
+ }
78
+ export declare const ToolSource: z.ZodEnum<{
79
+ "official-docs": "official-docs";
80
+ "pro-api-types": "pro-api-types";
81
+ "runtime-probe": "runtime-probe";
82
+ "official-skill": "official-skill";
83
+ "source-format": "source-format";
84
+ "vendor-api-docs": "vendor-api-docs";
85
+ inferred: "inferred";
86
+ }>;
87
+ export type ToolSource = z.infer<typeof ToolSource>;
88
+ export declare const ToolEvidenceMeta: z.ZodObject<{
89
+ profile: z.ZodEnum<{
90
+ core: "core";
91
+ pro: "pro";
92
+ full: "full";
93
+ dev: "dev";
94
+ experimental: "experimental";
95
+ }>;
96
+ status: z.ZodEnum<{
97
+ experimental: "experimental";
98
+ deprecated: "deprecated";
99
+ implemented: "implemented";
100
+ beta: "beta";
101
+ planned: "planned";
102
+ }>;
103
+ evidence: z.ZodArray<z.ZodEnum<{
104
+ "official-docs": "official-docs";
105
+ "pro-api-types": "pro-api-types";
106
+ "runtime-probe": "runtime-probe";
107
+ "official-skill": "official-skill";
108
+ "source-format": "source-format";
109
+ "vendor-api-docs": "vendor-api-docs";
110
+ inferred: "inferred";
111
+ }>>;
112
+ risk: z.ZodEnum<{
113
+ low: "low";
114
+ medium: "medium";
115
+ high: "high";
116
+ }>;
117
+ requiresBridge: z.ZodBoolean;
118
+ requiresNetwork: z.ZodBoolean;
119
+ requiresCredentials: z.ZodBoolean;
120
+ destructive: z.ZodBoolean;
121
+ snapshotRecommended: z.ZodBoolean;
122
+ }, z.core.$strip>;
123
+ export type ToolEvidenceMetaType = z.infer<typeof ToolEvidenceMeta>;
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ export const PaginationInput = z.object({
3
+ limit: z.number().int().min(1).max(500).default(100),
4
+ offset: z.number().int().min(0).default(0),
5
+ });
6
+ export const PaginationOutput = z.object({
7
+ total: z.number().int().nonnegative(),
8
+ has_more: z.boolean(),
9
+ });
10
+ export const ConfirmationInput = z.object({
11
+ confirm: z.boolean().default(false),
12
+ confirmation_text: z.string().optional(),
13
+ dry_run: z.boolean().default(true),
14
+ });
15
+ export const ErrorCode = z.enum([
16
+ 'CONFIG_INVALID',
17
+ 'BRIDGE_NOT_CONNECTED',
18
+ 'BRIDGE_TIMEOUT',
19
+ 'BRIDGE_METHOD_NOT_AVAILABLE',
20
+ 'EASYEDA_API_ERROR',
21
+ 'SCHEMA_VALIDATION_FAILED',
22
+ 'USER_CONFIRMATION_REQUIRED',
23
+ 'FEATURE_DISABLED',
24
+ 'PROFILE_NOT_ENABLED',
25
+ 'CREDENTIALS_MISSING',
26
+ 'VENDOR_API_UNAVAILABLE',
27
+ 'RATE_LIMITED',
28
+ 'ARTIFACT_EXPORT_FAILED',
29
+ 'SNAPSHOT_FAILED',
30
+ 'AI_PROVIDER_DISABLED',
31
+ 'AI_RESPONSE_INVALID',
32
+ 'NOT_IMPLEMENTED',
33
+ 'INTERNAL_ERROR',
34
+ ]);
35
+ export const ActionableError = z.object({
36
+ code: ErrorCode,
37
+ message: z.string(),
38
+ suggestion: z.string(),
39
+ retryable: z.boolean(),
40
+ details: z.unknown().optional(),
41
+ correlation_id: z.string().optional(),
42
+ });
43
+ export class EasyEdaMcpError extends Error {
44
+ code;
45
+ suggestion;
46
+ retryable;
47
+ details;
48
+ correlation_id;
49
+ constructor(opts) {
50
+ super(opts.message);
51
+ this.name = 'EasyEdaMcpError';
52
+ this.code = opts.code;
53
+ this.suggestion = opts.suggestion;
54
+ this.retryable = opts.retryable;
55
+ this.details = opts.details;
56
+ this.correlation_id = opts.correlation_id;
57
+ }
58
+ }
59
+ export const ToolSource = z.enum([
60
+ 'official-docs',
61
+ 'pro-api-types',
62
+ 'runtime-probe',
63
+ 'official-skill',
64
+ 'source-format',
65
+ 'vendor-api-docs',
66
+ 'inferred',
67
+ ]);
68
+ export const ToolEvidenceMeta = z.object({
69
+ profile: z.enum(['core', 'pro', 'full', 'dev', 'experimental']),
70
+ status: z.enum(['implemented', 'beta', 'experimental', 'planned', 'deprecated']),
71
+ evidence: z.array(ToolSource),
72
+ risk: z.enum(['low', 'medium', 'high']),
73
+ requiresBridge: z.boolean(),
74
+ requiresNetwork: z.boolean(),
75
+ requiresCredentials: z.boolean(),
76
+ destructive: z.boolean(),
77
+ snapshotRecommended: z.boolean(),
78
+ });
79
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type EasyEdaMcpErrorCode } from '../schemas/common.js';
2
+ import { McpError } from '@modelcontextprotocol/sdk/types.js';
3
+ export declare function toMcpError(code: EasyEdaMcpErrorCode, message: string, suggestion: string): McpError;
@@ -0,0 +1,59 @@
1
+ import { McpError } from '@modelcontextprotocol/sdk/types.js';
2
+ export function toMcpError(code, message, suggestion) {
3
+ const mcpCode = mapToMcpCode(code);
4
+ const errorData = {
5
+ code,
6
+ message,
7
+ suggestion,
8
+ retryable: isRetryable(code),
9
+ };
10
+ return new McpError(mcpCode, JSON.stringify(errorData));
11
+ }
12
+ function mapToMcpCode(code) {
13
+ switch (code) {
14
+ case 'CONFIG_INVALID':
15
+ return -32600;
16
+ case 'BRIDGE_NOT_CONNECTED':
17
+ case 'BRIDGE_TIMEOUT':
18
+ return -32000;
19
+ case 'BRIDGE_METHOD_NOT_AVAILABLE':
20
+ return -32601;
21
+ case 'SCHEMA_VALIDATION_FAILED':
22
+ return -32602;
23
+ case 'USER_CONFIRMATION_REQUIRED':
24
+ return -32001;
25
+ case 'FEATURE_DISABLED':
26
+ case 'PROFILE_NOT_ENABLED':
27
+ return -32002;
28
+ case 'CREDENTIALS_MISSING':
29
+ return -32003;
30
+ case 'VENDOR_API_UNAVAILABLE':
31
+ return -32004;
32
+ case 'RATE_LIMITED':
33
+ return -32005;
34
+ case 'EASYEDA_API_ERROR':
35
+ case 'ARTIFACT_EXPORT_FAILED':
36
+ case 'SNAPSHOT_FAILED':
37
+ return -32006;
38
+ case 'AI_PROVIDER_DISABLED':
39
+ case 'AI_RESPONSE_INVALID':
40
+ return -32007;
41
+ case 'NOT_IMPLEMENTED':
42
+ return -32604;
43
+ case 'INTERNAL_ERROR':
44
+ default:
45
+ return -32603;
46
+ }
47
+ }
48
+ function isRetryable(code) {
49
+ switch (code) {
50
+ case 'BRIDGE_TIMEOUT':
51
+ case 'VENDOR_API_UNAVAILABLE':
52
+ case 'RATE_LIMITED':
53
+ case 'EASYEDA_API_ERROR':
54
+ return true;
55
+ default:
56
+ return false;
57
+ }
58
+ }
59
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAkB,MAAM,oCAAoC,CAAC;AAE9E,MAAM,UAAU,UAAU,CACxB,IAAyB,EACzB,OAAe,EACf,UAAkB;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,OAAO;QACP,UAAU;QACV,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;KAC7B,CAAC;IAEF,OAAO,IAAI,QAAQ,CAAC,OAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,YAAY,CAAC,IAAyB;IAC7C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB;YACnB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,gBAAgB;YACnB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,6BAA6B;YAChC,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,0BAA0B;YAC7B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,4BAA4B;YAC/B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,kBAAkB,CAAC;QACxB,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,wBAAwB;YAC3B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,mBAAmB,CAAC;QACzB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,iBAAiB;YACpB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,iBAAiB;YACpB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,gBAAgB,CAAC;QACtB;YACE,OAAO,CAAC,KAAK,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAyB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB,CAAC;QACtB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,cAAc,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { type EnvConfig } from '../config/env.js';
4
+ import { ToolRegistry } from '../tools/registry.js';
5
+ import { type ToolContext } from '../tools/types.js';
6
+ import { Storage } from '../storage/index.js';
7
+ import { type HttpTransportInstance } from './transports/http.js';
8
+ export interface McpServerInstance {
9
+ server: Server;
10
+ registry: ToolRegistry;
11
+ transport: StdioServerTransport;
12
+ httpTransport?: HttpTransportInstance;
13
+ context: ToolContext;
14
+ storage?: Storage;
15
+ shutdown: () => Promise<void>;
16
+ }
17
+ export declare function createServer(config: EnvConfig): Promise<McpServerInstance>;
@@ -0,0 +1,60 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ import { createLogger } from '../utils/logger.js';
5
+ import { ToolRegistry } from '../tools/registry.js';
6
+ import { redactObject } from '../utils/redaction.js';
7
+ import { loadFeatureFlags } from '../config/feature-flags.js';
8
+ import { Storage } from '../storage/index.js';
9
+ export async function createServer(config) {
10
+ const logger = createLogger(config);
11
+ const flags = loadFeatureFlags(config);
12
+ logger.info({
13
+ profile: config.TOOL_PROFILE,
14
+ transport: config.TRANSPORT,
15
+ nodeVersion: process.version,
16
+ flags: redactObject(flags),
17
+ }, 'server initializing');
18
+ const server = new Server({
19
+ name: 'easyeda-mcp-pro',
20
+ version: '0.2.0',
21
+ }, {
22
+ capabilities: {
23
+ tools: {},
24
+ resources: {},
25
+ prompts: {},
26
+ ...(flags.mcpTasksEnabled ? {} : undefined),
27
+ },
28
+ });
29
+ const registry = new ToolRegistry();
30
+ registry.setProfile(config.TOOL_PROFILE);
31
+ const context = {
32
+ profile: config.TOOL_PROFILE,
33
+ bridge: {
34
+ call: async (method, _params, _opts) => {
35
+ logger.info({ method }, 'bridge call');
36
+ throw new Error(`Bridge not connected: ${method}`);
37
+ },
38
+ },
39
+ config: {
40
+ bridgeTimeoutMs: config.BRIDGE_TIMEOUT_MS,
41
+ },
42
+ };
43
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
44
+ const tools = registry.getToolDefinitions();
45
+ return { tools };
46
+ });
47
+ server.onerror = (error) => {
48
+ logger.error({ err: error }, 'server error');
49
+ };
50
+ const storage = new Storage(config);
51
+ storage.initialize();
52
+ const transport = new StdioServerTransport();
53
+ const shutdown = async () => {
54
+ logger.info('server shutting down');
55
+ storage.close();
56
+ await server.close();
57
+ };
58
+ return { server, registry, transport, context, storage, shutdown };
59
+ }
60
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/server/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Express } from 'express';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ import { type EnvConfig } from '../../config/env.js';
4
+ export interface HttpTransportInstance {
5
+ app: Express;
6
+ transport: StreamableHTTPServerTransport;
7
+ start: () => Promise<void>;
8
+ close: () => Promise<void>;
9
+ }
10
+ export declare function createHttpTransport(config: EnvConfig): HttpTransportInstance;
@@ -0,0 +1,54 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { getLogger } from '../../utils/logger.js';
5
+ export function createHttpTransport(config) {
6
+ const logger = getLogger();
7
+ const transport = new StreamableHTTPServerTransport({
8
+ sessionIdGenerator: () => randomUUID(),
9
+ });
10
+ const app = createMcpExpressApp({ host: config.HTTP_HOST });
11
+ if (config.CORS_ORIGIN) {
12
+ app.use((req, res, next) => {
13
+ res.setHeader('Access-Control-Allow-Origin', config.CORS_ORIGIN);
14
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
15
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
16
+ if (req.method === 'OPTIONS') {
17
+ res.status(204).end();
18
+ return;
19
+ }
20
+ next();
21
+ });
22
+ }
23
+ app.post('/mcp', (req, res) => {
24
+ transport.handleRequest(req, res, req.body);
25
+ });
26
+ app.get('/mcp', (req, res) => {
27
+ transport.handleRequest(req, res);
28
+ });
29
+ app.get('/healthz', (_req, res) => {
30
+ res.json({ status: 'ok', version: '0.2.0' });
31
+ });
32
+ app.get('/readyz', (_req, res) => {
33
+ res.json({ status: 'ok', uptime: process.uptime() });
34
+ });
35
+ let server;
36
+ const start = async () => {
37
+ return new Promise((resolve) => {
38
+ server = app.listen(config.HTTP_PORT, config.HTTP_HOST, () => {
39
+ logger.info({ host: config.HTTP_HOST, port: config.HTTP_PORT }, 'HTTP transport listening');
40
+ resolve();
41
+ });
42
+ });
43
+ };
44
+ const close = async () => {
45
+ logger.info('HTTP transport closing');
46
+ await transport.close();
47
+ const s = server;
48
+ if (s) {
49
+ await new Promise((resolve) => s.close(() => resolve()));
50
+ }
51
+ };
52
+ return { app, transport, start, close };
53
+ }
54
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/server/transports/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type EnvConfig } from '../config/env.js';
2
+ import { type ProjectCache, type ArtifactRecord } from './types.js';
3
+ export declare class Storage {
4
+ private db;
5
+ private config;
6
+ private initialized;
7
+ constructor(config: EnvConfig);
8
+ initialize(): void;
9
+ cacheGet(key: string): string | null;
10
+ cacheSet(key: string, value: string, ttlSec?: number): void;
11
+ cacheDelete(key: string): void;
12
+ cacheClear(): void;
13
+ getProjectCache(hash: string): ProjectCache | null;
14
+ upsertProjectCache(cache: ProjectCache): void;
15
+ insertArtifact(artifact: ArtifactRecord): void;
16
+ getArtifacts(projectHash: string, type?: string): ArtifactRecord[];
17
+ vacuum(): void;
18
+ close(): void;
19
+ }