@aiwerk/mcp-bridge 1.0.0 → 1.0.2

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 (63) hide show
  1. package/dist/bin/mcp-bridge.d.ts +2 -0
  2. package/dist/bin/mcp-bridge.js +320 -0
  3. package/dist/src/config.d.ts +19 -0
  4. package/dist/src/config.js +145 -0
  5. package/{src/index.ts → dist/src/index.d.ts} +1 -30
  6. package/dist/src/index.js +21 -0
  7. package/dist/src/mcp-router.d.ts +65 -0
  8. package/dist/src/mcp-router.js +271 -0
  9. package/dist/src/protocol.d.ts +4 -0
  10. package/dist/src/protocol.js +58 -0
  11. package/dist/src/schema-convert.d.ts +11 -0
  12. package/dist/src/schema-convert.js +150 -0
  13. package/dist/src/standalone-server.d.ts +30 -0
  14. package/dist/src/standalone-server.js +312 -0
  15. package/dist/src/tool-naming.d.ts +3 -0
  16. package/dist/src/tool-naming.js +38 -0
  17. package/dist/src/transport-base.d.ts +76 -0
  18. package/dist/src/transport-base.js +163 -0
  19. package/dist/src/transport-sse.d.ts +16 -0
  20. package/dist/src/transport-sse.js +207 -0
  21. package/dist/src/transport-stdio.d.ts +20 -0
  22. package/dist/src/transport-stdio.js +281 -0
  23. package/dist/src/transport-streamable-http.d.ts +11 -0
  24. package/dist/src/transport-streamable-http.js +164 -0
  25. package/dist/src/types.d.ts +72 -0
  26. package/dist/src/types.js +4 -0
  27. package/dist/src/update-checker.d.ts +25 -0
  28. package/dist/src/update-checker.js +132 -0
  29. package/package.json +19 -4
  30. package/scripts/install-server.ps1 +25 -58
  31. package/scripts/install-server.sh +37 -90
  32. package/servers/apify/README.md +6 -6
  33. package/servers/github/README.md +6 -6
  34. package/servers/google-maps/README.md +6 -6
  35. package/servers/hetzner/README.md +6 -6
  36. package/servers/hostinger/README.md +6 -6
  37. package/servers/linear/README.md +6 -6
  38. package/servers/miro/README.md +6 -6
  39. package/servers/notion/README.md +6 -6
  40. package/servers/stripe/README.md +6 -6
  41. package/servers/tavily/README.md +6 -6
  42. package/servers/todoist/README.md +6 -6
  43. package/servers/wise/README.md +6 -6
  44. package/bin/mcp-bridge.js +0 -9
  45. package/bin/mcp-bridge.ts +0 -335
  46. package/src/config.ts +0 -168
  47. package/src/mcp-router.ts +0 -366
  48. package/src/protocol.ts +0 -69
  49. package/src/schema-convert.ts +0 -178
  50. package/src/standalone-server.ts +0 -385
  51. package/src/tool-naming.ts +0 -51
  52. package/src/transport-base.ts +0 -199
  53. package/src/transport-sse.ts +0 -230
  54. package/src/transport-stdio.ts +0 -312
  55. package/src/transport-streamable-http.ts +0 -188
  56. package/src/types.ts +0 -88
  57. package/src/update-checker.ts +0 -155
  58. package/tests/collision.test.ts +0 -60
  59. package/tests/env-resolve.test.ts +0 -68
  60. package/tests/mcp-router.test.ts +0 -301
  61. package/tests/schema-convert.test.ts +0 -70
  62. package/tests/transport-base.test.ts +0 -214
  63. package/tsconfig.json +0 -15
@@ -1,214 +0,0 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { BaseTransport } from "../src/transport-base.ts";
4
- import type { McpRequest, McpResponse, McpServerConfig } from "../src/types.ts";
5
-
6
- class TestableTransport extends BaseTransport {
7
- protected get transportName(): string {
8
- return "test";
9
- }
10
-
11
- async connect(): Promise<void> {
12
- this.connected = true;
13
- }
14
-
15
- async disconnect(): Promise<void> {
16
- this.connected = false;
17
- }
18
-
19
- async sendRequest(_request: McpRequest): Promise<McpResponse> {
20
- return { jsonrpc: "2.0", id: 0, result: {} };
21
- }
22
-
23
- async sendNotification(_notification: any): Promise<void> {
24
- return;
25
- }
26
-
27
- testHandleMessage(message: any): void {
28
- this.handleMessage(message);
29
- }
30
-
31
- testScheduleReconnect(): void {
32
- this.scheduleReconnect();
33
- }
34
-
35
- testRejectAllPending(reason: string): void {
36
- this.rejectAllPending(reason);
37
- }
38
-
39
- testCleanupReconnectTimer(): void {
40
- this.cleanupReconnectTimer();
41
- }
42
-
43
- getPendingRequests() {
44
- return this.pendingRequests;
45
- }
46
-
47
- setConnected(value: boolean): void {
48
- this.connected = value;
49
- }
50
-
51
- getReconnectTimer() {
52
- return this.reconnectTimer;
53
- }
54
- }
55
-
56
- function makeLogger() {
57
- return {
58
- debugCalls: [] as string[],
59
- errorCalls: [] as any[],
60
- infoCalls: [] as string[],
61
- debug(msg: string) {
62
- this.debugCalls.push(msg);
63
- },
64
- error(...args: any[]) {
65
- this.errorCalls.push(args);
66
- },
67
- info(msg: string) {
68
- this.infoCalls.push(msg);
69
- },
70
- };
71
- }
72
-
73
- function makeTransport(onReconnected?: () => Promise<void>) {
74
- const config: McpServerConfig = { transport: "sse", url: "http://localhost:1234/sse" };
75
- const clientConfig = { reconnectIntervalMs: 10_000 };
76
- const logger = makeLogger();
77
- const transport = new TestableTransport(config, clientConfig, logger, onReconnected);
78
- return { transport, logger };
79
- }
80
-
81
- test("handleMessage resolves pending request when response.id matches", async () => {
82
- const { transport } = makeTransport();
83
-
84
- let resolved: any;
85
- const promise = new Promise((resolve, reject) => {
86
- const timeout = setTimeout(() => reject(new Error("timeout")), 1000);
87
- transport.getPendingRequests().set(1, { resolve, reject, timeout });
88
- });
89
-
90
- transport.testHandleMessage({ jsonrpc: "2.0", id: 1, result: { ok: true } });
91
-
92
- resolved = await promise;
93
- assert.deepEqual(resolved, { jsonrpc: "2.0", id: 1, result: { ok: true } });
94
- assert.equal(transport.getPendingRequests().size, 0);
95
- });
96
-
97
- test("handleMessage rejects pending request when response has error", async () => {
98
- const { transport } = makeTransport();
99
-
100
- const promise = new Promise((resolve, reject) => {
101
- const timeout = setTimeout(() => reject(new Error("timeout")), 1000);
102
- transport.getPendingRequests().set(2, { resolve, reject, timeout });
103
- });
104
-
105
- transport.testHandleMessage({ jsonrpc: "2.0", id: 2, error: { code: -1, message: "boom" } });
106
-
107
- await assert.rejects(promise, /boom/);
108
- assert.equal(transport.getPendingRequests().size, 0);
109
- });
110
-
111
- test("handleMessage ignores messages with unknown id (no crash)", () => {
112
- const { transport } = makeTransport();
113
-
114
- assert.doesNotThrow(() => {
115
- transport.testHandleMessage({ jsonrpc: "2.0", id: 999, result: { ok: true } });
116
- });
117
-
118
- assert.equal(transport.getPendingRequests().size, 0);
119
- });
120
-
121
- test("handleMessage calls onReconnected on notifications/tools/list_changed", async () => {
122
- let called = 0;
123
- const { transport } = makeTransport(async () => {
124
- called += 1;
125
- });
126
-
127
- transport.testHandleMessage({ jsonrpc: "2.0", method: "notifications/tools/list_changed" });
128
-
129
- await new Promise((resolve) => setImmediate(resolve));
130
- assert.equal(called, 1);
131
- });
132
-
133
- test("handleMessage logs debug for unknown notifications", () => {
134
- const { transport, logger } = makeTransport();
135
-
136
- assert.doesNotThrow(() => {
137
- transport.testHandleMessage({ jsonrpc: "2.0", method: "notifications/other" });
138
- });
139
-
140
- assert.equal(logger.debugCalls.length, 1);
141
- assert.match(logger.debugCalls[0], /Unhandled test notification: notifications\/other/);
142
- });
143
-
144
- test("rejectAllPending rejects all pending and clears the map", async () => {
145
- const { transport } = makeTransport();
146
-
147
- const p1 = new Promise((resolve, reject) => {
148
- const timeout = setTimeout(() => reject(new Error("timeout")), 1000);
149
- transport.getPendingRequests().set(1, { resolve, reject, timeout });
150
- });
151
- const p2 = new Promise((resolve, reject) => {
152
- const timeout = setTimeout(() => reject(new Error("timeout")), 1000);
153
- transport.getPendingRequests().set(2, { resolve, reject, timeout });
154
- });
155
-
156
- transport.testRejectAllPending("cancelled");
157
-
158
- await assert.rejects(p1, /cancelled/);
159
- await assert.rejects(p2, /cancelled/);
160
- assert.equal(transport.getPendingRequests().size, 0);
161
- });
162
-
163
- test("rejectAllPending with empty map doesn't crash", () => {
164
- const { transport } = makeTransport();
165
-
166
- assert.doesNotThrow(() => {
167
- transport.testRejectAllPending("anything");
168
- });
169
-
170
- assert.equal(transport.getPendingRequests().size, 0);
171
- });
172
-
173
- test("scheduleReconnect sets connected=false and rejects pending", async () => {
174
- const { transport } = makeTransport();
175
- transport.setConnected(true);
176
-
177
- const pending = new Promise((resolve, reject) => {
178
- const timeout = setTimeout(() => reject(new Error("timeout")), 1000);
179
- transport.getPendingRequests().set(10, { resolve, reject, timeout });
180
- });
181
-
182
- transport.testScheduleReconnect();
183
-
184
- assert.equal(transport.isConnected(), false);
185
- await assert.rejects(pending, /Connection lost, request cancelled/);
186
- assert.equal(transport.getPendingRequests().size, 0);
187
-
188
- transport.testCleanupReconnectTimer();
189
- });
190
-
191
- test("scheduleReconnect doesn't schedule twice (idempotent)", () => {
192
- const { transport } = makeTransport();
193
-
194
- transport.testScheduleReconnect();
195
- const firstTimer = transport.getReconnectTimer();
196
-
197
- transport.testScheduleReconnect();
198
- const secondTimer = transport.getReconnectTimer();
199
-
200
- assert.ok(firstTimer);
201
- assert.equal(firstTimer, secondTimer);
202
-
203
- transport.testCleanupReconnectTimer();
204
- });
205
-
206
- test("cleanupReconnectTimer clears the timer", () => {
207
- const { transport } = makeTransport();
208
-
209
- transport.testScheduleReconnect();
210
- assert.ok(transport.getReconnectTimer());
211
-
212
- transport.testCleanupReconnectTimer();
213
- assert.equal(transport.getReconnectTimer(), null);
214
- });
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "Node16",
5
- "moduleResolution": "Node16",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "outDir": "dist",
10
- "rootDir": ".",
11
- "declaration": true
12
- },
13
- "include": ["src/**/*.ts", "bin/**/*.ts"],
14
- "exclude": ["node_modules", "dist", "tests"]
15
- }