@@ -167,20 +167,38 @@ function validateJSONRPCMessage(message: unknown): message is JSONRPCMessage {
167167 ) ;
168168}
169169
170+ /**
171+ * Type for RPC handler functions that can process MCP messages
172+ */
173+ export type MCPMessageHandler = (
174+ message : JSONRPCMessage | JSONRPCMessage [ ]
175+ ) => Promise < JSONRPCMessage | JSONRPCMessage [ ] | undefined > ;
176+
177+ /**
178+ * Base interface for objects that can handle MCP messages via RPC
179+ */
170180export interface MCPStub {
171- handleMcpMessage (
172- message : JSONRPCMessage | JSONRPCMessage [ ]
173- ) : Promise < JSONRPCMessage | JSONRPCMessage [ ] | undefined > ;
181+ handleMcpMessage : MCPMessageHandler ;
182+ setName ?( name : string ) : Promise < void > ;
174183}
175184
176- export interface RPCClientTransportOptions {
177- stub : MCPStub ;
178- functionName ?: string ;
185+ export interface RPCClientTransportOptions <
186+ TStub extends MCPStub = MCPStub ,
187+ TMethod extends keyof TStub = "handleMcpMessage"
188+ > {
189+ stub : TStub ;
190+ functionName ?: TMethod extends string ? TMethod : never ;
191+ doName ?: string ;
179192}
180193
181- export class RPCClientTransport implements Transport {
182- private _stub : MCPStub ;
183- private _functionName : string ;
194+ export class RPCClientTransport <
195+ TStub extends MCPStub = MCPStub ,
196+ TMethod extends keyof TStub = "handleMcpMessage"
197+ > implements Transport
198+ {
199+ private _stub : TStub ;
200+ private _functionName : TMethod extends string ? TMethod : "handleMcpMessage" ;
201+ private _doName ?: string ;
184202 private _started = false ;
185203 private _protocolVersion ?: string ;
186204
@@ -189,9 +207,13 @@ export class RPCClientTransport implements Transport {
189207 onerror ?: ( error : Error ) => void ;
190208 onmessage ?: ( message : JSONRPCMessage , extra ?: MessageExtraInfo ) => void ;
191209
192- constructor ( options : RPCClientTransportOptions ) {
210+ constructor ( options : RPCClientTransportOptions < TStub , TMethod > ) {
193211 this . _stub = options . stub ;
194- this . _functionName = options . functionName ?? "handleMcpMessage" ;
212+ this . _functionName = ( options . functionName ??
213+ "handleMcpMessage" ) as TMethod extends string
214+ ? TMethod
215+ : "handleMcpMessage" ;
216+ this . _doName = options . doName ;
195217 }
196218
197219 setProtocolVersion ( version : string ) : void {
@@ -229,9 +251,14 @@ export class RPCClientTransport implements Transport {
229251 validateJSONRPCMessage ( message ) ;
230252 }
231253
254+ // Set the name if the stub is a DO
255+ if ( this . _doName && this . _stub . setName ) {
256+ await this . _stub . setName ( this . _doName ) ;
257+ }
258+
232259 try {
233- const result =
234- await this . _stub [ this . _functionName as keyof MCPStub ] ( message ) ;
260+ const handler = this . _stub [ this . _functionName ] as MCPMessageHandler ;
261+ const result = await handler ( message ) ;
235262
236263 if ( ! result ) {
237264 return ;
0 commit comments