@airmcp-dev/gateway 0.1.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 (54) hide show
  1. package/LICENSE +17 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +14 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/proxy/index.d.ts +5 -0
  7. package/dist/proxy/index.d.ts.map +1 -0
  8. package/dist/proxy/index.js +7 -0
  9. package/dist/proxy/index.js.map +1 -0
  10. package/dist/proxy/mcp-proxy.d.ts +53 -0
  11. package/dist/proxy/mcp-proxy.d.ts.map +1 -0
  12. package/dist/proxy/mcp-proxy.js +131 -0
  13. package/dist/proxy/mcp-proxy.js.map +1 -0
  14. package/dist/proxy/protocol-adapter.d.ts +28 -0
  15. package/dist/proxy/protocol-adapter.d.ts.map +1 -0
  16. package/dist/proxy/protocol-adapter.js +56 -0
  17. package/dist/proxy/protocol-adapter.js.map +1 -0
  18. package/dist/proxy/session-pool.d.ts +39 -0
  19. package/dist/proxy/session-pool.d.ts.map +1 -0
  20. package/dist/proxy/session-pool.js +102 -0
  21. package/dist/proxy/session-pool.js.map +1 -0
  22. package/dist/registry/health-checker.d.ts +35 -0
  23. package/dist/registry/health-checker.d.ts.map +1 -0
  24. package/dist/registry/health-checker.js +121 -0
  25. package/dist/registry/health-checker.js.map +1 -0
  26. package/dist/registry/index.d.ts +4 -0
  27. package/dist/registry/index.d.ts.map +1 -0
  28. package/dist/registry/index.js +7 -0
  29. package/dist/registry/index.js.map +1 -0
  30. package/dist/registry/server-registry.d.ts +37 -0
  31. package/dist/registry/server-registry.d.ts.map +1 -0
  32. package/dist/registry/server-registry.js +72 -0
  33. package/dist/registry/server-registry.js.map +1 -0
  34. package/dist/registry/tool-index.d.ts +35 -0
  35. package/dist/registry/tool-index.d.ts.map +1 -0
  36. package/dist/registry/tool-index.js +72 -0
  37. package/dist/registry/tool-index.js.map +1 -0
  38. package/dist/router/index.d.ts +3 -0
  39. package/dist/router/index.d.ts.map +1 -0
  40. package/dist/router/index.js +6 -0
  41. package/dist/router/index.js.map +1 -0
  42. package/dist/router/load-balancer.d.ts +23 -0
  43. package/dist/router/load-balancer.d.ts.map +1 -0
  44. package/dist/router/load-balancer.js +78 -0
  45. package/dist/router/load-balancer.js.map +1 -0
  46. package/dist/router/request-router.d.ts +21 -0
  47. package/dist/router/request-router.d.ts.map +1 -0
  48. package/dist/router/request-router.js +50 -0
  49. package/dist/router/request-router.js.map +1 -0
  50. package/dist/types.d.ts +88 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +7 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +33 -0
package/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+
17
+ Copyright 2026 CodePedia Labs (labs@codepedia.kr)
@@ -0,0 +1,9 @@
1
+ export { McpProxy } from './proxy/index.js';
2
+ export { SessionPool } from './proxy/index.js';
3
+ export { ServerRegistry } from './registry/index.js';
4
+ export { ToolIndex } from './registry/index.js';
5
+ export { HealthChecker } from './registry/index.js';
6
+ export { RequestRouter } from './router/index.js';
7
+ export { LoadBalancer } from './router/index.js';
8
+ export type { ServerEntry, StdioConnection, HttpConnection, ServerConnection, ServerStatus, ToolEntry, RouteRequest, RouteResult, HealthCheckResult, BalancerStrategy, GatewayConfig, } from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,YAAY,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ // Copyright 2026 CodePedia Labs. Licensed under Apache-2.0.
2
+ // @airmcp-dev/gateway — index.ts
3
+ // re-export only. 로직 없음.
4
+ // ── Proxy ──
5
+ export { McpProxy } from './proxy/index.js';
6
+ export { SessionPool } from './proxy/index.js';
7
+ // ── Registry ──
8
+ export { ServerRegistry } from './registry/index.js';
9
+ export { ToolIndex } from './registry/index.js';
10
+ export { HealthChecker } from './registry/index.js';
11
+ // ── Router ──
12
+ export { RequestRouter } from './router/index.js';
13
+ export { LoadBalancer } from './router/index.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,iCAAiC;AACjC,yBAAyB;AAEzB,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { McpProxy } from './mcp-proxy.js';
2
+ export { SessionPool } from './session-pool.js';
3
+ export type { Session } from './session-pool.js';
4
+ export { buildToolCallRequest, buildListToolsRequest, extractResult, resolveTransportMethod, } from './protocol-adapter.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Copyright 2026 CodePedia Labs. Licensed under Apache-2.0.
2
+ // @airmcp-dev/gateway — proxy/index.ts
3
+ // re-export only.
4
+ export { McpProxy } from './mcp-proxy.js';
5
+ export { SessionPool } from './session-pool.js';
6
+ export { buildToolCallRequest, buildListToolsRequest, extractResult, resolveTransportMethod, } from './protocol-adapter.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,uCAAuC;AACvC,kBAAkB;AAElB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { GatewayConfig, ServerConnection } from '../types.js';
2
+ import { ServerRegistry } from '../registry/server-registry.js';
3
+ import { ToolIndex } from '../registry/tool-index.js';
4
+ import { HealthChecker } from '../registry/health-checker.js';
5
+ import { RequestRouter } from '../router/request-router.js';
6
+ export declare class McpProxy {
7
+ readonly registry: ServerRegistry;
8
+ readonly toolIndex: ToolIndex;
9
+ readonly router: RequestRouter;
10
+ readonly healthChecker: HealthChecker;
11
+ private sessionPool;
12
+ private config;
13
+ constructor(config?: GatewayConfig);
14
+ /**
15
+ * 하위 MCP 서버를 등록한다.
16
+ */
17
+ addServer(id: string, name: string, connection: ServerConnection): void;
18
+ /**
19
+ * 서버를 제거한다.
20
+ */
21
+ removeServer(id: string): void;
22
+ /**
23
+ * 서버의 도구를 발견하고 인덱싱한다.
24
+ */
25
+ registerTools(serverId: string, tools: Array<{
26
+ name: string;
27
+ description?: string;
28
+ inputSchema?: any;
29
+ }>): void;
30
+ /**
31
+ * 도구를 호출한다 (프록시 핵심).
32
+ */
33
+ callTool(toolName: string, params: Record<string, any>): Promise<any>;
34
+ /**
35
+ * Gateway를 시작한다.
36
+ */
37
+ start(): Promise<void>;
38
+ /**
39
+ * Gateway를 중지한다.
40
+ */
41
+ stop(): Promise<void>;
42
+ /**
43
+ * 현재 상태를 반환한다.
44
+ */
45
+ status(): {
46
+ name: string;
47
+ servers: number;
48
+ tools: number;
49
+ sessions: number;
50
+ health: import("../types.js").HealthCheckResult[];
51
+ };
52
+ }
53
+ //# sourceMappingURL=mcp-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/mcp-proxy.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAa,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAK5D,qBAAa,QAAQ;IACnB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,GAAE,aAAkB;IAiBtC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAKvE;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM9B;;OAEG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,GACtE,IAAI;IAeP;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAyC3E;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACH,MAAM;;;;;;;CASP"}
@@ -0,0 +1,131 @@
1
+ // Copyright 2026 CodePedia Labs. Licensed under Apache-2.0.
2
+ // @airmcp-dev/gateway — proxy/mcp-proxy.ts
3
+ //
4
+ // MCP 리버스 프록시.
5
+ // 클라이언트의 도구 호출을 받아서 적절한 하위 서버로 전달하고 결과를 반환.
6
+ // ServerRegistry + ToolIndex + RequestRouter + SessionPool을 조합.
7
+ import { ServerRegistry } from '../registry/server-registry.js';
8
+ import { ToolIndex } from '../registry/tool-index.js';
9
+ import { HealthChecker } from '../registry/health-checker.js';
10
+ import { RequestRouter } from '../router/request-router.js';
11
+ import { LoadBalancer } from '../router/load-balancer.js';
12
+ import { SessionPool } from './session-pool.js';
13
+ import { buildToolCallRequest, extractResult } from './protocol-adapter.js';
14
+ export class McpProxy {
15
+ registry;
16
+ toolIndex;
17
+ router;
18
+ healthChecker;
19
+ sessionPool;
20
+ config;
21
+ constructor(config = {}) {
22
+ this.config = {
23
+ name: config.name || 'air-gateway',
24
+ port: config.port || 4000,
25
+ healthCheckInterval: config.healthCheckInterval || 30_000,
26
+ balancer: config.balancer || 'round-robin',
27
+ requestTimeout: config.requestTimeout || 30_000,
28
+ };
29
+ this.registry = new ServerRegistry();
30
+ this.toolIndex = new ToolIndex();
31
+ const balancer = new LoadBalancer(this.config.balancer);
32
+ this.router = new RequestRouter(this.registry, this.toolIndex, balancer);
33
+ this.healthChecker = new HealthChecker(this.registry, this.config.healthCheckInterval);
34
+ this.sessionPool = new SessionPool();
35
+ }
36
+ /**
37
+ * 하위 MCP 서버를 등록한다.
38
+ */
39
+ addServer(id, name, connection) {
40
+ const entry = this.registry.register(id, name, connection);
41
+ entry.status = 'connected'; // 초기 상태
42
+ }
43
+ /**
44
+ * 서버를 제거한다.
45
+ */
46
+ removeServer(id) {
47
+ this.toolIndex.removeServer(id);
48
+ this.sessionPool.destroyByServer(id);
49
+ this.registry.unregister(id);
50
+ }
51
+ /**
52
+ * 서버의 도구를 발견하고 인덱싱한다.
53
+ */
54
+ registerTools(serverId, tools) {
55
+ const toolEntries = tools.map((t) => ({
56
+ name: t.name,
57
+ description: t.description,
58
+ serverId,
59
+ inputSchema: t.inputSchema,
60
+ }));
61
+ this.registry.updateTools(serverId, toolEntries);
62
+ const server = this.registry.get(serverId);
63
+ if (server) {
64
+ this.toolIndex.reindex(server);
65
+ }
66
+ }
67
+ /**
68
+ * 도구를 호출한다 (프록시 핵심).
69
+ */
70
+ async callTool(toolName, params) {
71
+ // 라우팅
72
+ const { server, tool } = this.router.route({ toolName, params });
73
+ // 세션 획득
74
+ const session = this.sessionPool.acquire(server);
75
+ try {
76
+ // JSON-RPC 요청 구성
77
+ const request = buildToolCallRequest(toolName, params);
78
+ // transport에 따라 실행 (여기서는 HTTP 예시)
79
+ if (server.connection.type === 'http' || server.connection.type === 'sse') {
80
+ const url = server.connection.url;
81
+ const controller = new AbortController();
82
+ const timeout = setTimeout(() => controller.abort(), this.config.requestTimeout);
83
+ try {
84
+ const res = await fetch(url, {
85
+ method: 'POST',
86
+ headers: { 'Content-Type': 'application/json' },
87
+ body: JSON.stringify(request.jsonrpc),
88
+ signal: controller.signal,
89
+ });
90
+ clearTimeout(timeout);
91
+ const response = await res.json();
92
+ return extractResult(response);
93
+ }
94
+ catch (err) {
95
+ clearTimeout(timeout);
96
+ throw err;
97
+ }
98
+ }
99
+ // stdio는 프로세스에 stdin/stdout으로 통신 (향후 구현)
100
+ throw new Error(`stdio proxy not yet implemented for server "${server.id}"`);
101
+ }
102
+ finally {
103
+ this.sessionPool.release(session.id);
104
+ }
105
+ }
106
+ /**
107
+ * Gateway를 시작한다.
108
+ */
109
+ async start() {
110
+ this.healthChecker.start();
111
+ }
112
+ /**
113
+ * Gateway를 중지한다.
114
+ */
115
+ async stop() {
116
+ this.healthChecker.stop();
117
+ }
118
+ /**
119
+ * 현재 상태를 반환한다.
120
+ */
121
+ status() {
122
+ return {
123
+ name: this.config.name,
124
+ servers: this.registry.size,
125
+ tools: this.toolIndex.size,
126
+ sessions: this.sessionPool.size,
127
+ health: this.healthChecker.getAllResults(),
128
+ };
129
+ }
130
+ }
131
+ //# sourceMappingURL=mcp-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-proxy.js","sourceRoot":"","sources":["../../src/proxy/mcp-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ServerConnection } from '../types.js';
2
+ /** 프로토콜 변환 결과 */
3
+ export interface AdaptedRequest {
4
+ /** 변환된 요청 데이터 (JSON-RPC 형태) */
5
+ jsonrpc: {
6
+ jsonrpc: '2.0';
7
+ id: number | string;
8
+ method: string;
9
+ params?: Record<string, any>;
10
+ };
11
+ }
12
+ /**
13
+ * MCP 도구 호출을 JSON-RPC 요청으로 변환한다.
14
+ */
15
+ export declare function buildToolCallRequest(toolName: string, params: Record<string, any>): AdaptedRequest;
16
+ /**
17
+ * 서버 연결 타입에 따른 통신 방법을 결정한다.
18
+ */
19
+ export declare function resolveTransportMethod(connection: ServerConnection): 'spawn-stdio' | 'http-post' | 'sse-stream';
20
+ /**
21
+ * 도구 목록 요청을 JSON-RPC로 변환한다.
22
+ */
23
+ export declare function buildListToolsRequest(): AdaptedRequest;
24
+ /**
25
+ * JSON-RPC 응답에서 결과를 추출한다.
26
+ */
27
+ export declare function extractResult(response: any): any;
28
+ //# sourceMappingURL=protocol-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/proxy/protocol-adapter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,iBAAiB;AACjB,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,OAAO,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B,CAAC;CACH;AAKD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,cAAc,CAYhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,GAC3B,aAAa,GAAG,WAAW,GAAG,YAAY,CAI5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAQtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAKhD"}
@@ -0,0 +1,56 @@
1
+ // Copyright 2026 CodePedia Labs. Licensed under Apache-2.0.
2
+ // @airmcp-dev/gateway — proxy/protocol-adapter.ts
3
+ //
4
+ // MCP transport 간 프로토콜 변환.
5
+ // 클라이언트가 HTTP로 요청 → 하위 서버가 stdio인 경우,
6
+ // 또는 클라이언트가 stdio → 하위 서버가 SSE인 경우 등을 처리.
7
+ /** JSON-RPC 요청 ID 카운터 */
8
+ let requestIdCounter = 0;
9
+ /**
10
+ * MCP 도구 호출을 JSON-RPC 요청으로 변환한다.
11
+ */
12
+ export function buildToolCallRequest(toolName, params) {
13
+ return {
14
+ jsonrpc: {
15
+ jsonrpc: '2.0',
16
+ id: ++requestIdCounter,
17
+ method: 'tools/call',
18
+ params: {
19
+ name: toolName,
20
+ arguments: params,
21
+ },
22
+ },
23
+ };
24
+ }
25
+ /**
26
+ * 서버 연결 타입에 따른 통신 방법을 결정한다.
27
+ */
28
+ export function resolveTransportMethod(connection) {
29
+ if (connection.type === 'stdio')
30
+ return 'spawn-stdio';
31
+ if (connection.type === 'sse')
32
+ return 'sse-stream';
33
+ return 'http-post';
34
+ }
35
+ /**
36
+ * 도구 목록 요청을 JSON-RPC로 변환한다.
37
+ */
38
+ export function buildListToolsRequest() {
39
+ return {
40
+ jsonrpc: {
41
+ jsonrpc: '2.0',
42
+ id: ++requestIdCounter,
43
+ method: 'tools/list',
44
+ },
45
+ };
46
+ }
47
+ /**
48
+ * JSON-RPC 응답에서 결과를 추출한다.
49
+ */
50
+ export function extractResult(response) {
51
+ if (response?.error) {
52
+ throw new Error(`MCP error ${response.error.code}: ${response.error.message}`);
53
+ }
54
+ return response?.result;
55
+ }
56
+ //# sourceMappingURL=protocol-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-adapter.js","sourceRoot":"","sources":["../../src/proxy/protocol-adapter.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,kDAAkD;AAClD,EAAE;AACF,2BAA2B;AAC3B,sCAAsC;AACtC,0CAA0C;AAe1C,yBAAyB;AACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAA2B;IAE3B,OAAO;QACL,OAAO,EAAE;YACP,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,EAAE,gBAAgB;YACtB,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,MAAM;aAClB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA4B;IAE5B,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IACnD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,OAAO,EAAE;YACP,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,EAAE,gBAAgB;YACtB,MAAM,EAAE,YAAY;SACrB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAa;IACzC,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,EAAE,MAAM,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ServerEntry } from '../types.js';
2
+ export interface Session {
3
+ id: string;
4
+ serverId: string;
5
+ createdAt: Date;
6
+ lastUsedAt: Date;
7
+ active: boolean;
8
+ /** 하위 서버와의 실제 연결 핸들 (transport별로 다름) */
9
+ handle: any;
10
+ }
11
+ export declare class SessionPool {
12
+ private sessions;
13
+ private sessionCounter;
14
+ /**
15
+ * 서버의 기존 세션을 가져오거나 없으면 새로 생성한다.
16
+ */
17
+ acquire(server: ServerEntry): Session;
18
+ /**
19
+ * 세션을 반환한다 (재사용 가능 상태로 전환).
20
+ */
21
+ release(sessionId: string): void;
22
+ /**
23
+ * 세션을 종료한다.
24
+ */
25
+ destroy(sessionId: string): void;
26
+ /**
27
+ * 특정 서버의 모든 세션을 종료한다.
28
+ */
29
+ destroyByServer(serverId: string): void;
30
+ /**
31
+ * 유휴 세션 정리 (maxIdleMs 이상 사용하지 않은 세션).
32
+ */
33
+ cleanup(maxIdleMs?: number): number;
34
+ /**
35
+ * 전체 세션 수.
36
+ */
37
+ get size(): number;
38
+ }
39
+ //# sourceMappingURL=session-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-pool.d.ts","sourceRoot":"","sources":["../../src/proxy/session-pool.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,cAAc,CAAK;IAE3B;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAyBrC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUhC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAYhC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUvC;;OAEG;IACH,OAAO,CAAC,SAAS,GAAE,MAAgB,GAAG,MAAM;IAoB5C;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAMjB;CACF"}
@@ -0,0 +1,102 @@
1
+ // Copyright 2026 CodePedia Labs. Licensed under Apache-2.0.
2
+ // @airmcp-dev/gateway — proxy/session-pool.ts
3
+ //
4
+ // 하위 MCP 서버와의 연결 세션을 관리한다.
5
+ // 서버 ID별로 세션을 풀링하고, 재사용 / 정리를 담당.
6
+ export class SessionPool {
7
+ sessions = new Map();
8
+ sessionCounter = 0;
9
+ /**
10
+ * 서버의 기존 세션을 가져오거나 없으면 새로 생성한다.
11
+ */
12
+ acquire(server) {
13
+ const pool = this.sessions.get(server.id) || [];
14
+ // 재사용 가능한 세션 찾기
15
+ const reusable = pool.find((s) => s.active);
16
+ if (reusable) {
17
+ reusable.lastUsedAt = new Date();
18
+ return reusable;
19
+ }
20
+ // 새 세션 생성
21
+ const session = {
22
+ id: `session_${++this.sessionCounter}`,
23
+ serverId: server.id,
24
+ createdAt: new Date(),
25
+ lastUsedAt: new Date(),
26
+ active: true,
27
+ handle: null, // 실제 연결은 proxy에서 설정
28
+ };
29
+ pool.push(session);
30
+ this.sessions.set(server.id, pool);
31
+ return session;
32
+ }
33
+ /**
34
+ * 세션을 반환한다 (재사용 가능 상태로 전환).
35
+ */
36
+ release(sessionId) {
37
+ for (const pool of this.sessions.values()) {
38
+ const session = pool.find((s) => s.id === sessionId);
39
+ if (session) {
40
+ session.lastUsedAt = new Date();
41
+ return;
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * 세션을 종료한다.
47
+ */
48
+ destroy(sessionId) {
49
+ for (const [serverId, pool] of this.sessions) {
50
+ const idx = pool.findIndex((s) => s.id === sessionId);
51
+ if (idx !== -1) {
52
+ pool[idx].active = false;
53
+ pool.splice(idx, 1);
54
+ this.sessions.set(serverId, pool);
55
+ return;
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * 특정 서버의 모든 세션을 종료한다.
61
+ */
62
+ destroyByServer(serverId) {
63
+ const pool = this.sessions.get(serverId);
64
+ if (pool) {
65
+ for (const session of pool) {
66
+ session.active = false;
67
+ }
68
+ this.sessions.delete(serverId);
69
+ }
70
+ }
71
+ /**
72
+ * 유휴 세션 정리 (maxIdleMs 이상 사용하지 않은 세션).
73
+ */
74
+ cleanup(maxIdleMs = 300_000) {
75
+ const now = Date.now();
76
+ let cleaned = 0;
77
+ for (const [serverId, pool] of this.sessions) {
78
+ const active = pool.filter((s) => {
79
+ const idle = now - s.lastUsedAt.getTime();
80
+ if (idle > maxIdleMs) {
81
+ s.active = false;
82
+ cleaned++;
83
+ return false;
84
+ }
85
+ return true;
86
+ });
87
+ this.sessions.set(serverId, active);
88
+ }
89
+ return cleaned;
90
+ }
91
+ /**
92
+ * 전체 세션 수.
93
+ */
94
+ get size() {
95
+ let count = 0;
96
+ for (const pool of this.sessions.values()) {
97
+ count += pool.length;
98
+ }
99
+ return count;
100
+ }
101
+ }
102
+ //# sourceMappingURL=session-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-pool.js","sourceRoot":"","sources":["../../src/proxy/session-pool.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,8CAA8C;AAC9C,EAAE;AACF,2BAA2B;AAC3B,kCAAkC;AAclC,MAAM,OAAO,WAAW;IACd,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IACxC,cAAc,GAAG,CAAC,CAAC;IAE3B;;OAEG;IACH,OAAO,CAAC,MAAmB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhD,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,UAAU;QACV,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE;YACtC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI,EAAE,oBAAoB;SACnC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YACrD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YACtD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,YAAoB,OAAO;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;oBACrB,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;oBACjB,OAAO,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { ServerEntry, HealthCheckResult } from '../types.js';
2
+ import { ServerRegistry } from './server-registry.js';
3
+ export declare class HealthChecker {
4
+ private registry;
5
+ private checkIntervalMs;
6
+ private timeoutMs;
7
+ private interval;
8
+ private results;
9
+ constructor(registry: ServerRegistry, checkIntervalMs?: number, timeoutMs?: number);
10
+ /**
11
+ * 주기적 헬스체크를 시작한다.
12
+ */
13
+ start(): void;
14
+ /**
15
+ * 헬스체크를 중지한다.
16
+ */
17
+ stop(): void;
18
+ /**
19
+ * 모든 connected 서버를 체크한다.
20
+ */
21
+ checkAll(): Promise<HealthCheckResult[]>;
22
+ /**
23
+ * 단일 서버를 체크한다.
24
+ */
25
+ checkOne(server: ServerEntry): Promise<HealthCheckResult>;
26
+ /**
27
+ * 마지막 헬스체크 결과를 조회한다.
28
+ */
29
+ getLastResult(serverId: string): HealthCheckResult | undefined;
30
+ /**
31
+ * 전체 마지막 결과.
32
+ */
33
+ getAllResults(): HealthCheckResult[];
34
+ }
35
+ //# sourceMappingURL=health-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-checker.d.ts","sourceRoot":"","sources":["../../src/registry/health-checker.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,OAAO,CAAwC;gBAG7C,QAAQ,EAAE,cAAc,EACxB,eAAe,GAAE,MAAe,EAChC,SAAS,GAAE,MAAc;IAGnC;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAa9C;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyD/D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI9D;;OAEG;IACH,aAAa,IAAI,iBAAiB,EAAE;CAGrC"}