@1mcp/agent 0.4.0 → 0.8.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 +57 -2
- package/build/capabilities/capabilityManager.d.ts +34 -0
- package/build/capabilities/capabilityManager.d.ts.map +1 -0
- package/build/capabilities/capabilityManager.js +13 -5
- package/build/capabilities/capabilityManager.js.map +1 -0
- package/build/client.d.ts +25 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +3 -10
- package/build/client.js.map +1 -0
- package/build/clients/clientManager.d.ts +40 -0
- package/build/clients/clientManager.d.ts.map +1 -0
- package/build/clients/clientManager.js +45 -21
- package/build/clients/clientManager.js.map +1 -0
- package/build/config/configManager.d.ts +54 -0
- package/build/config/configManager.d.ts.map +1 -0
- package/build/config/configManager.js +1 -0
- package/build/config/configManager.js.map +1 -0
- package/build/config/transportConfig.d.ts +7 -0
- package/build/config/transportConfig.d.ts.map +1 -0
- package/build/config/transportConfig.js +1 -0
- package/build/config/transportConfig.js.map +1 -0
- package/build/constants.d.ts +43 -0
- package/build/constants.d.ts.map +1 -0
- package/build/constants.js +19 -4
- package/build/constants.js.map +1 -0
- package/build/handlers/notificationHandlers.d.ts +14 -0
- package/build/handlers/notificationHandlers.d.ts.map +1 -0
- package/build/handlers/notificationHandlers.js +1 -0
- package/build/handlers/notificationHandlers.js.map +1 -0
- package/build/handlers/requestHandlers.d.ts +10 -0
- package/build/handlers/requestHandlers.d.ts.map +1 -0
- package/build/handlers/requestHandlers.js +45 -30
- package/build/handlers/requestHandlers.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +6 -1
- package/build/index.js.map +1 -0
- package/build/logger/logger.d.ts +13 -0
- package/build/logger/logger.d.ts.map +1 -0
- package/build/logger/logger.js +7 -33
- package/build/logger/logger.js.map +1 -0
- package/build/middleware/loggingMiddleware.d.ts +6 -0
- package/build/middleware/loggingMiddleware.d.ts.map +1 -0
- package/build/middleware/loggingMiddleware.js +1 -0
- package/build/middleware/loggingMiddleware.js.map +1 -0
- package/build/server/expressServer.d.ts +10 -0
- package/build/server/expressServer.d.ts.map +1 -0
- package/build/server/expressServer.js +2 -11
- package/build/server/expressServer.js.map +1 -0
- package/build/server.d.ts +7 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +1 -0
- package/build/server.js.map +1 -0
- package/build/serverManager.d.ts +25 -0
- package/build/serverManager.d.ts.map +1 -0
- package/build/serverManager.js +4 -2
- package/build/serverManager.js.map +1 -0
- package/build/services/configReloadService.d.ts +37 -0
- package/build/services/configReloadService.d.ts.map +1 -0
- package/build/services/configReloadService.js +1 -0
- package/build/services/configReloadService.js.map +1 -0
- package/build/types.d.ts +129 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +1 -0
- package/build/types.js.map +1 -0
- package/build/utils/clientFiltering.d.ts +37 -0
- package/build/utils/clientFiltering.d.ts.map +1 -0
- package/build/utils/clientFiltering.js +73 -0
- package/build/utils/clientFiltering.js.map +1 -0
- package/build/utils/errorHandling.d.ts +62 -0
- package/build/utils/errorHandling.d.ts.map +1 -0
- package/build/utils/errorHandling.js +1 -0
- package/build/utils/errorHandling.js.map +1 -0
- package/build/utils/errorTypes.d.ts +25 -0
- package/build/utils/errorTypes.d.ts.map +1 -0
- package/build/utils/errorTypes.js +1 -0
- package/build/utils/errorTypes.js.map +1 -0
- package/package.json +28 -11
- package/build/config/configManager.test.js +0 -106
- package/build/logger/mcpTransport.js +0 -150
- package/build/serverManager.test.js +0 -158
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
4
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
5
|
+
import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Enhanced transport interface that includes MCP-specific properties
|
|
8
|
+
*/
|
|
9
|
+
export interface EnhancedTransport extends Transport {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Base interface for common transport properties
|
|
15
|
+
*/
|
|
16
|
+
export interface BaseTransportConfig {
|
|
17
|
+
readonly timeout?: number;
|
|
18
|
+
readonly disabled?: boolean;
|
|
19
|
+
readonly tags?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Common configuration for HTTP-based transports (HTTP and SSE)
|
|
23
|
+
*/
|
|
24
|
+
export interface HTTPBasedTransportConfig extends BaseTransportConfig {
|
|
25
|
+
readonly type: 'http' | 'sse';
|
|
26
|
+
readonly url: string;
|
|
27
|
+
readonly headers?: Record<string, string>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Stdio transport specific configuration
|
|
31
|
+
*/
|
|
32
|
+
export interface StdioTransportConfig extends BaseTransportConfig {
|
|
33
|
+
readonly type: 'stdio';
|
|
34
|
+
readonly command: string;
|
|
35
|
+
readonly args?: string[];
|
|
36
|
+
readonly stderr?: string | number;
|
|
37
|
+
readonly cwd?: string;
|
|
38
|
+
readonly env?: Record<string, string>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Zod schema for transport configuration
|
|
42
|
+
*/
|
|
43
|
+
export declare const transportConfigSchema: z.ZodObject<{
|
|
44
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "sse", "http"]>>;
|
|
45
|
+
disabled: z.ZodOptional<z.ZodBoolean>;
|
|
46
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
47
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
48
|
+
url: z.ZodOptional<z.ZodString>;
|
|
49
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
50
|
+
command: z.ZodOptional<z.ZodString>;
|
|
51
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
52
|
+
stderr: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
|
|
53
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
54
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
type?: "http" | "sse" | "stdio" | undefined;
|
|
57
|
+
url?: string | undefined;
|
|
58
|
+
headers?: Record<string, string> | undefined;
|
|
59
|
+
command?: string | undefined;
|
|
60
|
+
args?: string[] | undefined;
|
|
61
|
+
stderr?: string | number | undefined;
|
|
62
|
+
cwd?: string | undefined;
|
|
63
|
+
env?: Record<string, string> | undefined;
|
|
64
|
+
disabled?: boolean | undefined;
|
|
65
|
+
timeout?: number | undefined;
|
|
66
|
+
tags?: string[] | undefined;
|
|
67
|
+
}, {
|
|
68
|
+
type?: "http" | "sse" | "stdio" | undefined;
|
|
69
|
+
url?: string | undefined;
|
|
70
|
+
headers?: Record<string, string> | undefined;
|
|
71
|
+
command?: string | undefined;
|
|
72
|
+
args?: string[] | undefined;
|
|
73
|
+
stderr?: string | number | undefined;
|
|
74
|
+
cwd?: string | undefined;
|
|
75
|
+
env?: Record<string, string> | undefined;
|
|
76
|
+
disabled?: boolean | undefined;
|
|
77
|
+
timeout?: number | undefined;
|
|
78
|
+
tags?: string[] | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Union type for all transport configurations
|
|
82
|
+
*/
|
|
83
|
+
export type TransportConfig = HTTPBasedTransportConfig | StdioTransportConfig;
|
|
84
|
+
/**
|
|
85
|
+
* Type for MCP server parameters derived from transport config schema
|
|
86
|
+
*/
|
|
87
|
+
export type MCPServerParams = z.infer<typeof transportConfigSchema>;
|
|
88
|
+
/**
|
|
89
|
+
* Server information including tags
|
|
90
|
+
*/
|
|
91
|
+
export interface ServerInfo {
|
|
92
|
+
readonly server: Server;
|
|
93
|
+
readonly tags?: string[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Enum representing possible client connection states
|
|
97
|
+
*/
|
|
98
|
+
export declare enum ClientStatus {
|
|
99
|
+
/** Client is successfully connected */
|
|
100
|
+
Connected = "connected",
|
|
101
|
+
/** Client is disconnected */
|
|
102
|
+
Disconnected = "disconnected",
|
|
103
|
+
/** Client encountered an error */
|
|
104
|
+
Error = "error"
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Complete client information including transport, status and history
|
|
108
|
+
*/
|
|
109
|
+
export interface ClientInfo {
|
|
110
|
+
readonly name: string;
|
|
111
|
+
readonly transport: EnhancedTransport;
|
|
112
|
+
readonly client: Client;
|
|
113
|
+
readonly status: ClientStatus;
|
|
114
|
+
readonly lastError?: Error;
|
|
115
|
+
readonly lastConnected?: Date;
|
|
116
|
+
capabilities?: ServerCapabilities;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Map of client information indexed by client name
|
|
120
|
+
*/
|
|
121
|
+
export type Clients = Record<string, ClientInfo>;
|
|
122
|
+
/**
|
|
123
|
+
* Options for client operations
|
|
124
|
+
*/
|
|
125
|
+
export interface OperationOptions {
|
|
126
|
+
readonly retryCount?: number;
|
|
127
|
+
readonly retryDelay?: number;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBhC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,oBAAY,YAAY;IACtB,uCAAuC;IACvC,SAAS,cAAc;IACvB,6BAA6B;IAC7B,YAAY,iBAAiB;IAC7B,kCAAkC;IAClC,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
package/build/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4CxB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEpC,sBAAsB;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAExC,+BAA+B;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAoBH;;GAEG;AACH,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACtB,uCAAuC;IACvC,uCAAuB,CAAA;IACvB,6BAA6B;IAC7B,6CAA6B,CAAA;IAC7B,kCAAkC;IAClC,+BAAe,CAAA;AACjB,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { Clients } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Filters clients by tags
|
|
5
|
+
* @param clients Record of client instances
|
|
6
|
+
* @param tags Array of tags to filter by
|
|
7
|
+
* @returns Filtered record of client instances
|
|
8
|
+
*/
|
|
9
|
+
export declare function filterClientsByTags(clients: Clients, tags?: string[]): Clients;
|
|
10
|
+
/**
|
|
11
|
+
* Filters clients by capabilities
|
|
12
|
+
* @param clients Record of client instances
|
|
13
|
+
* @param capabilities Object containing capabilities to filter by
|
|
14
|
+
* @returns Filtered record of client instances
|
|
15
|
+
*/
|
|
16
|
+
export declare function filterClientsByCapabilities(clients: Clients, capabilities: ServerCapabilities): Clients;
|
|
17
|
+
type ClientFilter = (clients: Clients) => Clients;
|
|
18
|
+
/**
|
|
19
|
+
* Filters clients by multiple criteria
|
|
20
|
+
* @param filters Array of client filters
|
|
21
|
+
* @returns Filtered record of client instances
|
|
22
|
+
*/
|
|
23
|
+
export declare function filterClients(...filters: ClientFilter[]): ClientFilter;
|
|
24
|
+
/**
|
|
25
|
+
* Filters clients by capabilities
|
|
26
|
+
* @param requiredCapabilities Object containing capabilities to filter by
|
|
27
|
+
* @returns Filtered record of client instances
|
|
28
|
+
*/
|
|
29
|
+
export declare function byCapabilities(requiredCapabilities: ServerCapabilities): ClientFilter;
|
|
30
|
+
/**
|
|
31
|
+
* Filters clients by tags
|
|
32
|
+
* @param tags Array of tags to filter by
|
|
33
|
+
* @returns Filtered record of client instances
|
|
34
|
+
*/
|
|
35
|
+
export declare function byTags(tags?: string[]): ClientFilter;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=clientFiltering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientFiltering.d.ts","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAwBvG;AAED,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAItE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,YAAY,CAYrF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAYpD"}
|
|
@@ -27,3 +27,76 @@ export function filterClientsByTags(clients, tags) {
|
|
|
27
27
|
}
|
|
28
28
|
return Object.freeze(filteredClients);
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Filters clients by capabilities
|
|
32
|
+
* @param clients Record of client instances
|
|
33
|
+
* @param capabilities Object containing capabilities to filter by
|
|
34
|
+
* @returns Filtered record of client instances
|
|
35
|
+
*/
|
|
36
|
+
export function filterClientsByCapabilities(clients, capabilities) {
|
|
37
|
+
const filteredClients = {};
|
|
38
|
+
let matchedClients = 0;
|
|
39
|
+
for (const [name, clientInfo] of Object.entries(clients)) {
|
|
40
|
+
const clientCapabilities = clientInfo.capabilities || {};
|
|
41
|
+
const hasMatchingCapabilities = Object.keys(capabilities).every((capability) => {
|
|
42
|
+
const clientCapability = clientCapabilities[capability];
|
|
43
|
+
return clientCapability !== undefined;
|
|
44
|
+
});
|
|
45
|
+
if (hasMatchingCapabilities) {
|
|
46
|
+
filteredClients[name] = clientInfo;
|
|
47
|
+
matchedClients++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (matchedClients === 0) {
|
|
51
|
+
logger.warn(`No clients found matching capabilities: ${JSON.stringify(capabilities)}`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
logger.debug(`Found ${matchedClients} clients matching capabilities: ${JSON.stringify(capabilities)}`);
|
|
55
|
+
}
|
|
56
|
+
return Object.freeze(filteredClients);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Filters clients by multiple criteria
|
|
60
|
+
* @param filters Array of client filters
|
|
61
|
+
* @returns Filtered record of client instances
|
|
62
|
+
*/
|
|
63
|
+
export function filterClients(...filters) {
|
|
64
|
+
return (clients) => {
|
|
65
|
+
return filters.reduce((filteredClients, filter) => filter(filteredClients), clients);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Filters clients by capabilities
|
|
70
|
+
* @param requiredCapabilities Object containing capabilities to filter by
|
|
71
|
+
* @returns Filtered record of client instances
|
|
72
|
+
*/
|
|
73
|
+
export function byCapabilities(requiredCapabilities) {
|
|
74
|
+
return (clients) => {
|
|
75
|
+
return Object.entries(clients).reduce((filtered, [name, clientInfo]) => {
|
|
76
|
+
const hasCapabilities = Object.keys(requiredCapabilities).every((cap) => clientInfo.capabilities && cap in clientInfo.capabilities);
|
|
77
|
+
if (hasCapabilities) {
|
|
78
|
+
filtered[name] = clientInfo;
|
|
79
|
+
}
|
|
80
|
+
return filtered;
|
|
81
|
+
}, {});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Filters clients by tags
|
|
86
|
+
* @param tags Array of tags to filter by
|
|
87
|
+
* @returns Filtered record of client instances
|
|
88
|
+
*/
|
|
89
|
+
export function byTags(tags) {
|
|
90
|
+
return (clients) => {
|
|
91
|
+
if (!tags || tags.length === 0)
|
|
92
|
+
return clients;
|
|
93
|
+
return Object.entries(clients).reduce((filtered, [name, clientInfo]) => {
|
|
94
|
+
const hasMatchingTags = tags.every((tag) => clientInfo.transport.tags?.includes(tag));
|
|
95
|
+
if (hasMatchingTags) {
|
|
96
|
+
filtered[name] = clientInfo;
|
|
97
|
+
}
|
|
98
|
+
return filtered;
|
|
99
|
+
}, {});
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=clientFiltering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientFiltering.js","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MCPError, MCPErrorType } from './errorTypes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps a function with error handling
|
|
4
|
+
* @param fn The function to wrap
|
|
5
|
+
* @param errorMessage The error message to use if the function fails
|
|
6
|
+
* @returns The wrapped function
|
|
7
|
+
*/
|
|
8
|
+
export declare function withErrorHandling<T, Args extends any[]>(fn: (...args: Args) => Promise<T>, errorMessage: string): (...args: Args) => Promise<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Normalizes an error to an MCPError type
|
|
11
|
+
* @param error The error to normalize
|
|
12
|
+
* @param errorMessage The error message to use if the error is not an MCPError
|
|
13
|
+
* @returns The normalized error
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeError(error: unknown, errorMessage: string): MCPErrorType;
|
|
16
|
+
/**
|
|
17
|
+
* Checks if an error is a specific MCPError type
|
|
18
|
+
* @param error The error to check
|
|
19
|
+
* @param errorType The error type to check against
|
|
20
|
+
* @returns True if the error is of the specified type
|
|
21
|
+
*/
|
|
22
|
+
export declare function isMCPError<T extends MCPError>(error: unknown, errorType: new (...args: any[]) => T): error is T;
|
|
23
|
+
/**
|
|
24
|
+
* Gets the error code from an error
|
|
25
|
+
* @param error The error to get the code from
|
|
26
|
+
* @returns The error code
|
|
27
|
+
*/
|
|
28
|
+
export declare function getErrorCode(error: unknown): number;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the error message from an error
|
|
31
|
+
* @param error The error to get the message from
|
|
32
|
+
* @returns The error message
|
|
33
|
+
*/
|
|
34
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
35
|
+
/**
|
|
36
|
+
* Gets the error cause from an error
|
|
37
|
+
* @param error The error to get the cause from
|
|
38
|
+
* @returns The error cause
|
|
39
|
+
*/
|
|
40
|
+
export declare function getErrorCause(error: unknown): Error | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Formats an error for JSON-RPC response
|
|
43
|
+
* @param error The error to format
|
|
44
|
+
* @returns A formatted error object
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatErrorResponse(error: any): {
|
|
47
|
+
code: number;
|
|
48
|
+
message: string;
|
|
49
|
+
data?: any;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Extracts client name and resource name from a URI
|
|
53
|
+
* @param uri The URI to parse
|
|
54
|
+
* @param separator The separator used in the URI
|
|
55
|
+
* @returns An object with clientName and resourceName
|
|
56
|
+
* @throws InvalidRequestError if the URI is invalid
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseUri(uri: string, separator: string): {
|
|
59
|
+
clientName: string;
|
|
60
|
+
resourceName: string;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=errorHandling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandling.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandling.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAuB,MAAM,iBAAiB,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,SAAS,GAAG,EAAE,EACrD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACjC,YAAY,EAAE,MAAM,GACnB,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAkB/B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAUjF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAE/G;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAE,CAa7F;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAWrG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../../src/utils/errorHandling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class MCPError extends Error {
|
|
2
|
+
code: number;
|
|
3
|
+
data?: any;
|
|
4
|
+
constructor(message: string, code: number, data?: any);
|
|
5
|
+
}
|
|
6
|
+
export declare class ClientConnectionError extends MCPError {
|
|
7
|
+
constructor(clientName: string, cause: Error);
|
|
8
|
+
}
|
|
9
|
+
export declare class ClientNotFoundError extends MCPError {
|
|
10
|
+
constructor(clientName: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class ClientOperationError extends MCPError {
|
|
13
|
+
constructor(clientName: string, operation: string, cause: Error, context?: Record<string, unknown>);
|
|
14
|
+
}
|
|
15
|
+
export declare class ValidationError extends MCPError {
|
|
16
|
+
constructor(message: string, validationErrors: any);
|
|
17
|
+
}
|
|
18
|
+
export declare class TransportError extends MCPError {
|
|
19
|
+
constructor(transportName: string, cause: Error);
|
|
20
|
+
}
|
|
21
|
+
export declare class InvalidRequestError extends MCPError {
|
|
22
|
+
constructor(message: string, data?: any);
|
|
23
|
+
}
|
|
24
|
+
export type MCPErrorType = ClientConnectionError | ClientNotFoundError | ClientOperationError | ValidationError | TransportError | InvalidRequestError;
|
|
25
|
+
//# sourceMappingURL=errorTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorTypes.d.ts","sourceRoot":"","sources":["../../src/utils/errorTypes.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;gBAEC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;CAMtD;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAI7C;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,UAAU,EAAE,MAAM;CAI/B;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQnG;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG;CAInD;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAIhD;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;CAIxC;AAED,MAAM,MAAM,YAAY,GACpB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,eAAe,GACf,cAAc,GACd,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorTypes.js","sourceRoot":"","sources":["../../src/utils/errorTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAS;IACb,IAAI,CAAO;IAEX,YAAY,OAAe,EAAE,IAAY,EAAE,IAAU;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,UAAkB,EAAE,KAAY;QAC1C,KAAK,CAAC,+BAA+B,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjH,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,UAAkB;QAC5B,KAAK,CAAC,qBAAqB,UAAU,EAAE,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,UAAkB,EAAE,SAAiB,EAAE,KAAY,EAAE,OAAiC;QAChG,KAAK,CACH,aAAa,SAAS,qBAAqB,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,EACzE,WAAW,CAAC,qBAAqB,EACjC,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,gBAAqB;QAChD,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,aAAqB,EAAE,KAAY;QAC7C,KAAK,CAAC,uBAAuB,aAAa,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChH,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAe,EAAE,IAAU;QACrC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1mcp/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "One MCP server to aggregate them all - A unified Model Context Protocol server implementation",
|
|
5
|
-
"
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"mcp-server",
|
|
8
|
+
"mcp-client",
|
|
9
|
+
"model-context-protocol",
|
|
10
|
+
"agent",
|
|
11
|
+
"proxy",
|
|
12
|
+
"server",
|
|
13
|
+
"cli",
|
|
14
|
+
"ai",
|
|
15
|
+
"llm",
|
|
16
|
+
"model-aggregation",
|
|
17
|
+
"typescript"
|
|
18
|
+
],
|
|
19
|
+
"author": "William Xu <xuzp@1mcp.app>",
|
|
20
|
+
"homepage": "https://github.com/1mcp-app/agent",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/1mcp-app/agent/issues"
|
|
23
|
+
},
|
|
6
24
|
"license": "Apache-2.0",
|
|
7
25
|
"repository": {
|
|
8
26
|
"type": "git",
|
|
@@ -31,7 +49,7 @@
|
|
|
31
49
|
},
|
|
32
50
|
"dependencies": {
|
|
33
51
|
"@modelcontextprotocol/sdk": "^1.7.0",
|
|
34
|
-
"express": "^
|
|
52
|
+
"express": "^5.1.0",
|
|
35
53
|
"uuid": "^11.1.0",
|
|
36
54
|
"winston": "^3.17.0",
|
|
37
55
|
"winston-transport": "^4.9.0",
|
|
@@ -43,35 +61,34 @@
|
|
|
43
61
|
"@eslint/js": "^9.22.0",
|
|
44
62
|
"@testing-library/jest-dom": "^6.6.3",
|
|
45
63
|
"@types/express": "^5.0.0",
|
|
46
|
-
"@types/jest": "^29.5.14",
|
|
47
64
|
"@types/node": "^22.13.10",
|
|
48
65
|
"@types/uuid": "^10.0.0",
|
|
49
66
|
"@types/yargs": "^17.0.33",
|
|
50
67
|
"@typescript-eslint/eslint-plugin": "^8.27.0",
|
|
51
68
|
"@typescript-eslint/parser": "^8.27.0",
|
|
69
|
+
"@vitest/coverage-v8": "^1.4.0",
|
|
52
70
|
"eslint": "^9.22.0",
|
|
53
71
|
"eslint-config-prettier": "^10.1.1",
|
|
54
72
|
"eslint-plugin-prettier": "^5.2.3",
|
|
55
73
|
"globals": "^16.0.0",
|
|
56
74
|
"husky": "^9.1.7",
|
|
57
|
-
"jest": "^29.7.0",
|
|
58
75
|
"jiti": "^2.4.2",
|
|
59
76
|
"lint-staged": "^15.5.0",
|
|
60
77
|
"prettier": "^3.5.3",
|
|
61
|
-
"ts-jest": "^29.2.6",
|
|
62
78
|
"ts-node": "^10.9.2",
|
|
63
79
|
"tsc-watch": "^6.2.1",
|
|
64
|
-
"typescript": "^5.3.3"
|
|
80
|
+
"typescript": "^5.3.3",
|
|
81
|
+
"vitest": "^1.4.0"
|
|
65
82
|
},
|
|
66
83
|
"scripts": {
|
|
67
84
|
"dev": "tsc-watch --onSuccess \"node build/index.js --config ./mcp.json\"",
|
|
68
85
|
"build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"",
|
|
69
86
|
"watch": "tsc --watch",
|
|
70
|
-
"inspector": "npx @modelcontextprotocol/inspector
|
|
87
|
+
"inspector": "npx -y @modelcontextprotocol/inspector",
|
|
71
88
|
"lint": "eslint . --ext .ts",
|
|
72
89
|
"lint:fix": "eslint . --ext .ts --fix",
|
|
73
|
-
"test": "
|
|
74
|
-
"test:watch": "
|
|
75
|
-
"test:coverage": "
|
|
90
|
+
"test": "vitest run",
|
|
91
|
+
"test:watch": "vitest",
|
|
92
|
+
"test:coverage": "vitest run --coverage"
|
|
76
93
|
}
|
|
77
94
|
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
// Mock modules before importing ConfigManager
|
|
4
|
-
jest.mock('fs', () => ({
|
|
5
|
-
existsSync: jest.fn(),
|
|
6
|
-
mkdirSync: jest.fn(),
|
|
7
|
-
writeFileSync: jest.fn(),
|
|
8
|
-
readFileSync: jest.fn(),
|
|
9
|
-
watch: jest.fn(() => ({ close: jest.fn() })),
|
|
10
|
-
}));
|
|
11
|
-
const mockLogger = {
|
|
12
|
-
error: jest.fn(),
|
|
13
|
-
warn: jest.fn(),
|
|
14
|
-
info: jest.fn(),
|
|
15
|
-
debug: jest.fn(),
|
|
16
|
-
level: 'info',
|
|
17
|
-
transports: [],
|
|
18
|
-
};
|
|
19
|
-
jest.doMock('../logger/logger.js', () => ({
|
|
20
|
-
__esModule: true,
|
|
21
|
-
default: mockLogger,
|
|
22
|
-
}));
|
|
23
|
-
// Mock constants
|
|
24
|
-
jest.doMock('../constants.js', () => ({
|
|
25
|
-
__esModule: true,
|
|
26
|
-
DEFAULT_CONFIG: { mcpServers: {} },
|
|
27
|
-
getGlobalConfigPath: jest.fn(),
|
|
28
|
-
getGlobalConfigDir: jest.fn().mockReturnValue('/test'),
|
|
29
|
-
}));
|
|
30
|
-
// Import after mocks are set up
|
|
31
|
-
import { ConfigManager, ConfigChangeEvent } from './configManager.js';
|
|
32
|
-
import { DEFAULT_CONFIG } from '../constants.js';
|
|
33
|
-
describe('ConfigManager', () => {
|
|
34
|
-
const testConfigPath = '/test/config.json';
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
// Reset all mocks
|
|
37
|
-
jest.clearAllMocks();
|
|
38
|
-
// Reset singleton instance
|
|
39
|
-
ConfigManager.instance = undefined;
|
|
40
|
-
// Default mock implementations
|
|
41
|
-
fs.existsSync.mockReturnValue(true);
|
|
42
|
-
fs.readFileSync.mockReturnValue(JSON.stringify({ mcpServers: {} }));
|
|
43
|
-
});
|
|
44
|
-
describe('getInstance', () => {
|
|
45
|
-
it('should create singleton instance', () => {
|
|
46
|
-
const instance1 = ConfigManager.getInstance(testConfigPath);
|
|
47
|
-
const instance2 = ConfigManager.getInstance(testConfigPath);
|
|
48
|
-
expect(instance1).toBe(instance2);
|
|
49
|
-
});
|
|
50
|
-
it('should use provided config path', () => {
|
|
51
|
-
const instance = ConfigManager.getInstance(testConfigPath);
|
|
52
|
-
expect(instance.configFilePath).toBe(testConfigPath);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('ensureConfigExists', () => {
|
|
56
|
-
it('should create config directory and file if they do not exist', () => {
|
|
57
|
-
fs.existsSync
|
|
58
|
-
.mockReturnValueOnce(false) // Directory doesn't exist
|
|
59
|
-
.mockReturnValueOnce(false); // File doesn't exist
|
|
60
|
-
ConfigManager.getInstance(testConfigPath);
|
|
61
|
-
expect(fs.mkdirSync).toHaveBeenCalledWith(path.dirname(testConfigPath), { recursive: true });
|
|
62
|
-
expect(fs.writeFileSync).toHaveBeenCalledWith(testConfigPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe('config watching', () => {
|
|
66
|
-
it('should start and stop watching config file', () => {
|
|
67
|
-
const instance = ConfigManager.getInstance(testConfigPath);
|
|
68
|
-
instance.startWatching();
|
|
69
|
-
expect(fs.watch).toHaveBeenCalledWith(testConfigPath, expect.any(Function));
|
|
70
|
-
instance.stopWatching();
|
|
71
|
-
expect(instance['configWatcher']).toBeNull();
|
|
72
|
-
});
|
|
73
|
-
it('should reload config on file change', () => {
|
|
74
|
-
const instance = ConfigManager.getInstance(testConfigPath);
|
|
75
|
-
const mockWatcher = { close: jest.fn() };
|
|
76
|
-
let watchCallback = () => { };
|
|
77
|
-
fs.watch.mockImplementation((path, callback) => {
|
|
78
|
-
watchCallback = callback;
|
|
79
|
-
return mockWatcher;
|
|
80
|
-
});
|
|
81
|
-
instance.startWatching();
|
|
82
|
-
// Setup spy for event emission
|
|
83
|
-
const emitSpy = jest.spyOn(instance, 'emit');
|
|
84
|
-
// Mock new config data
|
|
85
|
-
const newConfig = { mcpServers: { test: { url: 'test-url' } } };
|
|
86
|
-
fs.readFileSync.mockReturnValueOnce(JSON.stringify(newConfig));
|
|
87
|
-
// Simulate file change
|
|
88
|
-
watchCallback('change', path.basename(testConfigPath));
|
|
89
|
-
expect(emitSpy).toHaveBeenCalledWith(ConfigChangeEvent.TRANSPORT_CONFIG_CHANGED, newConfig.mcpServers);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe('getTransportConfig', () => {
|
|
93
|
-
it('should return copy of transport config', () => {
|
|
94
|
-
const testConfig = {
|
|
95
|
-
mcpServers: {
|
|
96
|
-
test: { url: 'test-url' },
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
fs.readFileSync.mockReturnValueOnce(JSON.stringify(testConfig));
|
|
100
|
-
const instance = ConfigManager.getInstance(testConfigPath);
|
|
101
|
-
const config = instance.getTransportConfig();
|
|
102
|
-
expect(config).toEqual(testConfig.mcpServers);
|
|
103
|
-
expect(config).not.toBe(instance['transportConfig']); // Should be a copy
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
});
|