@contextvm/sdk 0.1.1 → 0.1.3
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/COPYING.LESSER +165 -0
- package/README.md +178 -2
- package/dist/esm/core/constants.d.ts +65 -0
- package/dist/esm/core/constants.d.ts.map +1 -0
- package/dist/esm/core/constants.js +70 -0
- package/dist/esm/core/constants.js.map +1 -0
- package/dist/esm/core/encryption.d.ts +18 -0
- package/dist/esm/core/encryption.d.ts.map +1 -0
- package/dist/esm/core/encryption.js +40 -0
- package/dist/esm/core/encryption.js.map +1 -0
- package/dist/esm/core/index.d.ts +5 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +5 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/interfaces.d.ts +39 -0
- package/dist/esm/core/interfaces.d.ts.map +1 -0
- package/dist/esm/core/interfaces.js +13 -0
- package/dist/esm/core/interfaces.js.map +1 -0
- package/dist/esm/core/utils/serializers.d.ts +29 -0
- package/dist/esm/core/utils/serializers.d.ts.map +1 -0
- package/dist/esm/core/utils/serializers.js +46 -0
- package/dist/esm/core/utils/serializers.js.map +1 -0
- package/dist/esm/gateway/index.d.ts +60 -0
- package/dist/esm/gateway/index.d.ts.map +1 -0
- package/dist/esm/gateway/index.js +110 -0
- package/dist/esm/gateway/index.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/proxy/index.d.ts +42 -0
- package/dist/esm/proxy/index.d.ts.map +1 -0
- package/dist/esm/proxy/index.js +59 -0
- package/dist/esm/proxy/index.js.map +1 -0
- package/dist/esm/proxy/proxy-server.d.ts +3 -0
- package/dist/esm/proxy/proxy-server.d.ts.map +1 -0
- package/dist/esm/proxy/proxy-server.js +55 -0
- package/dist/esm/proxy/proxy-server.js.map +1 -0
- package/dist/esm/relay/index.d.ts +2 -0
- package/dist/esm/relay/index.d.ts.map +1 -0
- package/dist/esm/relay/index.js +2 -0
- package/dist/esm/relay/index.js.map +1 -0
- package/dist/esm/relay/simple-relay-pool.d.ts +19 -0
- package/dist/esm/relay/simple-relay-pool.d.ts.map +1 -0
- package/dist/esm/relay/simple-relay-pool.js +44 -0
- package/dist/esm/relay/simple-relay-pool.js.map +1 -0
- package/dist/esm/signer/index.d.ts +2 -0
- package/dist/esm/signer/index.d.ts.map +1 -0
- package/dist/esm/signer/index.js +2 -0
- package/dist/esm/signer/index.js.map +1 -0
- package/dist/esm/signer/private-key-signer.d.ts +16 -0
- package/dist/esm/signer/private-key-signer.d.ts.map +1 -0
- package/dist/esm/signer/private-key-signer.js +23 -0
- package/dist/esm/signer/private-key-signer.js.map +1 -0
- package/dist/esm/transport/base-nostr-transport.d.ts +67 -0
- package/dist/esm/transport/base-nostr-transport.d.ts.map +1 -0
- package/dist/esm/transport/base-nostr-transport.js +122 -0
- package/dist/esm/transport/base-nostr-transport.js.map +1 -0
- package/dist/esm/transport/index.d.ts +4 -0
- package/dist/esm/transport/index.d.ts.map +1 -0
- package/dist/esm/transport/index.js +4 -0
- package/dist/esm/transport/index.js.map +1 -0
- package/dist/esm/transport/nostr-client-transport.d.ts +60 -0
- package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client-transport.js +116 -0
- package/dist/esm/transport/nostr-client-transport.js.map +1 -0
- package/dist/esm/transport/nostr-server-transport.d.ts +128 -0
- package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server-transport.js +383 -0
- package/dist/esm/transport/nostr-server-transport.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { Filter, NostrEvent } 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,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { EncryptionMode, } from '../core/interfaces.js';
|
|
2
|
+
import { CTXVM_MESSAGES_KIND, GIFT_WRAP_KIND, mcpToNostrEvent, NOSTR_TAGS, nostrEventToMcpMessage, encryptMessage, SERVER_ANNOUNCEMENT_KIND, TOOLS_LIST_KIND, RESOURCES_LIST_KIND, RESOURCETEMPLATES_LIST_KIND, PROMPTS_LIST_KIND, } from '../core/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Base class for Nostr-based transports that provides common functionality
|
|
5
|
+
* for managing Nostr connections, event conversion, and message handling.
|
|
6
|
+
*/
|
|
7
|
+
export class BaseNostrTransport {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
var _a;
|
|
10
|
+
this.isConnected = false;
|
|
11
|
+
this.signer = options.signer;
|
|
12
|
+
this.relayHandler = options.relayHandler;
|
|
13
|
+
this.encryptionMode = (_a = options.encryptionMode) !== null && _a !== void 0 ? _a : EncryptionMode.OPTIONAL;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Connects to the Nostr relay network.
|
|
17
|
+
*/
|
|
18
|
+
async connect() {
|
|
19
|
+
if (this.isConnected) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
await this.relayHandler.connect();
|
|
23
|
+
this.isConnected = true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Disconnects from the Nostr relay network.
|
|
27
|
+
*/
|
|
28
|
+
async disconnect() {
|
|
29
|
+
if (!this.isConnected) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.relayHandler.unsubscribe();
|
|
33
|
+
await this.relayHandler.disconnect();
|
|
34
|
+
this.isConnected = false;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Gets the public key from the signer.
|
|
38
|
+
*/
|
|
39
|
+
async getPublicKey() {
|
|
40
|
+
return await this.signer.getPublicKey();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Sets up a subscription to listen for Nostr events.
|
|
44
|
+
*/
|
|
45
|
+
async subscribe(filters, onEvent) {
|
|
46
|
+
await this.relayHandler.subscribe(filters, onEvent);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Converts a Nostr event to an MCP message.
|
|
50
|
+
*/
|
|
51
|
+
convertNostrEventToMcpMessage(event) {
|
|
52
|
+
return nostrEventToMcpMessage(event);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Converts an MCP message to a Nostr event and signs it.
|
|
56
|
+
*/
|
|
57
|
+
async createSignedNostrEvent(message, kind, tags) {
|
|
58
|
+
const pubkey = await this.getPublicKey();
|
|
59
|
+
const unsignedEvent = mcpToNostrEvent(message, pubkey, kind, tags);
|
|
60
|
+
return await this.signer.signEvent(unsignedEvent);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Publishes a signed Nostr event to the relay network.
|
|
64
|
+
*/
|
|
65
|
+
async publishEvent(event) {
|
|
66
|
+
await this.relayHandler.publish(event);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates and publishes a Nostr event for an MCP message.
|
|
70
|
+
*/
|
|
71
|
+
async sendMcpMessage(message, recipientPublicKey, kind, tags, forceEncryption) {
|
|
72
|
+
const unencryptedKinds = [
|
|
73
|
+
SERVER_ANNOUNCEMENT_KIND,
|
|
74
|
+
TOOLS_LIST_KIND,
|
|
75
|
+
RESOURCES_LIST_KIND,
|
|
76
|
+
RESOURCETEMPLATES_LIST_KIND,
|
|
77
|
+
PROMPTS_LIST_KIND,
|
|
78
|
+
];
|
|
79
|
+
const shouldEncrypt = (!unencryptedKinds.includes(kind) || forceEncryption) &&
|
|
80
|
+
this.encryptionMode !== EncryptionMode.DISABLED;
|
|
81
|
+
const event = await this.createSignedNostrEvent(message, kind, tags);
|
|
82
|
+
if (shouldEncrypt) {
|
|
83
|
+
const encryptedEvent = encryptMessage(JSON.stringify(event), recipientPublicKey);
|
|
84
|
+
await this.publishEvent(encryptedEvent);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await this.publishEvent(event);
|
|
88
|
+
}
|
|
89
|
+
return event.id;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Creates subscription filters for listening to messages targeting a specific pubkey.
|
|
93
|
+
*/
|
|
94
|
+
createSubscriptionFilters(targetPubkey, additionalFilters = {}) {
|
|
95
|
+
return [
|
|
96
|
+
{
|
|
97
|
+
'#p': [targetPubkey],
|
|
98
|
+
kinds: [CTXVM_MESSAGES_KIND, GIFT_WRAP_KIND],
|
|
99
|
+
since: Math.floor(Date.now() / 1000),
|
|
100
|
+
...additionalFilters,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Creates tags for targeting a specific recipient.
|
|
106
|
+
*/
|
|
107
|
+
createRecipientTags(recipientPubkey) {
|
|
108
|
+
const tags = [[NOSTR_TAGS.PUBKEY, recipientPubkey]];
|
|
109
|
+
return tags;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Creates tags for responding to a specific event.
|
|
113
|
+
*/
|
|
114
|
+
createResponseTags(recipientPubkey, originalEventId) {
|
|
115
|
+
const tags = [
|
|
116
|
+
[NOSTR_TAGS.PUBKEY, recipientPubkey],
|
|
117
|
+
[NOSTR_TAGS.EVENT_ID, originalEventId],
|
|
118
|
+
];
|
|
119
|
+
return tags;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=base-nostr-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-nostr-transport.js","sourceRoot":"","sources":["../../../src/transport/base-nostr-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import { EncryptionMode, NostrSigner, RelayHandler } from '../core/interfaces.js';
|
|
4
|
+
import { BaseNostrTransport } from './base-nostr-transport.js';
|
|
5
|
+
/**
|
|
6
|
+
* Options for configuring the NostrClientTransport.
|
|
7
|
+
*/
|
|
8
|
+
export interface NostrTransportOptions {
|
|
9
|
+
signer: NostrSigner;
|
|
10
|
+
relayHandler: RelayHandler;
|
|
11
|
+
serverPubkey: string;
|
|
12
|
+
encryptionMode?: EncryptionMode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A transport layer for CTXVM that uses Nostr events for communication.
|
|
16
|
+
* It implements the Transport interface from the @modelcontextprotocol/sdk.
|
|
17
|
+
*/
|
|
18
|
+
export declare class NostrClientTransport extends BaseNostrTransport implements Transport {
|
|
19
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
20
|
+
onclose?: () => void;
|
|
21
|
+
onerror?: (error: Error) => void;
|
|
22
|
+
private readonly serverPubkey;
|
|
23
|
+
private readonly pendingRequestIds;
|
|
24
|
+
constructor(options: NostrTransportOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Starts the transport, connecting to the relay and setting up event listeners.
|
|
27
|
+
*/
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Closes the transport, disconnecting from the relay.
|
|
31
|
+
*/
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Sends a JSON-RPC message over the Nostr transport.
|
|
35
|
+
* @param message The JSON-RPC request or response to send.
|
|
36
|
+
*/
|
|
37
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Internal method to send a JSON-RPC message and get the resulting event ID.
|
|
40
|
+
* @param message The JSON-RPC message to send.
|
|
41
|
+
* @returns The ID of the published Nostr event.
|
|
42
|
+
*/
|
|
43
|
+
private _sendInternal;
|
|
44
|
+
/**
|
|
45
|
+
* Processes incoming Nostr events, routing them to the correct handler.
|
|
46
|
+
*/
|
|
47
|
+
private processIncomingEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Handles response messages by correlating them with pending requests.
|
|
50
|
+
* @param correlatedEventId The event ID from the 'e' tag.
|
|
51
|
+
* @param mcpMessage The incoming MCP message.
|
|
52
|
+
*/
|
|
53
|
+
private handleResponse;
|
|
54
|
+
/**
|
|
55
|
+
* Handles notification messages.
|
|
56
|
+
* @param mcpMessage The incoming MCP message.
|
|
57
|
+
*/
|
|
58
|
+
private handleNotification;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=nostr-client-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr-client-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/nostr-client-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACb,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAI/D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,oBACX,SAAQ,kBACR,YAAW,SAAS;IAGb,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAGxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;gBAEpC,OAAO,EAAE,qBAAqB;IAM1C;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC;;;OAGG;IACU,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD;;;;OAIG;YACW,aAAa;IAW3B;;OAEG;YACW,oBAAoB;IAgClC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IActB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAY3B"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { NotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { CTXVM_MESSAGES_KIND, GIFT_WRAP_KIND, decryptMessage, } from '../core/index.js';
|
|
3
|
+
import { BaseNostrTransport } from './base-nostr-transport.js';
|
|
4
|
+
import { getNostrEventTag } from '../core/utils/serializers.js';
|
|
5
|
+
/**
|
|
6
|
+
* A transport layer for CTXVM that uses Nostr events for communication.
|
|
7
|
+
* It implements the Transport interface from the @modelcontextprotocol/sdk.
|
|
8
|
+
*/
|
|
9
|
+
export class NostrClientTransport extends BaseNostrTransport {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super(options);
|
|
12
|
+
this.serverPubkey = options.serverPubkey;
|
|
13
|
+
this.pendingRequestIds = new Set();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Starts the transport, connecting to the relay and setting up event listeners.
|
|
17
|
+
*/
|
|
18
|
+
async start() {
|
|
19
|
+
await this.connect();
|
|
20
|
+
const pubkey = await this.getPublicKey();
|
|
21
|
+
const filters = this.createSubscriptionFilters(pubkey);
|
|
22
|
+
await this.subscribe(filters, this.processIncomingEvent.bind(this));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Closes the transport, disconnecting from the relay.
|
|
26
|
+
*/
|
|
27
|
+
async close() {
|
|
28
|
+
var _a;
|
|
29
|
+
await this.disconnect();
|
|
30
|
+
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sends a JSON-RPC message over the Nostr transport.
|
|
34
|
+
* @param message The JSON-RPC request or response to send.
|
|
35
|
+
*/
|
|
36
|
+
async send(message) {
|
|
37
|
+
const eventId = await this._sendInternal(message);
|
|
38
|
+
if (eventId) {
|
|
39
|
+
this.pendingRequestIds.add(eventId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Internal method to send a JSON-RPC message and get the resulting event ID.
|
|
44
|
+
* @param message The JSON-RPC message to send.
|
|
45
|
+
* @returns The ID of the published Nostr event.
|
|
46
|
+
*/
|
|
47
|
+
async _sendInternal(message) {
|
|
48
|
+
const tags = this.createRecipientTags(this.serverPubkey);
|
|
49
|
+
return this.sendMcpMessage(message, this.serverPubkey, CTXVM_MESSAGES_KIND, tags);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Processes incoming Nostr events, routing them to the correct handler.
|
|
53
|
+
*/
|
|
54
|
+
async processIncomingEvent(event) {
|
|
55
|
+
var _a;
|
|
56
|
+
try {
|
|
57
|
+
let nostrEvent = event;
|
|
58
|
+
// Handle encrypted messages
|
|
59
|
+
if (event.kind === GIFT_WRAP_KIND) {
|
|
60
|
+
const secretKey = await this.signer.getSecretKey();
|
|
61
|
+
if (!secretKey) {
|
|
62
|
+
throw new Error('Secret key is not available for decryption.');
|
|
63
|
+
}
|
|
64
|
+
const decryptedContent = decryptMessage(event, secretKey);
|
|
65
|
+
nostrEvent = JSON.parse(decryptedContent);
|
|
66
|
+
}
|
|
67
|
+
// Process the resulting event
|
|
68
|
+
const mcpMessage = this.convertNostrEventToMcpMessage(nostrEvent);
|
|
69
|
+
const eTag = getNostrEventTag(nostrEvent.tags, 'e');
|
|
70
|
+
if (eTag) {
|
|
71
|
+
this.handleResponse(eTag, mcpMessage);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.handleNotification(mcpMessage);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('Error handling incoming Nostr event:', error);
|
|
79
|
+
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error instanceof Error
|
|
80
|
+
? error
|
|
81
|
+
: new Error('Failed to handle incoming Nostr event'));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Handles response messages by correlating them with pending requests.
|
|
86
|
+
* @param correlatedEventId The event ID from the 'e' tag.
|
|
87
|
+
* @param mcpMessage The incoming MCP message.
|
|
88
|
+
*/
|
|
89
|
+
handleResponse(correlatedEventId, mcpMessage) {
|
|
90
|
+
var _a;
|
|
91
|
+
if (this.pendingRequestIds.has(correlatedEventId)) {
|
|
92
|
+
(_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, mcpMessage);
|
|
93
|
+
this.pendingRequestIds.delete(correlatedEventId);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.warn(`Received Nostr event with unexpected 'e' tag: ${correlatedEventId}.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Handles notification messages.
|
|
101
|
+
* @param mcpMessage The incoming MCP message.
|
|
102
|
+
*/
|
|
103
|
+
handleNotification(mcpMessage) {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
try {
|
|
106
|
+
NotificationSchema.parse(mcpMessage);
|
|
107
|
+
(_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, mcpMessage);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
(_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error instanceof Error
|
|
111
|
+
? error
|
|
112
|
+
: new Error('Failed to handle incoming notification'));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=nostr-client-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr-client-transport.js","sourceRoot":"","sources":["../../../src/transport/nostr-client-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import { BaseNostrTransport, BaseNostrTransportOptions } from './base-nostr-transport.js';
|
|
4
|
+
import { EncryptionMode } from '../core/interfaces.js';
|
|
5
|
+
/**
|
|
6
|
+
* Options for configuring the NostrServerTransport.
|
|
7
|
+
*/
|
|
8
|
+
export interface NostrServerTransportOptions extends BaseNostrTransportOptions {
|
|
9
|
+
serverInfo?: ServerInfo;
|
|
10
|
+
isPublicServer?: boolean;
|
|
11
|
+
allowedPublicKeys?: string[];
|
|
12
|
+
encryptionMode?: EncryptionMode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Information about a server.
|
|
16
|
+
*/
|
|
17
|
+
export interface ServerInfo {
|
|
18
|
+
name?: string;
|
|
19
|
+
picture?: string;
|
|
20
|
+
website?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A server-side transport layer for CTXVM that uses Nostr events for communication.
|
|
24
|
+
* This transport listens for incoming MCP requests via Nostr events and can send
|
|
25
|
+
* responses back to the originating clients. It handles all request/response correlation
|
|
26
|
+
* internally, making it a standalone MCP transport that works over Nostr.
|
|
27
|
+
*/
|
|
28
|
+
export declare class NostrServerTransport extends BaseNostrTransport implements Transport {
|
|
29
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
30
|
+
onclose?: () => void;
|
|
31
|
+
onerror?: (error: Error) => void;
|
|
32
|
+
private readonly clientSessions;
|
|
33
|
+
private readonly isPublicServer?;
|
|
34
|
+
private readonly allowedPublicKeys?;
|
|
35
|
+
private readonly serverInfo?;
|
|
36
|
+
constructor(options: NostrServerTransportOptions);
|
|
37
|
+
/**
|
|
38
|
+
* Starts the transport, connecting to the relay and setting up event listeners
|
|
39
|
+
* to receive incoming MCP requests.
|
|
40
|
+
*/
|
|
41
|
+
start(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Closes the transport, disconnecting from the relay.
|
|
44
|
+
*/
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Sends JSON-RPC messages over the Nostr transport.
|
|
48
|
+
* @param message The JSON-RPC message to send.
|
|
49
|
+
*/
|
|
50
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Initiates the process of fetching announcement data from the server's internal logic.
|
|
53
|
+
*/
|
|
54
|
+
private getAnnouncementData;
|
|
55
|
+
/**
|
|
56
|
+
* Handles the JSON-RPC responses for public server announcements and publishes
|
|
57
|
+
* them as Nostr events to the configured relays.
|
|
58
|
+
* @param message The JSON-RPC response containing the announcement data.
|
|
59
|
+
*/
|
|
60
|
+
private announcer;
|
|
61
|
+
/**
|
|
62
|
+
* Gets or creates a client session with proper initialization.
|
|
63
|
+
* @param clientPubkey The client's public key.
|
|
64
|
+
* @param now Current timestamp.
|
|
65
|
+
* @returns The client session.
|
|
66
|
+
*/
|
|
67
|
+
private getOrCreateClientSession;
|
|
68
|
+
/**
|
|
69
|
+
* Handles incoming requests with correlation tracking.
|
|
70
|
+
* @param session The client session.
|
|
71
|
+
* @param eventId The Nostr event ID.
|
|
72
|
+
* @param request The request message.
|
|
73
|
+
*/
|
|
74
|
+
private handleIncomingRequest;
|
|
75
|
+
/**
|
|
76
|
+
* Handles incoming notifications.
|
|
77
|
+
* @param session The client session.
|
|
78
|
+
* @param notification The notification message.
|
|
79
|
+
*/
|
|
80
|
+
private handleIncomingNotification;
|
|
81
|
+
/**
|
|
82
|
+
* Handles response messages by finding the original request and routing back to client.
|
|
83
|
+
* @param response The JSON-RPC response or error to send.
|
|
84
|
+
*/
|
|
85
|
+
private handleResponse;
|
|
86
|
+
/**
|
|
87
|
+
* Handles notification messages with routing.
|
|
88
|
+
* @param notification The JSON-RPC notification to send.
|
|
89
|
+
*/
|
|
90
|
+
private handleNotification;
|
|
91
|
+
/**
|
|
92
|
+
* Sends a notification to a specific client by their public key.
|
|
93
|
+
* @param clientPubkey The public key of the target client.
|
|
94
|
+
* @param notification The notification message to send.
|
|
95
|
+
* @returns Promise that resolves when the notification is sent.
|
|
96
|
+
*/
|
|
97
|
+
sendNotification(clientPubkey: string, notification: JSONRPCMessage, correlatedEventId?: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Processes incoming Nostr events, handling decryption and client authorization.
|
|
100
|
+
* This method centralizes the logic for determining whether to process an event
|
|
101
|
+
* based on encryption mode and allowed public keys.
|
|
102
|
+
* @param event The incoming Nostr event.
|
|
103
|
+
*/
|
|
104
|
+
private processIncomingEvent;
|
|
105
|
+
/**
|
|
106
|
+
* Handles encrypted (gift-wrapped) events.
|
|
107
|
+
* @param event The incoming gift-wrapped Nostr event.
|
|
108
|
+
*/
|
|
109
|
+
private handleEncryptedEvent;
|
|
110
|
+
/**
|
|
111
|
+
* Handles unencrypted events.
|
|
112
|
+
* @param event The incoming Nostr event.
|
|
113
|
+
*/
|
|
114
|
+
private handleUnencryptedEvent;
|
|
115
|
+
/**
|
|
116
|
+
* Common logic for authorizing and processing an event.
|
|
117
|
+
* @param event The event to process.
|
|
118
|
+
* @param isEncrypted Whether the original event was encrypted.
|
|
119
|
+
*/
|
|
120
|
+
private authorizeAndProcessEvent;
|
|
121
|
+
/**
|
|
122
|
+
* Cleans up inactive client sessions based on a timeout.
|
|
123
|
+
* @param timeoutMs Timeout in milliseconds for considering a session inactive (default: 5 minutes).
|
|
124
|
+
* @returns The number of sessions that were cleaned up.
|
|
125
|
+
*/
|
|
126
|
+
cleanupInactiveSessions(timeoutMs?: number): number;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=nostr-server-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr-server-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/nostr-server-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,cAAc,EAIpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC;AAanC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;GAKG;AACH,qBAAa,oBACX,SAAQ,kBACR,YAAW,SAAS;IAEb,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;gBAE7B,OAAO,EAAE,2BAA2B;IAOhD;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC;;;OAGG;IACU,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;;OAIG;YACW,SAAS;IAkDvB;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAYlC;;;OAGG;YACW,cAAc;IA6E5B;;;OAGG;YACW,kBAAkB;IAiChC;;;;;OAKG;IACU,gBAAgB,CAC3B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,cAAc,EAC5B,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;;;OAKG;YACW,oBAAoB;IAQlC;;;OAGG;YACW,oBAAoB;IAwBlC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;;;OAIG;IACI,uBAAuB,CAAC,SAAS,GAAE,MAAe,GAAG,MAAM;CAgBnE"}
|