@mcp-audit-gateway/core 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 (145) hide show
  1. package/.github/workflows/npm-publish.yml +21 -0
  2. package/CONTRIBUTING.md +41 -0
  3. package/LICENSE +21 -0
  4. package/README.md +156 -0
  5. package/dist/attestation/audit-log.d.ts +25 -0
  6. package/dist/attestation/audit-log.d.ts.map +1 -0
  7. package/dist/attestation/audit-log.js +95 -0
  8. package/dist/attestation/audit-log.js.map +1 -0
  9. package/dist/attestation/bugfix.test.d.ts +2 -0
  10. package/dist/attestation/bugfix.test.d.ts.map +1 -0
  11. package/dist/attestation/bugfix.test.js +103 -0
  12. package/dist/attestation/bugfix.test.js.map +1 -0
  13. package/dist/attestation/chain.test.d.ts +2 -0
  14. package/dist/attestation/chain.test.d.ts.map +1 -0
  15. package/dist/attestation/chain.test.js +153 -0
  16. package/dist/attestation/chain.test.js.map +1 -0
  17. package/dist/attestation/keygen.d.ts +5 -0
  18. package/dist/attestation/keygen.d.ts.map +1 -0
  19. package/dist/attestation/keygen.js +12 -0
  20. package/dist/attestation/keygen.js.map +1 -0
  21. package/dist/attestation/signer.d.ts +25 -0
  22. package/dist/attestation/signer.d.ts.map +1 -0
  23. package/dist/attestation/signer.js +93 -0
  24. package/dist/attestation/signer.js.map +1 -0
  25. package/dist/attestation/signer.test.d.ts +2 -0
  26. package/dist/attestation/signer.test.d.ts.map +1 -0
  27. package/dist/attestation/signer.test.js +62 -0
  28. package/dist/attestation/signer.test.js.map +1 -0
  29. package/dist/attestation/verify.d.ts +26 -0
  30. package/dist/attestation/verify.d.ts.map +1 -0
  31. package/dist/attestation/verify.js +104 -0
  32. package/dist/attestation/verify.js.map +1 -0
  33. package/dist/attestation/verify.test.d.ts +2 -0
  34. package/dist/attestation/verify.test.d.ts.map +1 -0
  35. package/dist/attestation/verify.test.js +79 -0
  36. package/dist/attestation/verify.test.js.map +1 -0
  37. package/dist/cli.d.ts +3 -0
  38. package/dist/cli.d.ts.map +1 -0
  39. package/dist/cli.js +364 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/index.d.ts +12 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +12 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/integration.test.d.ts +2 -0
  46. package/dist/integration.test.d.ts.map +1 -0
  47. package/dist/integration.test.js +88 -0
  48. package/dist/integration.test.js.map +1 -0
  49. package/dist/policy/engine.d.ts +24 -0
  50. package/dist/policy/engine.d.ts.map +1 -0
  51. package/dist/policy/engine.js +130 -0
  52. package/dist/policy/engine.js.map +1 -0
  53. package/dist/policy/engine.test.d.ts +2 -0
  54. package/dist/policy/engine.test.d.ts.map +1 -0
  55. package/dist/policy/engine.test.js +80 -0
  56. package/dist/policy/engine.test.js.map +1 -0
  57. package/dist/proxy/gateway.d.ts +54 -0
  58. package/dist/proxy/gateway.d.ts.map +1 -0
  59. package/dist/proxy/gateway.js +245 -0
  60. package/dist/proxy/gateway.js.map +1 -0
  61. package/dist/proxy/gateway.test.d.ts +2 -0
  62. package/dist/proxy/gateway.test.d.ts.map +1 -0
  63. package/dist/proxy/gateway.test.js +93 -0
  64. package/dist/proxy/gateway.test.js.map +1 -0
  65. package/dist/proxy/mcp-server-adapter.d.ts +21 -0
  66. package/dist/proxy/mcp-server-adapter.d.ts.map +1 -0
  67. package/dist/proxy/mcp-server-adapter.js +98 -0
  68. package/dist/proxy/mcp-server-adapter.js.map +1 -0
  69. package/dist/proxy/mcp-server-adapter.test.d.ts +2 -0
  70. package/dist/proxy/mcp-server-adapter.test.d.ts.map +1 -0
  71. package/dist/proxy/mcp-server-adapter.test.js +160 -0
  72. package/dist/proxy/mcp-server-adapter.test.js.map +1 -0
  73. package/dist/proxy/upstream-manager.d.ts +49 -0
  74. package/dist/proxy/upstream-manager.d.ts.map +1 -0
  75. package/dist/proxy/upstream-manager.js +246 -0
  76. package/dist/proxy/upstream-manager.js.map +1 -0
  77. package/dist/proxy/upstream-manager.test.d.ts +2 -0
  78. package/dist/proxy/upstream-manager.test.d.ts.map +1 -0
  79. package/dist/proxy/upstream-manager.test.js +413 -0
  80. package/dist/proxy/upstream-manager.test.js.map +1 -0
  81. package/dist/telemetry/logger.d.ts +26 -0
  82. package/dist/telemetry/logger.d.ts.map +1 -0
  83. package/dist/telemetry/logger.js +48 -0
  84. package/dist/telemetry/logger.js.map +1 -0
  85. package/dist/telemetry/logger.test.d.ts +2 -0
  86. package/dist/telemetry/logger.test.d.ts.map +1 -0
  87. package/dist/telemetry/logger.test.js +124 -0
  88. package/dist/telemetry/logger.test.js.map +1 -0
  89. package/dist/telemetry/metrics.d.ts +41 -0
  90. package/dist/telemetry/metrics.d.ts.map +1 -0
  91. package/dist/telemetry/metrics.js +64 -0
  92. package/dist/telemetry/metrics.js.map +1 -0
  93. package/dist/telemetry/metrics.test.d.ts +2 -0
  94. package/dist/telemetry/metrics.test.d.ts.map +1 -0
  95. package/dist/telemetry/metrics.test.js +93 -0
  96. package/dist/telemetry/metrics.test.js.map +1 -0
  97. package/dist/telemetry/tracer.d.ts +16 -0
  98. package/dist/telemetry/tracer.d.ts.map +1 -0
  99. package/dist/telemetry/tracer.js +71 -0
  100. package/dist/telemetry/tracer.js.map +1 -0
  101. package/dist/types.d.ts +477 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +68 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/wrap/proxy.d.ts +2 -0
  106. package/dist/wrap/proxy.d.ts.map +1 -0
  107. package/dist/wrap/proxy.js +152 -0
  108. package/dist/wrap/proxy.js.map +1 -0
  109. package/dist/wrap/proxy.test.d.ts +2 -0
  110. package/dist/wrap/proxy.test.d.ts.map +1 -0
  111. package/dist/wrap/proxy.test.js +155 -0
  112. package/dist/wrap/proxy.test.js.map +1 -0
  113. package/examples/README.md +33 -0
  114. package/examples/claude-desktop.json +50 -0
  115. package/examples/multi-agent-production.json +72 -0
  116. package/gateway.config.example.json +61 -0
  117. package/package.json +49 -0
  118. package/src/attestation/audit-log.ts +126 -0
  119. package/src/attestation/bugfix.test.ts +113 -0
  120. package/src/attestation/chain.test.ts +188 -0
  121. package/src/attestation/keygen.ts +18 -0
  122. package/src/attestation/signer.test.ts +75 -0
  123. package/src/attestation/signer.ts +105 -0
  124. package/src/attestation/verify.test.ts +86 -0
  125. package/src/attestation/verify.ts +131 -0
  126. package/src/cli.ts +407 -0
  127. package/src/index.ts +21 -0
  128. package/src/integration.test.ts +108 -0
  129. package/src/policy/engine.test.ts +95 -0
  130. package/src/policy/engine.ts +162 -0
  131. package/src/proxy/gateway.test.ts +108 -0
  132. package/src/proxy/gateway.ts +328 -0
  133. package/src/proxy/mcp-server-adapter.test.ts +197 -0
  134. package/src/proxy/mcp-server-adapter.ts +140 -0
  135. package/src/proxy/upstream-manager.test.ts +534 -0
  136. package/src/proxy/upstream-manager.ts +326 -0
  137. package/src/telemetry/logger.test.ts +139 -0
  138. package/src/telemetry/logger.ts +72 -0
  139. package/src/telemetry/metrics.test.ts +125 -0
  140. package/src/telemetry/metrics.ts +83 -0
  141. package/src/telemetry/tracer.ts +90 -0
  142. package/src/types.ts +113 -0
  143. package/src/wrap/proxy.test.ts +175 -0
  144. package/src/wrap/proxy.ts +192 -0
  145. package/tsconfig.json +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.test.js","sourceRoot":"","sources":["../../src/proxy/gateway.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
3
+ import { Gateway } from "./gateway.js";
4
+ export interface McpServerAdapterOptions {
5
+ name: string;
6
+ version: string;
7
+ resolvePrincipal?: (meta?: Record<string, unknown>) => string | undefined;
8
+ }
9
+ export declare class McpServerAdapter {
10
+ private server;
11
+ private gateway;
12
+ private resolvePrincipal?;
13
+ constructor(gateway: Gateway, options: McpServerAdapterOptions);
14
+ connect(transport: Transport): Promise<void>;
15
+ close(): Promise<void>;
16
+ getServer(): Server;
17
+ private registerHandlers;
18
+ private extractPrincipal;
19
+ private extractTraceContext;
20
+ }
21
+ //# sourceMappingURL=mcp-server-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-adapter.d.ts","sourceRoot":"","sources":["../../src/proxy/mcp-server-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAiB,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAC3E;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,gBAAgB,CAAC,CAAyD;gBAEtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB;IAuBxD,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,gBAAgB;IAuExB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,mBAAmB;CAO5B"}
@@ -0,0 +1,98 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import { ToolCallError } from "./gateway.js";
4
+ export class McpServerAdapter {
5
+ server;
6
+ gateway;
7
+ resolvePrincipal;
8
+ constructor(gateway, options) {
9
+ this.gateway = gateway;
10
+ this.resolvePrincipal = options.resolvePrincipal;
11
+ const discover = gateway.getServerDiscover();
12
+ const gatewayCapabilities = discover.capabilities?.gateway;
13
+ this.server = new Server({ name: options.name, version: options.version }, {
14
+ capabilities: {
15
+ tools: { listChanged: true },
16
+ experimental: {
17
+ "x-gateway-routing/v1": gatewayCapabilities ?? {},
18
+ "x-gateway-attestation/v1": { enabled: true },
19
+ },
20
+ },
21
+ });
22
+ this.registerHandlers();
23
+ }
24
+ async connect(transport) {
25
+ await this.server.connect(transport);
26
+ }
27
+ async close() {
28
+ await this.server.close();
29
+ }
30
+ getServer() {
31
+ return this.server;
32
+ }
33
+ registerHandlers() {
34
+ this.server.setRequestHandler(ListToolsRequestSchema, async (request) => {
35
+ const principal = this.extractPrincipal(request.params?._meta);
36
+ const listResult = await this.gateway.handleToolsList(principal);
37
+ return {
38
+ tools: listResult.tools.map((tool) => ({
39
+ name: tool.name,
40
+ description: tool.description,
41
+ inputSchema: tool.inputSchema ?? { type: "object" },
42
+ annotations: tool.annotations,
43
+ })),
44
+ _meta: listResult._meta,
45
+ };
46
+ });
47
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
48
+ const principal = this.extractPrincipal(request.params?._meta);
49
+ const traceContext = this.extractTraceContext(request.params?._meta);
50
+ const toolName = request.params.name;
51
+ const args = (request.params.arguments ?? {});
52
+ try {
53
+ const { result, auditRecord } = await this.gateway.handleToolsCall(toolName, args, principal, traceContext);
54
+ const upstreamResult = result;
55
+ return {
56
+ content: upstreamResult?.content ?? [{ type: "text", text: JSON.stringify(result) }],
57
+ isError: upstreamResult?.isError,
58
+ _meta: {
59
+ "x-gateway-attestation/v1": {
60
+ auditId: auditRecord.id,
61
+ attestation: auditRecord.attestation,
62
+ timestamp: auditRecord.timestamp,
63
+ },
64
+ },
65
+ };
66
+ }
67
+ catch (err) {
68
+ if (err instanceof ToolCallError) {
69
+ return {
70
+ content: [{ type: "text", text: err.message }],
71
+ isError: true,
72
+ _meta: {
73
+ "x-gateway-attestation/v1": {
74
+ auditId: err.auditRecord.id,
75
+ attestation: err.auditRecord.attestation,
76
+ timestamp: err.auditRecord.timestamp,
77
+ },
78
+ },
79
+ };
80
+ }
81
+ throw err;
82
+ }
83
+ });
84
+ }
85
+ extractPrincipal(meta) {
86
+ if (this.resolvePrincipal) {
87
+ return this.resolvePrincipal(meta);
88
+ }
89
+ return undefined;
90
+ }
91
+ extractTraceContext(meta) {
92
+ if (!meta)
93
+ return undefined;
94
+ const tc = meta.traceContext;
95
+ return tc;
96
+ }
97
+ }
98
+ //# sourceMappingURL=mcp-server-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-adapter.js","sourceRoot":"","sources":["../../src/proxy/mcp-server-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-server-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-adapter.test.d.ts","sourceRoot":"","sources":["../../src/proxy/mcp-server-adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,160 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
4
+ import { ListToolsResultSchema, CompatibilityCallToolResultSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { Gateway } from "./gateway.js";
6
+ import { McpServerAdapter } from "./mcp-server-adapter.js";
7
+ import { unlink } from "node:fs/promises";
8
+ const AUDIT_PATH = "/tmp/mcp-adapter-test-audit.jsonl";
9
+ const testConfig = {
10
+ name: "adapter-test-gateway",
11
+ version: "0.2.0",
12
+ listen: { transport: "streamable-http", port: 3200, host: "127.0.0.1" },
13
+ upstreams: [
14
+ {
15
+ name: "mock-server",
16
+ namespace: "mock",
17
+ transport: { type: "stdio", command: "echo", args: [] },
18
+ },
19
+ ],
20
+ policy: {
21
+ defaultEffect: "allow",
22
+ rules: [
23
+ {
24
+ effect: "deny",
25
+ principals: ["agent:restricted"],
26
+ tools: ["mock/secret_tool"],
27
+ },
28
+ ],
29
+ },
30
+ attestation: {
31
+ enabled: true,
32
+ algorithm: "hmac-sha256",
33
+ secret: "b".repeat(64),
34
+ includeParams: false,
35
+ includeResult: false,
36
+ },
37
+ telemetry: { enabled: false, serviceName: "test", sampleRate: 0 },
38
+ auditLog: { enabled: true, path: AUDIT_PATH, rotateAfterMb: 10 },
39
+ };
40
+ describe("McpServerAdapter", () => {
41
+ let gateway;
42
+ let adapter;
43
+ let client;
44
+ beforeEach(async () => {
45
+ gateway = new Gateway(testConfig);
46
+ await gateway.init();
47
+ // Register tools manually (simulating upstream discovery)
48
+ gateway.registerUpstreamTools("mock-server", "mock", [
49
+ {
50
+ name: "greet",
51
+ description: "Greets a user",
52
+ inputSchema: { type: "object", properties: { name: { type: "string" } } },
53
+ },
54
+ {
55
+ name: "secret_tool",
56
+ description: "A restricted tool",
57
+ inputSchema: { type: "object" },
58
+ },
59
+ ]);
60
+ adapter = new McpServerAdapter(gateway, {
61
+ name: "adapter-test-gateway",
62
+ version: "0.2.0",
63
+ resolvePrincipal: (meta) => meta?.requestIdentity,
64
+ });
65
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
66
+ client = new Client({ name: "test-client", version: "1.0.0" }, { capabilities: {} });
67
+ await adapter.connect(serverTransport);
68
+ await client.connect(clientTransport);
69
+ });
70
+ afterEach(async () => {
71
+ await client.close();
72
+ await adapter.close();
73
+ try {
74
+ await unlink(AUDIT_PATH);
75
+ }
76
+ catch {
77
+ // file may not exist
78
+ }
79
+ });
80
+ describe("tools/list", () => {
81
+ it("lists tools with namespace prefixes via the SDK client", async () => {
82
+ const result = await client.listTools();
83
+ expect(result.tools.length).toBe(2);
84
+ const names = result.tools.map((t) => t.name);
85
+ expect(names).toContain("mock/greet");
86
+ expect(names).toContain("mock/secret_tool");
87
+ });
88
+ it("includes tool descriptions through the adapter", async () => {
89
+ const result = await client.listTools();
90
+ const greet = result.tools.find((t) => t.name === "mock/greet");
91
+ expect(greet).toBeDefined();
92
+ expect(greet.description).toBe("Greets a user");
93
+ });
94
+ it("applies policy filtering when requestIdentity is provided", async () => {
95
+ // Use a custom request with _meta to pass identity
96
+ const result = await client.request({
97
+ method: "tools/list",
98
+ params: {
99
+ _meta: { requestIdentity: "agent:restricted" },
100
+ },
101
+ }, ListToolsResultSchema);
102
+ const tools = result.tools;
103
+ const names = tools.map((t) => t.name);
104
+ expect(names).toContain("mock/greet");
105
+ expect(names).not.toContain("mock/secret_tool");
106
+ });
107
+ });
108
+ describe("tools/call", () => {
109
+ it("returns attestation metadata in tool call responses", async () => {
110
+ // Call a tool that will be denied by policy, which produces attestation
111
+ const result = await client.request({
112
+ method: "tools/call",
113
+ params: {
114
+ name: "mock/secret_tool",
115
+ arguments: {},
116
+ _meta: { requestIdentity: "agent:restricted" },
117
+ },
118
+ }, CompatibilityCallToolResultSchema);
119
+ // Should get an error response with attestation metadata
120
+ const meta = result._meta;
121
+ expect(meta).toBeDefined();
122
+ expect(meta["x-gateway-attestation/v1"]).toBeDefined();
123
+ expect(meta["x-gateway-attestation/v1"].auditId).toBeDefined();
124
+ expect(meta["x-gateway-attestation/v1"].attestation).toBeDefined();
125
+ expect(meta["x-gateway-attestation/v1"].timestamp).toBeDefined();
126
+ // Should be flagged as an error
127
+ expect(result.isError).toBe(true);
128
+ });
129
+ it("returns error content for unknown tools with attestation", async () => {
130
+ const result = await client.request({
131
+ method: "tools/call",
132
+ params: {
133
+ name: "mock/nonexistent",
134
+ arguments: {},
135
+ },
136
+ }, CompatibilityCallToolResultSchema);
137
+ expect(result.isError).toBe(true);
138
+ const content = result.content;
139
+ expect(content).toHaveLength(1);
140
+ expect(content[0].type).toBe("text");
141
+ expect(content[0].text).toContain("Unknown tool");
142
+ // Attestation metadata should still be present
143
+ const meta = result._meta;
144
+ expect(meta["x-gateway-attestation/v1"].auditId).toBeDefined();
145
+ });
146
+ });
147
+ describe("server capabilities", () => {
148
+ it("advertises tools capability", () => {
149
+ const caps = client.getServerCapabilities();
150
+ expect(caps?.tools).toBeDefined();
151
+ });
152
+ it("advertises gateway extension in experimental capabilities", () => {
153
+ const caps = client.getServerCapabilities();
154
+ expect(caps?.experimental).toBeDefined();
155
+ expect((caps?.experimental)["x-gateway-routing/v1"]).toBeDefined();
156
+ expect((caps?.experimental)["x-gateway-attestation/v1"]).toBeDefined();
157
+ });
158
+ });
159
+ });
160
+ //# sourceMappingURL=mcp-server-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-adapter.test.js","sourceRoot":"","sources":["../../src/proxy/mcp-server-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,iCAAiC,GAClC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,UAAU,GAAG,mCAAmC,CAAC;AAEvD,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;IACvE,SAAS,EAAE;QACT;YACE,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;SACxD;KACF;IACD,MAAM,EAAE;QACN,aAAa,EAAE,OAAO;QACtB,KAAK,EAAE;YACL;gBACE,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,CAAC,kBAAkB,CAAC;gBAChC,KAAK,EAAE,CAAC,kBAAkB,CAAC;aAC5B;SACF;KACF;IACD,WAAW,EAAE;QACX,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE,KAAK;KACrB;IACD,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IACjE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;CACjE,CAAC;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAgB,CAAC;IACrB,IAAI,OAAyB,CAAC;IAC9B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,0DAA0D;QAC1D,OAAO,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE;YACnD;gBACE,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,eAAe;gBAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC1E;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,mBAAmB;gBAChC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAChC;SACF,CAAC,CAAC;QAEH,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,OAAO;YAChB,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,eAAqC;SACxE,CAAC,CAAC;QAEH,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QAChF,MAAM,GAAG,IAAI,MAAM,CACjB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,EACzC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,MAAM,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAExC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAExC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,mDAAmD;YACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC;gBACE,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE;oBACN,KAAK,EAAE,EAAE,eAAe,EAAE,kBAAkB,EAAE;iBAC/C;aACF,EACD,qBAAqB,CACtB,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,wEAAwE;YACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC;gBACE,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE;oBACN,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,EAAE;oBACb,KAAK,EAAE,EAAE,eAAe,EAAE,kBAAkB,EAAE;iBAC/C;aACF,EACD,iCAAiC,CAClC,CAAC;YAEF,yDAAyD;YACzD,MAAM,IAAI,GAAI,MAAc,CAAC,KAAK,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAEjE,gCAAgC;YAChC,MAAM,CAAE,MAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC;gBACE,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE;oBACN,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,EAAE;iBACd;aACF,EACD,iCAAiC,CAClC,CAAC;YAEF,MAAM,CAAE,MAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAI,MAAc,CAAC,OAAO,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAElD,+CAA+C;YAC/C,MAAM,IAAI,GAAI,MAAc,CAAC,KAAK,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,CAAC,IAAI,EAAE,YAAoB,CAAA,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1E,MAAM,CAAC,CAAC,IAAI,EAAE,YAAoB,CAAA,CAAC,0BAA0B,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import type { UpstreamConfig, UpstreamStatus } from "../types.js";
3
+ export interface UpstreamConnection {
4
+ config: UpstreamConfig;
5
+ client: Client;
6
+ status: UpstreamStatus;
7
+ tools: Array<{
8
+ name: string;
9
+ description?: string;
10
+ inputSchema?: unknown;
11
+ annotations?: Record<string, unknown>;
12
+ }>;
13
+ consecutiveFailures: number;
14
+ reconnectAttempts: number;
15
+ reconnectTimer?: ReturnType<typeof setTimeout>;
16
+ }
17
+ export declare class UpstreamManager {
18
+ private connections;
19
+ private healthCheckInterval?;
20
+ private static readonly MAX_CONSECUTIVE_FAILURES;
21
+ private static readonly DEFAULT_TIMEOUT_MS;
22
+ private static readonly MAX_BACKOFF_MS;
23
+ private static readonly BASE_BACKOFF_MS;
24
+ connect(upstream: UpstreamConfig, timeoutMs?: number): Promise<UpstreamConnection>;
25
+ callTool(upstreamName: string, toolName: string, args: Record<string, unknown>): Promise<unknown>;
26
+ startHealthChecks(intervalMs: number): void;
27
+ stopHealthChecks(): void;
28
+ reconnect(upstreamName: string): Promise<void>;
29
+ getConnection(name: string): UpstreamConnection | undefined;
30
+ getAllStatuses(): UpstreamStatus[];
31
+ disconnectAll(): Promise<void>;
32
+ private runHealthChecks;
33
+ private markUnavailable;
34
+ private scheduleReconnect;
35
+ private calculateBackoff;
36
+ private withTimeout;
37
+ private createTransport;
38
+ }
39
+ export declare class UpstreamUnavailableError extends Error {
40
+ readonly upstreamName: string;
41
+ readonly reason: string;
42
+ constructor(upstreamName: string, reason: string);
43
+ }
44
+ export declare class ConnectionTimeoutError extends Error {
45
+ readonly upstreamName: string;
46
+ readonly timeoutMs: number;
47
+ constructor(upstreamName: string, timeoutMs: number);
48
+ }
49
+ //# sourceMappingURL=upstream-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream-manager.d.ts","sourceRoot":"","sources":["../../src/proxy/upstream-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAChD;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,mBAAmB,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAK;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAU;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAS;IAE1C,OAAO,CACX,QAAQ,EAAE,cAAc,EACxB,SAAS,GAAE,MAA2C,GACrD,OAAO,CAAC,kBAAkB,CAAC;IAmDxB,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC;IA+BnB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAO3C,gBAAgB,IAAI,IAAI;IAOlB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDpD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI3D,cAAc,IAAI,cAAc,EAAE;IAI5B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAetB,eAAe;IA0B7B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,gBAAgB;YAKV,WAAW;IA2BzB,OAAO,CAAC,eAAe;CAcxB;AAED,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,YAAY,EAAE,MAAM;aACpB,MAAM,EAAE,MAAM;gBADd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;CAOjC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,YAAY,EAAE,MAAM;aACpB,SAAS,EAAE,MAAM;gBADjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM;CAOpC"}
@@ -0,0 +1,246 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
4
+ export class UpstreamManager {
5
+ connections = new Map();
6
+ healthCheckInterval;
7
+ static MAX_CONSECUTIVE_FAILURES = 3;
8
+ static DEFAULT_TIMEOUT_MS = 10_000;
9
+ static MAX_BACKOFF_MS = 30_000;
10
+ static BASE_BACKOFF_MS = 1_000;
11
+ async connect(upstream, timeoutMs = UpstreamManager.DEFAULT_TIMEOUT_MS) {
12
+ const client = new Client({ name: "mcp-audit-gateway", version: "0.1.0" }, { capabilities: {} });
13
+ const transport = this.createTransport(upstream);
14
+ await this.withTimeout(client.connect(transport), timeoutMs, upstream.name);
15
+ let tools;
16
+ try {
17
+ const toolsResult = await this.withTimeout(client.listTools(), timeoutMs, upstream.name);
18
+ tools = toolsResult.tools.map((t) => ({
19
+ name: t.name,
20
+ description: t.description,
21
+ inputSchema: t.inputSchema,
22
+ annotations: t.annotations,
23
+ }));
24
+ }
25
+ catch (err) {
26
+ try {
27
+ await client.close();
28
+ }
29
+ catch {
30
+ // best effort
31
+ }
32
+ throw err;
33
+ }
34
+ const connection = {
35
+ config: upstream,
36
+ client,
37
+ status: {
38
+ name: upstream.name,
39
+ namespace: upstream.namespace,
40
+ status: "healthy",
41
+ toolCount: tools.length,
42
+ lastSuccessfulContact: new Date().toISOString(),
43
+ },
44
+ tools,
45
+ consecutiveFailures: 0,
46
+ reconnectAttempts: 0,
47
+ };
48
+ this.connections.set(upstream.name, connection);
49
+ return connection;
50
+ }
51
+ async callTool(upstreamName, toolName, args) {
52
+ const conn = this.connections.get(upstreamName);
53
+ if (!conn) {
54
+ throw new Error(`Upstream not connected: ${upstreamName}`);
55
+ }
56
+ if (conn.status.status === "unavailable") {
57
+ throw new UpstreamUnavailableError(upstreamName, conn.status.unavailableReason ?? "Upstream is unavailable");
58
+ }
59
+ try {
60
+ const result = await conn.client.callTool({ name: toolName, arguments: args });
61
+ conn.status.lastSuccessfulContact = new Date().toISOString();
62
+ conn.status.status = "healthy";
63
+ conn.consecutiveFailures = 0;
64
+ return result;
65
+ }
66
+ catch (err) {
67
+ conn.consecutiveFailures++;
68
+ if (conn.consecutiveFailures >= UpstreamManager.MAX_CONSECUTIVE_FAILURES) {
69
+ this.markUnavailable(conn, String(err));
70
+ }
71
+ else {
72
+ conn.status.status = "degraded";
73
+ conn.status.degradedReason = String(err);
74
+ }
75
+ throw err;
76
+ }
77
+ }
78
+ startHealthChecks(intervalMs) {
79
+ this.stopHealthChecks();
80
+ this.healthCheckInterval = setInterval(() => {
81
+ void this.runHealthChecks();
82
+ }, intervalMs);
83
+ }
84
+ stopHealthChecks() {
85
+ if (this.healthCheckInterval) {
86
+ clearInterval(this.healthCheckInterval);
87
+ this.healthCheckInterval = undefined;
88
+ }
89
+ }
90
+ async reconnect(upstreamName) {
91
+ const conn = this.connections.get(upstreamName);
92
+ if (!conn) {
93
+ throw new Error(`Upstream not found: ${upstreamName}`);
94
+ }
95
+ if (conn.reconnectTimer) {
96
+ clearTimeout(conn.reconnectTimer);
97
+ conn.reconnectTimer = undefined;
98
+ }
99
+ try {
100
+ try {
101
+ await conn.client.close();
102
+ }
103
+ catch {
104
+ // best effort
105
+ }
106
+ const client = new Client({ name: "mcp-audit-gateway", version: "0.1.0" }, { capabilities: {} });
107
+ const transport = this.createTransport(conn.config);
108
+ await this.withTimeout(client.connect(transport), UpstreamManager.DEFAULT_TIMEOUT_MS, upstreamName);
109
+ const toolsResult = await this.withTimeout(client.listTools(), UpstreamManager.DEFAULT_TIMEOUT_MS, upstreamName);
110
+ const tools = toolsResult.tools.map((t) => ({
111
+ name: t.name,
112
+ description: t.description,
113
+ inputSchema: t.inputSchema,
114
+ annotations: t.annotations,
115
+ }));
116
+ conn.client = client;
117
+ conn.tools = tools;
118
+ conn.status.status = "healthy";
119
+ conn.status.toolCount = tools.length;
120
+ conn.status.lastSuccessfulContact = new Date().toISOString();
121
+ conn.status.unavailableReason = undefined;
122
+ conn.status.degradedReason = undefined;
123
+ conn.consecutiveFailures = 0;
124
+ conn.reconnectAttempts = 0;
125
+ }
126
+ catch (err) {
127
+ conn.reconnectAttempts++;
128
+ this.scheduleReconnect(conn);
129
+ throw err;
130
+ }
131
+ }
132
+ getConnection(name) {
133
+ return this.connections.get(name);
134
+ }
135
+ getAllStatuses() {
136
+ return Array.from(this.connections.values()).map((c) => c.status);
137
+ }
138
+ async disconnectAll() {
139
+ this.stopHealthChecks();
140
+ for (const conn of this.connections.values()) {
141
+ if (conn.reconnectTimer) {
142
+ clearTimeout(conn.reconnectTimer);
143
+ }
144
+ try {
145
+ await conn.client.close();
146
+ }
147
+ catch {
148
+ // best effort
149
+ }
150
+ }
151
+ this.connections.clear();
152
+ }
153
+ async runHealthChecks() {
154
+ for (const conn of this.connections.values()) {
155
+ if (conn.status.status === "unavailable") {
156
+ continue;
157
+ }
158
+ try {
159
+ await conn.client.ping();
160
+ conn.status.lastSuccessfulContact = new Date().toISOString();
161
+ conn.consecutiveFailures = 0;
162
+ if (conn.status.status === "degraded") {
163
+ conn.status.status = "healthy";
164
+ conn.status.degradedReason = undefined;
165
+ }
166
+ }
167
+ catch (err) {
168
+ conn.consecutiveFailures++;
169
+ if (conn.consecutiveFailures >= UpstreamManager.MAX_CONSECUTIVE_FAILURES) {
170
+ this.markUnavailable(conn, `Health check failed: ${err}`);
171
+ }
172
+ else {
173
+ conn.status.status = "degraded";
174
+ conn.status.degradedReason = `Health check failed: ${err}`;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ markUnavailable(conn, reason) {
180
+ conn.status.status = "unavailable";
181
+ conn.status.unavailableReason = reason;
182
+ conn.status.degradedReason = undefined;
183
+ this.scheduleReconnect(conn);
184
+ }
185
+ scheduleReconnect(conn) {
186
+ if (conn.reconnectTimer) {
187
+ clearTimeout(conn.reconnectTimer);
188
+ }
189
+ const backoffMs = this.calculateBackoff(conn.reconnectAttempts);
190
+ conn.reconnectTimer = setTimeout(() => {
191
+ void this.reconnect(conn.config.name).catch(() => { });
192
+ }, backoffMs);
193
+ }
194
+ calculateBackoff(attempt) {
195
+ const exponential = UpstreamManager.BASE_BACKOFF_MS * Math.pow(2, attempt);
196
+ return Math.min(exponential, UpstreamManager.MAX_BACKOFF_MS);
197
+ }
198
+ async withTimeout(promise, timeoutMs, upstreamName) {
199
+ let timer;
200
+ const timeoutPromise = new Promise((_, reject) => {
201
+ timer = setTimeout(() => {
202
+ reject(new ConnectionTimeoutError(upstreamName, timeoutMs));
203
+ }, timeoutMs);
204
+ });
205
+ try {
206
+ const result = await Promise.race([promise, timeoutPromise]);
207
+ clearTimeout(timer);
208
+ return result;
209
+ }
210
+ catch (err) {
211
+ clearTimeout(timer);
212
+ throw err;
213
+ }
214
+ }
215
+ createTransport(upstream) {
216
+ if (upstream.transport.type === "stdio") {
217
+ return new StdioClientTransport({
218
+ command: upstream.transport.command,
219
+ args: upstream.transport.args,
220
+ env: upstream.transport.env,
221
+ });
222
+ }
223
+ return new StreamableHTTPClientTransport(new URL(upstream.transport.url), upstream.transport.headers ? { requestInit: { headers: upstream.transport.headers } } : undefined);
224
+ }
225
+ }
226
+ export class UpstreamUnavailableError extends Error {
227
+ upstreamName;
228
+ reason;
229
+ constructor(upstreamName, reason) {
230
+ super(`Upstream "${upstreamName}" is unavailable: ${reason}`);
231
+ this.upstreamName = upstreamName;
232
+ this.reason = reason;
233
+ this.name = "UpstreamUnavailableError";
234
+ }
235
+ }
236
+ export class ConnectionTimeoutError extends Error {
237
+ upstreamName;
238
+ timeoutMs;
239
+ constructor(upstreamName, timeoutMs) {
240
+ super(`Connection to upstream "${upstreamName}" timed out after ${timeoutMs}ms`);
241
+ this.upstreamName = upstreamName;
242
+ this.timeoutMs = timeoutMs;
243
+ this.name = "ConnectionTimeoutError";
244
+ }
245
+ }
246
+ //# sourceMappingURL=upstream-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream-manager.js","sourceRoot":"","sources":["../../src/proxy/upstream-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAkBnG,MAAM,OAAO,eAAe;IAClB,WAAW,GAAoC,IAAI,GAAG,EAAE,CAAC;IACzD,mBAAmB,CAAkC;IACrD,MAAM,CAAU,wBAAwB,GAAG,CAAC,CAAC;IAC7C,MAAM,CAAU,kBAAkB,GAAG,MAAM,CAAC;IAC5C,MAAM,CAAU,cAAc,GAAG,MAAM,CAAC;IACxC,MAAM,CAAU,eAAe,GAAG,KAAK,CAAC;IAEhD,KAAK,CAAC,OAAO,CACX,QAAwB,EACxB,YAAoB,eAAe,CAAC,kBAAkB;QAEtD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC/C,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE5E,IAAI,KAAkC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CACxC,MAAM,CAAC,SAAS,EAAE,EAClB,SAAS,EACT,QAAQ,CAAC,IAAI,CACd,CAAC;YACF,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAkD;aAClE,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAuB;YACrC,MAAM,EAAE,QAAQ;YAChB,MAAM;YACN,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,KAAK,CAAC,MAAM;gBACvB,qBAAqB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAChD;YACD,KAAK;YACL,mBAAmB,EAAE,CAAC;YACtB,iBAAiB,EAAE,CAAC;SACrB,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,YAAoB,EACpB,QAAgB,EAChB,IAA6B;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,wBAAwB,CAChC,YAAY,EACZ,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,yBAAyB,CAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,eAAe,CAAC,wBAAwB,EAAE,CAAC;gBACzE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,UAAkB;QAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1C,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAoB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC/C,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,WAAW,CACpB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,eAAe,CAAC,kBAAkB,EAClC,YAAY,CACb,CAAC;YAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CACxC,MAAM,CAAC,SAAS,EAAE,EAClB,eAAe,CAAC,kBAAkB,EAClC,YAAY,CACb,CAAC;YACF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAkD;aAClE,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7D,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,eAAe,CAAC,wBAAwB,EAAE,CAAC;oBACzE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,wBAAwB,GAAG,EAAE,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,wBAAwB,GAAG,EAAE,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAwB,EAAE,MAAc;QAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,iBAAiB,CAAC,IAAwB;QAChD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxD,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAmB,EACnB,SAAiB,EACjB,YAAoB;QAEpB,IAAI,KAAoC,CAAC;QACzC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,MAAM,CACJ,IAAI,sBAAsB,CACxB,YAAY,EACZ,SAAS,CACV,CACF,CAAC;YACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;YAC7D,YAAY,CAAC,KAAM,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,KAAM,CAAC,CAAC;YACrB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,QAAwB;QAC9C,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACxC,OAAO,IAAI,oBAAoB,CAAC;gBAC9B,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO;gBACnC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI;gBAC7B,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,6BAA6B,CACtC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAC/B,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAClG,CAAC;IACJ,CAAC;;AAGH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAE/B;IACA;IAFlB,YACkB,YAAoB,EACpB,MAAc;QAE9B,KAAK,CACH,aAAa,YAAY,qBAAqB,MAAM,EAAE,CACvD,CAAC;QALc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAE7B;IACA;IAFlB,YACkB,YAAoB,EACpB,SAAiB;QAEjC,KAAK,CACH,2BAA2B,YAAY,qBAAqB,SAAS,IAAI,CAC1E,CAAC;QALc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,cAAS,GAAT,SAAS,CAAQ;QAKjC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=upstream-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream-manager.test.d.ts","sourceRoot":"","sources":["../../src/proxy/upstream-manager.test.ts"],"names":[],"mappings":""}