@metorial/mcp-transport-memory 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ InMemoryClientTransport: () => InMemoryClientTransport,
24
+ InMemoryServerTransport: () => InMemoryServerTransport,
25
+ createInMemoryTransport: () => createInMemoryTransport
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/transport.ts
30
+ var InMemoryServerTransport = class {
31
+ _started = false;
32
+ _closed = false;
33
+ _clientTransport;
34
+ onclose;
35
+ onerror;
36
+ onmessage;
37
+ _connect(clientTransport) {
38
+ this._clientTransport = clientTransport;
39
+ }
40
+ _receiveMessage(message) {
41
+ if (this._closed) return;
42
+ setTimeout(() => {
43
+ if (!this._closed) this.onmessage?.(message);
44
+ }, 0);
45
+ }
46
+ _handleClientClose() {
47
+ if (!this._closed) {
48
+ this._closed = true;
49
+ this.onclose?.();
50
+ }
51
+ }
52
+ async start() {
53
+ if (this._started) {
54
+ throw new Error("InMemoryServerTransport already started!");
55
+ }
56
+ if (this._closed) {
57
+ throw new Error("InMemoryServerTransport is closed and cannot be restarted!");
58
+ }
59
+ this._started = true;
60
+ }
61
+ async close() {
62
+ if (this._closed) return;
63
+ this._closed = true;
64
+ if (this._clientTransport) {
65
+ this._clientTransport._handleServerClose();
66
+ }
67
+ this.onclose?.();
68
+ }
69
+ async send(message) {
70
+ if (this._closed) {
71
+ throw new Error("Transport is closed");
72
+ }
73
+ if (!this._clientTransport) {
74
+ throw new Error("Not connected to client transport");
75
+ }
76
+ this._clientTransport._receiveMessage(message);
77
+ }
78
+ };
79
+ var InMemoryClientTransport = class {
80
+ _started = false;
81
+ _closed = false;
82
+ _serverTransport;
83
+ onclose;
84
+ onerror;
85
+ onmessage;
86
+ _connect(serverTransport) {
87
+ this._serverTransport = serverTransport;
88
+ }
89
+ _receiveMessage(message) {
90
+ if (this._closed) return;
91
+ setTimeout(() => {
92
+ if (!this._closed) this.onmessage?.(message);
93
+ }, 0);
94
+ }
95
+ _handleServerClose() {
96
+ if (!this._closed) {
97
+ this._closed = true;
98
+ this.onclose?.();
99
+ }
100
+ }
101
+ async start() {
102
+ if (this._started) {
103
+ throw new Error("InMemoryClientTransport already started!");
104
+ }
105
+ if (this._closed) {
106
+ throw new Error("InMemoryClientTransport is closed and cannot be restarted!");
107
+ }
108
+ this._started = true;
109
+ }
110
+ async close() {
111
+ if (this._closed) return;
112
+ this._closed = true;
113
+ if (this._serverTransport) {
114
+ this._serverTransport._handleClientClose();
115
+ }
116
+ this.onclose?.();
117
+ }
118
+ async send(message) {
119
+ if (this._closed) {
120
+ throw new Error("Transport is closed");
121
+ }
122
+ if (!this._serverTransport) {
123
+ throw new Error("Not connected to server transport");
124
+ }
125
+ this._serverTransport._receiveMessage(message);
126
+ }
127
+ };
128
+ var createInMemoryTransport = () => {
129
+ let serverTransport = new InMemoryServerTransport();
130
+ let clientTransport = new InMemoryClientTransport();
131
+ serverTransport._connect(clientTransport);
132
+ clientTransport._connect(serverTransport);
133
+ return {
134
+ server: serverTransport,
135
+ client: clientTransport
136
+ };
137
+ };
138
+ // Annotate the CommonJS export names for ESM import in node:
139
+ 0 && (module.exports = {
140
+ InMemoryClientTransport,
141
+ InMemoryServerTransport,
142
+ createInMemoryTransport
143
+ });
144
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/transport.ts"],"sourcesContent":["export * from './transport';\n","import { type Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';\n\nexport interface InMemoryTransportPair {\n server: InMemoryServerTransport;\n client: InMemoryClientTransport;\n}\n\nexport class InMemoryServerTransport implements Transport {\n private _started = false;\n private _closed = false;\n private _clientTransport?: InMemoryClientTransport;\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n _connect(clientTransport: InMemoryClientTransport): void {\n this._clientTransport = clientTransport;\n }\n\n _receiveMessage(message: JSONRPCMessage): void {\n if (this._closed) return;\n\n setTimeout(() => {\n if (!this._closed) this.onmessage?.(message);\n }, 0);\n }\n\n _handleClientClose(): void {\n if (!this._closed) {\n this._closed = true;\n this.onclose?.();\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error('InMemoryServerTransport already started!');\n }\n if (this._closed) {\n throw new Error('InMemoryServerTransport is closed and cannot be restarted!');\n }\n\n this._started = true;\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n\n this._closed = true;\n\n // Notify the client transport that we're closing\n if (this._clientTransport) {\n this._clientTransport._handleServerClose();\n }\n\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (this._closed) {\n throw new Error('Transport is closed');\n }\n if (!this._clientTransport) {\n throw new Error('Not connected to client transport');\n }\n\n this._clientTransport._receiveMessage(message);\n }\n}\n\nexport class InMemoryClientTransport implements Transport {\n private _started = false;\n private _closed = false;\n private _serverTransport?: InMemoryServerTransport;\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n _connect(serverTransport: InMemoryServerTransport): void {\n this._serverTransport = serverTransport;\n }\n\n _receiveMessage(message: JSONRPCMessage): void {\n if (this._closed) return;\n\n setTimeout(() => {\n if (!this._closed) this.onmessage?.(message);\n }, 0);\n }\n\n _handleServerClose(): void {\n if (!this._closed) {\n this._closed = true;\n this.onclose?.();\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error('InMemoryClientTransport already started!');\n }\n if (this._closed) {\n throw new Error('InMemoryClientTransport is closed and cannot be restarted!');\n }\n\n this._started = true;\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n\n this._closed = true;\n\n if (this._serverTransport) {\n this._serverTransport._handleClientClose();\n }\n\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (this._closed) {\n throw new Error('Transport is closed');\n }\n if (!this._serverTransport) {\n throw new Error('Not connected to server transport');\n }\n\n this._serverTransport._receiveMessage(message);\n }\n}\n\nexport let createInMemoryTransport = (): InMemoryTransportPair => {\n let serverTransport = new InMemoryServerTransport();\n let clientTransport = new InMemoryClientTransport();\n\n serverTransport._connect(clientTransport);\n clientTransport._connect(serverTransport);\n\n return {\n server: serverTransport,\n client: clientTransport\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,0BAAN,MAAmD;AAAA,EAChD,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EAEA,SAAS,iBAAgD;AACvD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,gBAAgB,SAA+B;AAC7C,QAAI,KAAK,QAAS;AAElB,eAAW,MAAM;AACf,UAAI,CAAC,KAAK,QAAS,MAAK,YAAY,OAAO;AAAA,IAC7C,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,qBAA2B;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAElB,SAAK,UAAU;AAGf,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,mBAAmB;AAAA,IAC3C;AAEA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,SAAK,iBAAiB,gBAAgB,OAAO;AAAA,EAC/C;AACF;AAEO,IAAM,0BAAN,MAAmD;AAAA,EAChD,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EAEA,SAAS,iBAAgD;AACvD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,gBAAgB,SAA+B;AAC7C,QAAI,KAAK,QAAS;AAElB,eAAW,MAAM;AACf,UAAI,CAAC,KAAK,QAAS,MAAK,YAAY,OAAO;AAAA,IAC7C,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,qBAA2B;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAElB,SAAK,UAAU;AAEf,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,mBAAmB;AAAA,IAC3C;AAEA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,SAAK,iBAAiB,gBAAgB,OAAO;AAAA,EAC/C;AACF;AAEO,IAAI,0BAA0B,MAA6B;AAChE,MAAI,kBAAkB,IAAI,wBAAwB;AAClD,MAAI,kBAAkB,IAAI,wBAAwB;AAElD,kBAAgB,SAAS,eAAe;AACxC,kBAAgB,SAAS,eAAe;AAExC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;","names":[]}
@@ -0,0 +1,38 @@
1
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+
4
+ interface InMemoryTransportPair {
5
+ server: InMemoryServerTransport;
6
+ client: InMemoryClientTransport;
7
+ }
8
+ declare class InMemoryServerTransport implements Transport {
9
+ private _started;
10
+ private _closed;
11
+ private _clientTransport?;
12
+ onclose?: () => void;
13
+ onerror?: (error: Error) => void;
14
+ onmessage?: (message: JSONRPCMessage) => void;
15
+ _connect(clientTransport: InMemoryClientTransport): void;
16
+ _receiveMessage(message: JSONRPCMessage): void;
17
+ _handleClientClose(): void;
18
+ start(): Promise<void>;
19
+ close(): Promise<void>;
20
+ send(message: JSONRPCMessage): Promise<void>;
21
+ }
22
+ declare class InMemoryClientTransport implements Transport {
23
+ private _started;
24
+ private _closed;
25
+ private _serverTransport?;
26
+ onclose?: () => void;
27
+ onerror?: (error: Error) => void;
28
+ onmessage?: (message: JSONRPCMessage) => void;
29
+ _connect(serverTransport: InMemoryServerTransport): void;
30
+ _receiveMessage(message: JSONRPCMessage): void;
31
+ _handleServerClose(): void;
32
+ start(): Promise<void>;
33
+ close(): Promise<void>;
34
+ send(message: JSONRPCMessage): Promise<void>;
35
+ }
36
+ declare let createInMemoryTransport: () => InMemoryTransportPair;
37
+
38
+ export { InMemoryClientTransport, InMemoryServerTransport, type InMemoryTransportPair, createInMemoryTransport };
@@ -0,0 +1,38 @@
1
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+
4
+ interface InMemoryTransportPair {
5
+ server: InMemoryServerTransport;
6
+ client: InMemoryClientTransport;
7
+ }
8
+ declare class InMemoryServerTransport implements Transport {
9
+ private _started;
10
+ private _closed;
11
+ private _clientTransport?;
12
+ onclose?: () => void;
13
+ onerror?: (error: Error) => void;
14
+ onmessage?: (message: JSONRPCMessage) => void;
15
+ _connect(clientTransport: InMemoryClientTransport): void;
16
+ _receiveMessage(message: JSONRPCMessage): void;
17
+ _handleClientClose(): void;
18
+ start(): Promise<void>;
19
+ close(): Promise<void>;
20
+ send(message: JSONRPCMessage): Promise<void>;
21
+ }
22
+ declare class InMemoryClientTransport implements Transport {
23
+ private _started;
24
+ private _closed;
25
+ private _serverTransport?;
26
+ onclose?: () => void;
27
+ onerror?: (error: Error) => void;
28
+ onmessage?: (message: JSONRPCMessage) => void;
29
+ _connect(serverTransport: InMemoryServerTransport): void;
30
+ _receiveMessage(message: JSONRPCMessage): void;
31
+ _handleServerClose(): void;
32
+ start(): Promise<void>;
33
+ close(): Promise<void>;
34
+ send(message: JSONRPCMessage): Promise<void>;
35
+ }
36
+ declare let createInMemoryTransport: () => InMemoryTransportPair;
37
+
38
+ export { InMemoryClientTransport, InMemoryServerTransport, type InMemoryTransportPair, createInMemoryTransport };
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ // src/transport.ts
2
+ var InMemoryServerTransport = class {
3
+ _started = false;
4
+ _closed = false;
5
+ _clientTransport;
6
+ onclose;
7
+ onerror;
8
+ onmessage;
9
+ _connect(clientTransport) {
10
+ this._clientTransport = clientTransport;
11
+ }
12
+ _receiveMessage(message) {
13
+ if (this._closed) return;
14
+ setTimeout(() => {
15
+ if (!this._closed) this.onmessage?.(message);
16
+ }, 0);
17
+ }
18
+ _handleClientClose() {
19
+ if (!this._closed) {
20
+ this._closed = true;
21
+ this.onclose?.();
22
+ }
23
+ }
24
+ async start() {
25
+ if (this._started) {
26
+ throw new Error("InMemoryServerTransport already started!");
27
+ }
28
+ if (this._closed) {
29
+ throw new Error("InMemoryServerTransport is closed and cannot be restarted!");
30
+ }
31
+ this._started = true;
32
+ }
33
+ async close() {
34
+ if (this._closed) return;
35
+ this._closed = true;
36
+ if (this._clientTransport) {
37
+ this._clientTransport._handleServerClose();
38
+ }
39
+ this.onclose?.();
40
+ }
41
+ async send(message) {
42
+ if (this._closed) {
43
+ throw new Error("Transport is closed");
44
+ }
45
+ if (!this._clientTransport) {
46
+ throw new Error("Not connected to client transport");
47
+ }
48
+ this._clientTransport._receiveMessage(message);
49
+ }
50
+ };
51
+ var InMemoryClientTransport = class {
52
+ _started = false;
53
+ _closed = false;
54
+ _serverTransport;
55
+ onclose;
56
+ onerror;
57
+ onmessage;
58
+ _connect(serverTransport) {
59
+ this._serverTransport = serverTransport;
60
+ }
61
+ _receiveMessage(message) {
62
+ if (this._closed) return;
63
+ setTimeout(() => {
64
+ if (!this._closed) this.onmessage?.(message);
65
+ }, 0);
66
+ }
67
+ _handleServerClose() {
68
+ if (!this._closed) {
69
+ this._closed = true;
70
+ this.onclose?.();
71
+ }
72
+ }
73
+ async start() {
74
+ if (this._started) {
75
+ throw new Error("InMemoryClientTransport already started!");
76
+ }
77
+ if (this._closed) {
78
+ throw new Error("InMemoryClientTransport is closed and cannot be restarted!");
79
+ }
80
+ this._started = true;
81
+ }
82
+ async close() {
83
+ if (this._closed) return;
84
+ this._closed = true;
85
+ if (this._serverTransport) {
86
+ this._serverTransport._handleClientClose();
87
+ }
88
+ this.onclose?.();
89
+ }
90
+ async send(message) {
91
+ if (this._closed) {
92
+ throw new Error("Transport is closed");
93
+ }
94
+ if (!this._serverTransport) {
95
+ throw new Error("Not connected to server transport");
96
+ }
97
+ this._serverTransport._receiveMessage(message);
98
+ }
99
+ };
100
+ var createInMemoryTransport = () => {
101
+ let serverTransport = new InMemoryServerTransport();
102
+ let clientTransport = new InMemoryClientTransport();
103
+ serverTransport._connect(clientTransport);
104
+ clientTransport._connect(serverTransport);
105
+ return {
106
+ server: serverTransport,
107
+ client: clientTransport
108
+ };
109
+ };
110
+ export {
111
+ InMemoryClientTransport,
112
+ InMemoryServerTransport,
113
+ createInMemoryTransport
114
+ };
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transport.ts"],"sourcesContent":["import { type Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';\n\nexport interface InMemoryTransportPair {\n server: InMemoryServerTransport;\n client: InMemoryClientTransport;\n}\n\nexport class InMemoryServerTransport implements Transport {\n private _started = false;\n private _closed = false;\n private _clientTransport?: InMemoryClientTransport;\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n _connect(clientTransport: InMemoryClientTransport): void {\n this._clientTransport = clientTransport;\n }\n\n _receiveMessage(message: JSONRPCMessage): void {\n if (this._closed) return;\n\n setTimeout(() => {\n if (!this._closed) this.onmessage?.(message);\n }, 0);\n }\n\n _handleClientClose(): void {\n if (!this._closed) {\n this._closed = true;\n this.onclose?.();\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error('InMemoryServerTransport already started!');\n }\n if (this._closed) {\n throw new Error('InMemoryServerTransport is closed and cannot be restarted!');\n }\n\n this._started = true;\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n\n this._closed = true;\n\n // Notify the client transport that we're closing\n if (this._clientTransport) {\n this._clientTransport._handleServerClose();\n }\n\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (this._closed) {\n throw new Error('Transport is closed');\n }\n if (!this._clientTransport) {\n throw new Error('Not connected to client transport');\n }\n\n this._clientTransport._receiveMessage(message);\n }\n}\n\nexport class InMemoryClientTransport implements Transport {\n private _started = false;\n private _closed = false;\n private _serverTransport?: InMemoryServerTransport;\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n _connect(serverTransport: InMemoryServerTransport): void {\n this._serverTransport = serverTransport;\n }\n\n _receiveMessage(message: JSONRPCMessage): void {\n if (this._closed) return;\n\n setTimeout(() => {\n if (!this._closed) this.onmessage?.(message);\n }, 0);\n }\n\n _handleServerClose(): void {\n if (!this._closed) {\n this._closed = true;\n this.onclose?.();\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error('InMemoryClientTransport already started!');\n }\n if (this._closed) {\n throw new Error('InMemoryClientTransport is closed and cannot be restarted!');\n }\n\n this._started = true;\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n\n this._closed = true;\n\n if (this._serverTransport) {\n this._serverTransport._handleClientClose();\n }\n\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (this._closed) {\n throw new Error('Transport is closed');\n }\n if (!this._serverTransport) {\n throw new Error('Not connected to server transport');\n }\n\n this._serverTransport._receiveMessage(message);\n }\n}\n\nexport let createInMemoryTransport = (): InMemoryTransportPair => {\n let serverTransport = new InMemoryServerTransport();\n let clientTransport = new InMemoryClientTransport();\n\n serverTransport._connect(clientTransport);\n clientTransport._connect(serverTransport);\n\n return {\n server: serverTransport,\n client: clientTransport\n };\n};\n"],"mappings":";AAQO,IAAM,0BAAN,MAAmD;AAAA,EAChD,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EAEA,SAAS,iBAAgD;AACvD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,gBAAgB,SAA+B;AAC7C,QAAI,KAAK,QAAS;AAElB,eAAW,MAAM;AACf,UAAI,CAAC,KAAK,QAAS,MAAK,YAAY,OAAO;AAAA,IAC7C,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,qBAA2B;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAElB,SAAK,UAAU;AAGf,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,mBAAmB;AAAA,IAC3C;AAEA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,SAAK,iBAAiB,gBAAgB,OAAO;AAAA,EAC/C;AACF;AAEO,IAAM,0BAAN,MAAmD;AAAA,EAChD,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EAEA,SAAS,iBAAgD;AACvD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,gBAAgB,SAA+B;AAC7C,QAAI,KAAK,QAAS;AAElB,eAAW,MAAM;AACf,UAAI,CAAC,KAAK,QAAS,MAAK,YAAY,OAAO;AAAA,IAC7C,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,qBAA2B;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAElB,SAAK,UAAU;AAEf,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,mBAAmB;AAAA,IAC3C;AAEA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,SAAK,iBAAiB,gBAAgB,OAAO;AAAA,EAC/C;AACF;AAEO,IAAI,0BAA0B,MAA6B;AAChE,MAAI,kBAAkB,IAAI,wBAAwB;AAClD,MAAI,kBAAkB,IAAI,wBAAwB;AAElD,kBAAgB,SAAS,eAAe;AACxC,kBAAgB,SAAS,eAAe;AAExC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@metorial/mcp-transport-memory",
3
+ "version": "1.0.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "files": [
8
+ "src/**",
9
+ "dist/**",
10
+ "README.md",
11
+ "package.json"
12
+ ],
13
+ "author": "Tobias Herber",
14
+ "license": "Apache 2",
15
+ "type": "module",
16
+ "source": "src/index.ts",
17
+ "exports": {
18
+ "types": "./dist/index.d.ts",
19
+ "require": "./dist/index.cjs",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "main": "./dist/index.cjs",
24
+ "module": "./dist/index.js",
25
+ "types": "dist/index.d.ts",
26
+ "unpkg": "./dist/index.cjs",
27
+ "scripts": {
28
+ "test": "vitest run --passWithNoTests",
29
+ "lint": "prettier src/**/*.ts --check",
30
+ "build": "rm -rf ./dist && tsup"
31
+ },
32
+ "devDependencies": {
33
+ "typescript": "^5.8.3",
34
+ "vitest": "^3.1.2",
35
+ "tsup": "^8.5.1"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.25.3"
39
+ }
40
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './transport';
@@ -0,0 +1,147 @@
1
+ import { type Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+
4
+ export interface InMemoryTransportPair {
5
+ server: InMemoryServerTransport;
6
+ client: InMemoryClientTransport;
7
+ }
8
+
9
+ export class InMemoryServerTransport implements Transport {
10
+ private _started = false;
11
+ private _closed = false;
12
+ private _clientTransport?: InMemoryClientTransport;
13
+
14
+ onclose?: () => void;
15
+ onerror?: (error: Error) => void;
16
+ onmessage?: (message: JSONRPCMessage) => void;
17
+
18
+ _connect(clientTransport: InMemoryClientTransport): void {
19
+ this._clientTransport = clientTransport;
20
+ }
21
+
22
+ _receiveMessage(message: JSONRPCMessage): void {
23
+ if (this._closed) return;
24
+
25
+ setTimeout(() => {
26
+ if (!this._closed) this.onmessage?.(message);
27
+ }, 0);
28
+ }
29
+
30
+ _handleClientClose(): void {
31
+ if (!this._closed) {
32
+ this._closed = true;
33
+ this.onclose?.();
34
+ }
35
+ }
36
+
37
+ async start(): Promise<void> {
38
+ if (this._started) {
39
+ throw new Error('InMemoryServerTransport already started!');
40
+ }
41
+ if (this._closed) {
42
+ throw new Error('InMemoryServerTransport is closed and cannot be restarted!');
43
+ }
44
+
45
+ this._started = true;
46
+ }
47
+
48
+ async close(): Promise<void> {
49
+ if (this._closed) return;
50
+
51
+ this._closed = true;
52
+
53
+ // Notify the client transport that we're closing
54
+ if (this._clientTransport) {
55
+ this._clientTransport._handleServerClose();
56
+ }
57
+
58
+ this.onclose?.();
59
+ }
60
+
61
+ async send(message: JSONRPCMessage): Promise<void> {
62
+ if (this._closed) {
63
+ throw new Error('Transport is closed');
64
+ }
65
+ if (!this._clientTransport) {
66
+ throw new Error('Not connected to client transport');
67
+ }
68
+
69
+ this._clientTransport._receiveMessage(message);
70
+ }
71
+ }
72
+
73
+ export class InMemoryClientTransport implements Transport {
74
+ private _started = false;
75
+ private _closed = false;
76
+ private _serverTransport?: InMemoryServerTransport;
77
+
78
+ onclose?: () => void;
79
+ onerror?: (error: Error) => void;
80
+ onmessage?: (message: JSONRPCMessage) => void;
81
+
82
+ _connect(serverTransport: InMemoryServerTransport): void {
83
+ this._serverTransport = serverTransport;
84
+ }
85
+
86
+ _receiveMessage(message: JSONRPCMessage): void {
87
+ if (this._closed) return;
88
+
89
+ setTimeout(() => {
90
+ if (!this._closed) this.onmessage?.(message);
91
+ }, 0);
92
+ }
93
+
94
+ _handleServerClose(): void {
95
+ if (!this._closed) {
96
+ this._closed = true;
97
+ this.onclose?.();
98
+ }
99
+ }
100
+
101
+ async start(): Promise<void> {
102
+ if (this._started) {
103
+ throw new Error('InMemoryClientTransport already started!');
104
+ }
105
+ if (this._closed) {
106
+ throw new Error('InMemoryClientTransport is closed and cannot be restarted!');
107
+ }
108
+
109
+ this._started = true;
110
+ }
111
+
112
+ async close(): Promise<void> {
113
+ if (this._closed) return;
114
+
115
+ this._closed = true;
116
+
117
+ if (this._serverTransport) {
118
+ this._serverTransport._handleClientClose();
119
+ }
120
+
121
+ this.onclose?.();
122
+ }
123
+
124
+ async send(message: JSONRPCMessage): Promise<void> {
125
+ if (this._closed) {
126
+ throw new Error('Transport is closed');
127
+ }
128
+ if (!this._serverTransport) {
129
+ throw new Error('Not connected to server transport');
130
+ }
131
+
132
+ this._serverTransport._receiveMessage(message);
133
+ }
134
+ }
135
+
136
+ export let createInMemoryTransport = (): InMemoryTransportPair => {
137
+ let serverTransport = new InMemoryServerTransport();
138
+ let clientTransport = new InMemoryClientTransport();
139
+
140
+ serverTransport._connect(clientTransport);
141
+ clientTransport._connect(serverTransport);
142
+
143
+ return {
144
+ server: serverTransport,
145
+ client: clientTransport
146
+ };
147
+ };