@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.
Files changed (81) hide show
  1. package/README.md +57 -2
  2. package/build/capabilities/capabilityManager.d.ts +34 -0
  3. package/build/capabilities/capabilityManager.d.ts.map +1 -0
  4. package/build/capabilities/capabilityManager.js +13 -5
  5. package/build/capabilities/capabilityManager.js.map +1 -0
  6. package/build/client.d.ts +25 -0
  7. package/build/client.d.ts.map +1 -0
  8. package/build/client.js +3 -10
  9. package/build/client.js.map +1 -0
  10. package/build/clients/clientManager.d.ts +40 -0
  11. package/build/clients/clientManager.d.ts.map +1 -0
  12. package/build/clients/clientManager.js +45 -21
  13. package/build/clients/clientManager.js.map +1 -0
  14. package/build/config/configManager.d.ts +54 -0
  15. package/build/config/configManager.d.ts.map +1 -0
  16. package/build/config/configManager.js +1 -0
  17. package/build/config/configManager.js.map +1 -0
  18. package/build/config/transportConfig.d.ts +7 -0
  19. package/build/config/transportConfig.d.ts.map +1 -0
  20. package/build/config/transportConfig.js +1 -0
  21. package/build/config/transportConfig.js.map +1 -0
  22. package/build/constants.d.ts +43 -0
  23. package/build/constants.d.ts.map +1 -0
  24. package/build/constants.js +19 -4
  25. package/build/constants.js.map +1 -0
  26. package/build/handlers/notificationHandlers.d.ts +14 -0
  27. package/build/handlers/notificationHandlers.d.ts.map +1 -0
  28. package/build/handlers/notificationHandlers.js +1 -0
  29. package/build/handlers/notificationHandlers.js.map +1 -0
  30. package/build/handlers/requestHandlers.d.ts +10 -0
  31. package/build/handlers/requestHandlers.d.ts.map +1 -0
  32. package/build/handlers/requestHandlers.js +45 -30
  33. package/build/handlers/requestHandlers.js.map +1 -0
  34. package/build/index.d.ts +3 -0
  35. package/build/index.d.ts.map +1 -0
  36. package/build/index.js +6 -1
  37. package/build/index.js.map +1 -0
  38. package/build/logger/logger.d.ts +13 -0
  39. package/build/logger/logger.d.ts.map +1 -0
  40. package/build/logger/logger.js +7 -33
  41. package/build/logger/logger.js.map +1 -0
  42. package/build/middleware/loggingMiddleware.d.ts +6 -0
  43. package/build/middleware/loggingMiddleware.d.ts.map +1 -0
  44. package/build/middleware/loggingMiddleware.js +1 -0
  45. package/build/middleware/loggingMiddleware.js.map +1 -0
  46. package/build/server/expressServer.d.ts +10 -0
  47. package/build/server/expressServer.d.ts.map +1 -0
  48. package/build/server/expressServer.js +2 -11
  49. package/build/server/expressServer.js.map +1 -0
  50. package/build/server.d.ts +7 -0
  51. package/build/server.d.ts.map +1 -0
  52. package/build/server.js +1 -0
  53. package/build/server.js.map +1 -0
  54. package/build/serverManager.d.ts +25 -0
  55. package/build/serverManager.d.ts.map +1 -0
  56. package/build/serverManager.js +4 -2
  57. package/build/serverManager.js.map +1 -0
  58. package/build/services/configReloadService.d.ts +37 -0
  59. package/build/services/configReloadService.d.ts.map +1 -0
  60. package/build/services/configReloadService.js +1 -0
  61. package/build/services/configReloadService.js.map +1 -0
  62. package/build/types.d.ts +129 -0
  63. package/build/types.d.ts.map +1 -0
  64. package/build/types.js +1 -0
  65. package/build/types.js.map +1 -0
  66. package/build/utils/clientFiltering.d.ts +37 -0
  67. package/build/utils/clientFiltering.d.ts.map +1 -0
  68. package/build/utils/clientFiltering.js +73 -0
  69. package/build/utils/clientFiltering.js.map +1 -0
  70. package/build/utils/errorHandling.d.ts +62 -0
  71. package/build/utils/errorHandling.d.ts.map +1 -0
  72. package/build/utils/errorHandling.js +1 -0
  73. package/build/utils/errorHandling.js.map +1 -0
  74. package/build/utils/errorTypes.d.ts +25 -0
  75. package/build/utils/errorTypes.d.ts.map +1 -0
  76. package/build/utils/errorTypes.js +1 -0
  77. package/build/utils/errorTypes.js.map +1 -0
  78. package/package.json +28 -11
  79. package/build/config/configManager.test.js +0 -106
  80. package/build/logger/mcpTransport.js +0 -150
  81. package/build/serverManager.test.js +0 -158
@@ -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
@@ -29,3 +29,4 @@ export var ClientStatus;
29
29
  /** Client encountered an error */
30
30
  ClientStatus["Error"] = "error";
31
31
  })(ClientStatus || (ClientStatus = {}));
32
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -117,3 +117,4 @@ export function parseUri(uri, separator) {
117
117
  resourceName: parts[1],
118
118
  };
119
119
  }
120
+ //# sourceMappingURL=errorHandling.js.map
@@ -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"}
@@ -45,3 +45,4 @@ export class InvalidRequestError extends MCPError {
45
45
  this.name = 'InvalidRequestError';
46
46
  }
47
47
  }
48
+ //# sourceMappingURL=errorTypes.js.map
@@ -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.4.0",
3
+ "version": "0.8.0",
4
4
  "description": "One MCP server to aggregate them all - A unified Model Context Protocol server implementation",
5
- "homepage": "https://1mcp.app",
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": "^4.21.2",
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 build/index.js",
87
+ "inspector": "npx -y @modelcontextprotocol/inspector",
71
88
  "lint": "eslint . --ext .ts",
72
89
  "lint:fix": "eslint . --ext .ts --fix",
73
- "test": "jest",
74
- "test:watch": "jest --watch",
75
- "test:coverage": "jest --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
- });