@contextvm/sdk 0.1.1 → 0.1.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 (71) hide show
  1. package/README.md +178 -2
  2. package/dist/esm/core/constants.d.ts +65 -0
  3. package/dist/esm/core/constants.d.ts.map +1 -0
  4. package/dist/esm/core/constants.js +70 -0
  5. package/dist/esm/core/constants.js.map +1 -0
  6. package/dist/esm/core/encryption.d.ts +18 -0
  7. package/dist/esm/core/encryption.d.ts.map +1 -0
  8. package/dist/esm/core/encryption.js +40 -0
  9. package/dist/esm/core/encryption.js.map +1 -0
  10. package/dist/esm/core/index.d.ts +5 -0
  11. package/dist/esm/core/index.d.ts.map +1 -0
  12. package/dist/esm/core/index.js +5 -0
  13. package/dist/esm/core/index.js.map +1 -0
  14. package/dist/esm/core/interfaces.d.ts +39 -0
  15. package/dist/esm/core/interfaces.d.ts.map +1 -0
  16. package/dist/esm/core/interfaces.js +13 -0
  17. package/dist/esm/core/interfaces.js.map +1 -0
  18. package/dist/esm/core/utils/serializers.d.ts +29 -0
  19. package/dist/esm/core/utils/serializers.d.ts.map +1 -0
  20. package/dist/esm/core/utils/serializers.js +46 -0
  21. package/dist/esm/core/utils/serializers.js.map +1 -0
  22. package/dist/esm/gateway/index.d.ts +60 -0
  23. package/dist/esm/gateway/index.d.ts.map +1 -0
  24. package/dist/esm/gateway/index.js +110 -0
  25. package/dist/esm/gateway/index.js.map +1 -0
  26. package/dist/esm/index.d.ts +7 -0
  27. package/dist/esm/index.d.ts.map +1 -0
  28. package/dist/esm/index.js +7 -0
  29. package/dist/esm/index.js.map +1 -0
  30. package/dist/esm/package.json +1 -0
  31. package/dist/esm/proxy/index.d.ts +42 -0
  32. package/dist/esm/proxy/index.d.ts.map +1 -0
  33. package/dist/esm/proxy/index.js +59 -0
  34. package/dist/esm/proxy/index.js.map +1 -0
  35. package/dist/esm/proxy/proxy-server.d.ts +3 -0
  36. package/dist/esm/proxy/proxy-server.d.ts.map +1 -0
  37. package/dist/esm/proxy/proxy-server.js +55 -0
  38. package/dist/esm/proxy/proxy-server.js.map +1 -0
  39. package/dist/esm/relay/index.d.ts +2 -0
  40. package/dist/esm/relay/index.d.ts.map +1 -0
  41. package/dist/esm/relay/index.js +2 -0
  42. package/dist/esm/relay/index.js.map +1 -0
  43. package/dist/esm/relay/simple-relay-pool.d.ts +19 -0
  44. package/dist/esm/relay/simple-relay-pool.d.ts.map +1 -0
  45. package/dist/esm/relay/simple-relay-pool.js +44 -0
  46. package/dist/esm/relay/simple-relay-pool.js.map +1 -0
  47. package/dist/esm/signer/index.d.ts +2 -0
  48. package/dist/esm/signer/index.d.ts.map +1 -0
  49. package/dist/esm/signer/index.js +2 -0
  50. package/dist/esm/signer/index.js.map +1 -0
  51. package/dist/esm/signer/private-key-signer.d.ts +16 -0
  52. package/dist/esm/signer/private-key-signer.d.ts.map +1 -0
  53. package/dist/esm/signer/private-key-signer.js +23 -0
  54. package/dist/esm/signer/private-key-signer.js.map +1 -0
  55. package/dist/esm/transport/base-nostr-transport.d.ts +67 -0
  56. package/dist/esm/transport/base-nostr-transport.d.ts.map +1 -0
  57. package/dist/esm/transport/base-nostr-transport.js +122 -0
  58. package/dist/esm/transport/base-nostr-transport.js.map +1 -0
  59. package/dist/esm/transport/index.d.ts +4 -0
  60. package/dist/esm/transport/index.d.ts.map +1 -0
  61. package/dist/esm/transport/index.js +4 -0
  62. package/dist/esm/transport/index.js.map +1 -0
  63. package/dist/esm/transport/nostr-client-transport.d.ts +60 -0
  64. package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -0
  65. package/dist/esm/transport/nostr-client-transport.js +116 -0
  66. package/dist/esm/transport/nostr-client-transport.js.map +1 -0
  67. package/dist/esm/transport/nostr-server-transport.d.ts +128 -0
  68. package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -0
  69. package/dist/esm/transport/nostr-server-transport.js +383 -0
  70. package/dist/esm/transport/nostr-server-transport.js.map +1 -0
  71. package/package.json +2 -2
@@ -0,0 +1,110 @@
1
+ import { NostrServerTransport, } from '../transport/nostr-server-transport.js';
2
+ /**
3
+ * The main gateway class that orchestrates communication between Nostr clients
4
+ * and a local MCP server. It acts as a bridge, receiving MCP requests via Nostr
5
+ * events and forwarding them to the local MCP server, then publishing the
6
+ * responses back to Nostr. All request/response correlation is handled by the
7
+ * NostrServerTransport, making this a simple message forwarder.
8
+ */
9
+ export class NostrMCPGateway {
10
+ constructor(options) {
11
+ this.isRunning = false;
12
+ this.mcpServerTransport = options.mcpServerTransport;
13
+ this.nostrServerTransport = new NostrServerTransport(options.nostrTransportOptions);
14
+ this.setupEventHandlers();
15
+ }
16
+ /**
17
+ * Sets up event handlers for both transports.
18
+ */
19
+ setupEventHandlers() {
20
+ // Forward messages from Nostr to the MCP server, handling any potential errors.
21
+ this.nostrServerTransport.onmessage = (message) => {
22
+ this.mcpServerTransport
23
+ .send(message)
24
+ .catch(this.handleServerError.bind(this));
25
+ };
26
+ this.nostrServerTransport.onerror = this.handleNostrError.bind(this);
27
+ this.nostrServerTransport.onclose = this.handleNostrClose.bind(this);
28
+ // Forward messages from the MCP server to the Nostr transport, handling any potential errors.
29
+ this.mcpServerTransport.onmessage = (message) => {
30
+ this.nostrServerTransport
31
+ .send(message)
32
+ .catch(this.handleNostrError.bind(this));
33
+ };
34
+ this.mcpServerTransport.onerror = this.handleServerError.bind(this);
35
+ this.mcpServerTransport.onclose = this.handleServerClose.bind(this);
36
+ }
37
+ /**
38
+ * Starts the gateway, initializing both transports.
39
+ */
40
+ async start() {
41
+ if (this.isRunning) {
42
+ throw new Error('Gateway is already running');
43
+ }
44
+ try {
45
+ // Start both transports
46
+ await this.nostrServerTransport.start();
47
+ await this.mcpServerTransport.start();
48
+ this.isRunning = true;
49
+ console.log('NostrMCPGateway started successfully');
50
+ }
51
+ catch (error) {
52
+ console.error('Failed to start NostrMCPGateway:', error);
53
+ await this.stop();
54
+ throw error;
55
+ }
56
+ }
57
+ /**
58
+ * Stops the gateway, closing both transports.
59
+ */
60
+ async stop() {
61
+ if (!this.isRunning) {
62
+ return;
63
+ }
64
+ try {
65
+ // Stop both transports
66
+ await this.nostrServerTransport.close();
67
+ await this.mcpServerTransport.close();
68
+ this.isRunning = false;
69
+ console.log('NostrMCPGateway stopped successfully');
70
+ }
71
+ catch (error) {
72
+ console.error('Error stopping NostrMCPGateway:', error);
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * Handles errors from the Nostr transport.
78
+ * @param error The error that occurred.
79
+ */
80
+ handleNostrError(error) {
81
+ console.error('Nostr transport error:', error);
82
+ }
83
+ /**
84
+ * Handles the Nostr transport closing.
85
+ */
86
+ handleNostrClose() {
87
+ console.log('Nostr transport closed');
88
+ }
89
+ /**
90
+ * Handles errors from the MCP server transport.
91
+ * @param error The error that occurred.
92
+ */
93
+ handleServerError(error) {
94
+ console.error('MCP server transport error:', error);
95
+ }
96
+ /**
97
+ * Handles the MCP server transport closing.
98
+ */
99
+ handleServerClose() {
100
+ console.log('MCP server transport closed');
101
+ }
102
+ /**
103
+ * Gets the current status of the gateway.
104
+ * @returns True if the gateway is running, false otherwise.
105
+ */
106
+ isActive() {
107
+ return this.isRunning;
108
+ }
109
+ }
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './core/index.js';
2
+ export * from './relay/index.js';
3
+ export * from './signer/index.js';
4
+ export * from './gateway/index.js';
5
+ export * from './proxy/index.js';
6
+ export * from './transport/index.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './core/index.js';
2
+ export * from './relay/index.js';
3
+ export * from './signer/index.js';
4
+ export * from './gateway/index.js';
5
+ export * from './proxy/index.js';
6
+ export * from './transport/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,42 @@
1
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { NostrTransportOptions } from '../transport/nostr-client-transport.js';
3
+ /**
4
+ * Options for configuring the NostrMCPProxy.
5
+ */
6
+ export interface NostrMCPProxyOptions {
7
+ /**
8
+ * The transport for the local MCP Host (e.g., StdioServerTransport).
9
+ */
10
+ mcpHostTransport: Transport;
11
+ /**
12
+ * Configuration options for the client-facing Nostr transport.
13
+ */
14
+ nostrTransportOptions: NostrTransportOptions;
15
+ }
16
+ /**
17
+ * `NostrMCPProxy` acts as a bridge between a local MCP Host
18
+ * and a remote MCP Server accessible via the Nostr network.
19
+ *
20
+ * It listens for MCP messages from the local host, forwards them over Nostr,
21
+ * and relays the responses back.
22
+ */
23
+ export declare class NostrMCPProxy {
24
+ private mcpHostTransport;
25
+ private nostrTransport;
26
+ constructor(options: NostrMCPProxyOptions);
27
+ /**
28
+ * Starts the proxy, establishing connections to both the local MCP host
29
+ * and the remote Nostr transport.
30
+ *
31
+ * @returns Promise that resolves when both transports are started
32
+ */
33
+ start(): Promise<void>;
34
+ /**
35
+ * Stops the proxy and closes all connections.
36
+ *
37
+ * @returns Promise that resolves when both transports are closed
38
+ */
39
+ stop(): Promise<void>;
40
+ private setupEventHandlers;
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/proxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE1E,OAAO,EAEL,qBAAqB,EACtB,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,gBAAgB,EAAE,SAAS,CAAC;IAC5B;;OAEG;IACH,qBAAqB,EAAE,qBAAqB,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,oBAAoB;IAOzC;;;;;OAKG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC,OAAO,CAAC,kBAAkB;CAwB3B"}
@@ -0,0 +1,59 @@
1
+ import { NostrClientTransport, } from '../transport/nostr-client-transport.js';
2
+ /**
3
+ * `NostrMCPProxy` acts as a bridge between a local MCP Host
4
+ * and a remote MCP Server accessible via the Nostr network.
5
+ *
6
+ * It listens for MCP messages from the local host, forwards them over Nostr,
7
+ * and relays the responses back.
8
+ */
9
+ export class NostrMCPProxy {
10
+ constructor(options) {
11
+ this.mcpHostTransport = options.mcpHostTransport;
12
+ this.nostrTransport = new NostrClientTransport(options.nostrTransportOptions);
13
+ }
14
+ /**
15
+ * Starts the proxy, establishing connections to both the local MCP host
16
+ * and the remote Nostr transport.
17
+ *
18
+ * @returns Promise that resolves when both transports are started
19
+ */
20
+ async start() {
21
+ // Set up message handlers
22
+ this.setupEventHandlers();
23
+ // Start both transports
24
+ await Promise.all([
25
+ this.mcpHostTransport.start(),
26
+ this.nostrTransport.start(),
27
+ ]);
28
+ console.log('NostrMCPProxy started.');
29
+ }
30
+ /**
31
+ * Stops the proxy and closes all connections.
32
+ *
33
+ * @returns Promise that resolves when both transports are closed
34
+ */
35
+ async stop() {
36
+ await this.mcpHostTransport.close();
37
+ await this.nostrTransport.close();
38
+ console.log('NostrMCPProxy stopped.');
39
+ }
40
+ setupEventHandlers() {
41
+ // Forward messages from the local host to Nostr.
42
+ this.mcpHostTransport.onmessage = (message) => {
43
+ this.nostrTransport
44
+ .send(message)
45
+ .catch((err) => console.error('Error sending message to Nostr:', err));
46
+ };
47
+ this.mcpHostTransport.onerror = (err) => console.error('MCP Host Transport Error:', err);
48
+ this.mcpHostTransport.onclose = () => console.log('MCP Host Transport closed');
49
+ // Forward messages from Nostr back to the local host.
50
+ this.nostrTransport.onmessage = (message) => {
51
+ this.mcpHostTransport
52
+ .send(message)
53
+ .catch((err) => console.error('Error sending message to local host:', err));
54
+ };
55
+ this.nostrTransport.onerror = (err) => console.error('Nostr Transport Error:', err);
56
+ this.nostrTransport.onclose = () => console.log('Nostr Transport closed');
57
+ }
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/proxy/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,GAErB,MAAM,wCAAwC,CAAC;AAgBhD;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAIxB,YAAY,OAA6B;QACvC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,oBAAoB,CAC5C,OAAO,CAAC,qBAAqB,CAC9B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,KAAK;QAChB,0BAA0B;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,wBAAwB;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;SAC5B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAEO,kBAAkB;QACxB,iDAAiD;QACjD,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,OAAuB,EAAE,EAAE;YAC5D,IAAI,CAAC,cAAc;iBAChB,IAAI,CAAC,OAAO,CAAC;iBACb,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,CACtC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,GAAG,EAAE,CACnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAE3C,sDAAsD;QACtD,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC,OAAuB,EAAE,EAAE;YAC1D,IAAI,CAAC,gBAAgB;iBAClB,IAAI,CAAC,OAAO,CAAC;iBACb,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAC3D,CAAC;QACN,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,CACpC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC5E,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=proxy-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../../src/proxy/proxy-server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bun
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { NostrMCPProxy } from './index.js';
4
+ import { PrivateKeySigner } from '../signer/private-key-signer.js';
5
+ import { SimpleRelayPool } from '../relay/simple-relay-pool.js';
6
+ /**
7
+ * Proxy server that exposes a remote Nostr MCP server via stdio.
8
+ * This allows MCP clients to connect to remote servers through the Nostr network.
9
+ */
10
+ async function main() {
11
+ // Get configuration from environment variables
12
+ const relayUrl = process.env.RELAY_URL || 'ws://localhost:7777';
13
+ const clientPrivateKey = process.env.CLIENT_PRIVATE_KEY;
14
+ const serverPubkey = process.env.SERVER_PUBKEY;
15
+ if (!clientPrivateKey) {
16
+ console.error('CLIENT_PRIVATE_KEY environment variable is required');
17
+ process.exit(1);
18
+ }
19
+ if (!serverPubkey) {
20
+ console.error('SERVER_PUBKEY environment variable is required');
21
+ process.exit(1);
22
+ }
23
+ // Set up stdio transport for the server
24
+ const transport = new StdioServerTransport();
25
+ // Create Nostr components
26
+ const signer = new PrivateKeySigner(clientPrivateKey);
27
+ const relayPool = new SimpleRelayPool([relayUrl]);
28
+ // Create and start the proxy
29
+ const proxy = new NostrMCPProxy({
30
+ mcpHostTransport: transport,
31
+ nostrTransportOptions: {
32
+ signer,
33
+ relayHandler: relayPool,
34
+ serverPubkey,
35
+ },
36
+ });
37
+ // Handle cleanup on process termination
38
+ process.on('SIGINT', async () => {
39
+ await proxy.stop();
40
+ process.exit(0);
41
+ });
42
+ process.on('SIGTERM', async () => {
43
+ await proxy.stop();
44
+ process.exit(0);
45
+ });
46
+ // Start the proxy
47
+ await proxy.start();
48
+ console.error('Proxy server started and connected to stdio');
49
+ }
50
+ // Run the server
51
+ main().catch((error) => {
52
+ console.error('Proxy server error:', error);
53
+ process.exit(1);
54
+ });
55
+ //# sourceMappingURL=proxy-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.js","sourceRoot":"","sources":["../../../src/proxy/proxy-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;GAGG;AACH,KAAK,UAAU,IAAI;IACjB,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,qBAAqB,CAAC;IAChE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElD,6BAA6B;IAC7B,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC;QAC9B,gBAAgB,EAAE,SAAS;QAC3B,qBAAqB,EAAE;YACrB,MAAM;YACN,YAAY,EAAE,SAAS;YACvB,YAAY;SACb;KACF,CAAC,CAAC;IAEH,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAC/D,CAAC;AAED,iBAAiB;AACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './simple-relay-pool.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/relay/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './simple-relay-pool.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/relay/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type Filter, type NostrEvent } from 'nostr-tools';
2
+ import { RelayHandler } from '../core/interfaces.js';
3
+ /**
4
+ * A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
5
+ * @argument relayUrls - An array of relay URLs to connect to.
6
+ * @returns A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
7
+ */
8
+ export declare class SimpleRelayPool implements RelayHandler {
9
+ private readonly relayUrls;
10
+ private pool;
11
+ private subscriptions;
12
+ constructor(relayUrls: string[]);
13
+ connect(): Promise<void>;
14
+ disconnect(relayUrls?: string[]): Promise<void>;
15
+ publish(event: NostrEvent): Promise<void>;
16
+ subscribe(filters: Filter[], onEvent: (event: NostrEvent) => void, onEose?: () => void): Promise<void>;
17
+ unsubscribe(): void;
18
+ }
19
+ //# sourceMappingURL=simple-relay-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-relay-pool.d.ts","sourceRoot":"","sources":["../../../src/relay/simple-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,aAAa,CAAmB;gBAE5B,SAAS,EAAE,MAAM,EAAE;IAKzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,MAAM,CAAC,EAAE,MAAM,IAAI,GAClB,OAAO,CAAC,IAAI,CAAC;IAQhB,WAAW,IAAI,IAAI;CAKpB"}
@@ -0,0 +1,44 @@
1
+ import { SimplePool } from 'nostr-tools';
2
+ /**
3
+ * A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
4
+ * @argument relayUrls - An array of relay URLs to connect to.
5
+ * @returns A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
6
+ */
7
+ export class SimpleRelayPool {
8
+ constructor(relayUrls) {
9
+ this.subscriptions = [];
10
+ this.relayUrls = relayUrls;
11
+ this.pool = new SimplePool();
12
+ }
13
+ async connect() {
14
+ this.relayUrls.forEach((url) => {
15
+ const normalizedUrl = new URL(url).href;
16
+ if (!this.pool.listConnectionStatus().get(normalizedUrl)) {
17
+ this.pool.ensureRelay(url, { connectionTimeout: 5000 });
18
+ }
19
+ });
20
+ }
21
+ async disconnect(relayUrls) {
22
+ if (!relayUrls) {
23
+ relayUrls = this.relayUrls;
24
+ }
25
+ this.pool.close(relayUrls);
26
+ await Bun.sleep(100);
27
+ }
28
+ async publish(event) {
29
+ await Promise.all(this.pool.publish(this.relayUrls, event));
30
+ }
31
+ async subscribe(filters, onEvent, onEose) {
32
+ const sub = this.pool.subscribeMany(this.relayUrls, filters, {
33
+ onevent: onEvent,
34
+ oneose: onEose,
35
+ });
36
+ this.subscriptions.push(sub);
37
+ }
38
+ unsubscribe() {
39
+ this.subscriptions.forEach((sub) => {
40
+ sub.close();
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=simple-relay-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-relay-pool.js","sourceRoot":"","sources":["../../../src/relay/simple-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAC;AAIvE;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAK1B,YAAY,SAAmB;QAFvB,kBAAa,GAAgB,EAAE,CAAC;QAGtC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAoB;QACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3B,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAiB;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAiB,EACjB,OAAoC,EACpC,MAAmB;QAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YAC3D,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from './private-key-signer.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './private-key-signer.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/signer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type NostrEvent, type UnsignedEvent } from 'nostr-tools';
2
+ import { NostrSigner } from '../core/interfaces.js';
3
+ /**
4
+ * A signer that uses a private key to sign events.
5
+ * @argument privateKey - The private key to use for signing.
6
+ * @returns A signer that uses the provided private key to sign events.
7
+ */
8
+ export declare class PrivateKeySigner implements NostrSigner {
9
+ private readonly privateKey;
10
+ private readonly publicKey;
11
+ constructor(privateKey: string);
12
+ getSecretKey(): Promise<Uint8Array>;
13
+ getPublicKey(): Promise<string>;
14
+ signEvent(event: UnsignedEvent): Promise<NostrEvent>;
15
+ }
16
+ //# sourceMappingURL=private-key-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-key-signer.d.ts","sourceRoot":"","sources":["../../../src/signer/private-key-signer.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,UAAU,EAAE,MAAM;IAKxB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;CAG3D"}
@@ -0,0 +1,23 @@
1
+ import { hexToBytes } from '@noble/hashes/utils';
2
+ import { finalizeEvent, getPublicKey, } from 'nostr-tools';
3
+ /**
4
+ * A signer that uses a private key to sign events.
5
+ * @argument privateKey - The private key to use for signing.
6
+ * @returns A signer that uses the provided private key to sign events.
7
+ */
8
+ export class PrivateKeySigner {
9
+ constructor(privateKey) {
10
+ this.privateKey = hexToBytes(privateKey);
11
+ this.publicKey = getPublicKey(this.privateKey);
12
+ }
13
+ async getSecretKey() {
14
+ return this.privateKey;
15
+ }
16
+ async getPublicKey() {
17
+ return this.publicKey;
18
+ }
19
+ async signEvent(event) {
20
+ return finalizeEvent(event, this.privateKey);
21
+ }
22
+ }
23
+ //# sourceMappingURL=private-key-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-key-signer.js","sourceRoot":"","sources":["../../../src/signer/private-key-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,aAAa,EACb,YAAY,GAGb,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAI3B,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAoB;QAClC,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { Event as NostrEvent, Filter } from 'nostr-tools';
3
+ import { EncryptionMode, NostrSigner, RelayHandler } from '../core/interfaces.js';
4
+ /**
5
+ * Base options for configuring Nostr-based transports.
6
+ */
7
+ export interface BaseNostrTransportOptions {
8
+ signer: NostrSigner;
9
+ relayHandler: RelayHandler;
10
+ encryptionMode?: EncryptionMode;
11
+ }
12
+ /**
13
+ * Base class for Nostr-based transports that provides common functionality
14
+ * for managing Nostr connections, event conversion, and message handling.
15
+ */
16
+ export declare abstract class BaseNostrTransport {
17
+ protected readonly signer: NostrSigner;
18
+ protected readonly relayHandler: RelayHandler;
19
+ protected readonly encryptionMode: EncryptionMode;
20
+ protected isConnected: boolean;
21
+ constructor(options: BaseNostrTransportOptions);
22
+ /**
23
+ * Connects to the Nostr relay network.
24
+ */
25
+ protected connect(): Promise<void>;
26
+ /**
27
+ * Disconnects from the Nostr relay network.
28
+ */
29
+ protected disconnect(): Promise<void>;
30
+ /**
31
+ * Gets the public key from the signer.
32
+ */
33
+ protected getPublicKey(): Promise<string>;
34
+ /**
35
+ * Sets up a subscription to listen for Nostr events.
36
+ */
37
+ protected subscribe(filters: Filter[], onEvent: (event: NostrEvent) => void | Promise<void>): Promise<void>;
38
+ /**
39
+ * Converts a Nostr event to an MCP message.
40
+ */
41
+ protected convertNostrEventToMcpMessage(event: NostrEvent): JSONRPCMessage;
42
+ /**
43
+ * Converts an MCP message to a Nostr event and signs it.
44
+ */
45
+ protected createSignedNostrEvent(message: JSONRPCMessage, kind: number, tags?: NostrEvent['tags']): Promise<NostrEvent>;
46
+ /**
47
+ * Publishes a signed Nostr event to the relay network.
48
+ */
49
+ protected publishEvent(event: NostrEvent): Promise<void>;
50
+ /**
51
+ * Creates and publishes a Nostr event for an MCP message.
52
+ */
53
+ protected sendMcpMessage(message: JSONRPCMessage, recipientPublicKey: string, kind: number, tags?: NostrEvent['tags'], forceEncryption?: boolean): Promise<string>;
54
+ /**
55
+ * Creates subscription filters for listening to messages targeting a specific pubkey.
56
+ */
57
+ protected createSubscriptionFilters(targetPubkey: string, additionalFilters?: Partial<Filter>): Filter[];
58
+ /**
59
+ * Creates tags for targeting a specific recipient.
60
+ */
61
+ protected createRecipientTags(recipientPubkey: string): NostrEvent['tags'];
62
+ /**
63
+ * Creates tags for responding to a specific event.
64
+ */
65
+ protected createResponseTags(recipientPubkey: string, originalEventId: string): NostrEvent['tags'];
66
+ }
67
+ //# sourceMappingURL=base-nostr-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-nostr-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/base-nostr-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACb,MAAM,uBAAuB,CAAC;AAe/B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;GAGG;AACH,8BAAsB,kBAAkB;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAClD,SAAS,CAAC,WAAW,UAAS;gBAElB,OAAO,EAAE,yBAAyB;IAM9C;;OAEG;cACa,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxC;;OAEG;cACa,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3C;;OAEG;cACa,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/C;;OAEG;cACa,SAAS,CACvB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACH,SAAS,CAAC,6BAA6B,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc;IAI1E;;OAEG;cACa,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,UAAU,CAAC;IAMtB;;OAEG;cACa,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D;;OAEG;cACa,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,kBAAkB,EAAE,MAAM,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EACzB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,CAAC;IA0BlB;;OAEG;IACH,SAAS,CAAC,yBAAyB,CACjC,YAAY,EAAE,MAAM,EACpB,iBAAiB,GAAE,OAAO,CAAC,MAAM,CAAM,GACtC,MAAM,EAAE;IAWX;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAK1E;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAC1B,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,UAAU,CAAC,MAAM,CAAC;CAOtB"}