@@ -257,46 +257,60 @@ function registerProxiedTool<T extends ExtensionTool>(tool: T): void {
257257 type Name = T [ 'name' ]
258258 type Result = ToolResultMap [ Name ]
259259
260+ const registerToolFn = mcp . registerTool . bind ( mcp ) as (
261+ name : string ,
262+ options : { description : string ; inputSchema : ZodType ; outputSchema ?: ZodType } ,
263+ handler : ( args : unknown ) => Promise < CallToolResult >
264+ ) => unknown
265+
260266 const schema = tool . parameters
261- mcp . registerTool (
267+ const handler = async ( args : unknown ) => {
268+ try {
269+ const parsedArgs = schema . parse ( args )
270+ const activeExt = extensions . find ( ( e ) => e . active )
271+ if ( ! activeExt ) throw new Error ( 'No active TemPad Dev extension available.' )
272+
273+ const { promise, requestId } = register < Result > ( activeExt . id , toolTimeoutMs )
274+
275+ const message : ToolCallMessage = {
276+ type : 'toolCall' ,
277+ id : requestId ,
278+ payload : {
279+ name : tool . name ,
280+ args : parsedArgs
281+ }
282+ }
283+ activeExt . ws . send ( JSON . stringify ( message ) )
284+ log . info ( { tool : tool . name , req : requestId , extId : activeExt . id } , 'Forwarded tool call.' )
285+
286+ const payload = await promise
287+ return createToolResponse ( tool . name , payload )
288+ } catch ( error ) {
289+ log . error ( { tool : tool . name , error } , 'Tool invocation failed before reaching extension.' )
290+ return createToolErrorResponse ( tool . name , error )
291+ }
292+ }
293+
294+ registerToolFn (
262295 tool . name ,
263296 {
264297 description : tool . description ,
265298 inputSchema : schema as unknown as McpInputSchema
266299 } ,
267- async ( args : unknown ) => {
268- try {
269- const parsedArgs = schema . parse ( args )
270- const activeExt = extensions . find ( ( e ) => e . active )
271- if ( ! activeExt ) throw new Error ( 'No active TemPad Dev extension available.' )
272-
273- const { promise, requestId } = register < Result > ( activeExt . id , toolTimeoutMs )
274-
275- const message : ToolCallMessage = {
276- type : 'toolCall' ,
277- id : requestId ,
278- payload : {
279- name : tool . name ,
280- args : parsedArgs
281- }
282- }
283- activeExt . ws . send ( JSON . stringify ( message ) )
284- log . info ( { tool : tool . name , req : requestId , extId : activeExt . id } , 'Forwarded tool call.' )
285-
286- const payload = await promise
287- return createToolResponse ( tool . name , payload )
288- } catch ( error ) {
289- log . error ( { tool : tool . name , error } , 'Tool invocation failed before reaching extension.' )
290- return createToolErrorResponse ( tool . name , error )
291- }
292- }
300+ handler
293301 )
294302}
295303
296304function registerLocalTool ( tool : HubOnlyTool ) : void {
297305 const schema = tool . parameters
298306 const handler = tool . handler
299307
308+ const registerToolFn = mcp . registerTool . bind ( mcp ) as (
309+ name : string ,
310+ options : { description : string ; inputSchema : ZodType ; outputSchema ?: ZodType } ,
311+ handler : ( args : unknown ) => Promise < CallToolResult >
312+ ) => unknown
313+
300314 const registrationOptions : {
301315 description : string
302316 inputSchema : McpInputSchema
@@ -310,15 +324,17 @@ function registerLocalTool(tool: HubOnlyTool): void {
310324 registrationOptions . outputSchema = tool . outputSchema as unknown as McpOutputSchema
311325 }
312326
313- mcp . registerTool ( tool . name , registrationOptions , async ( args : unknown ) => {
327+ const registerHandler = async ( args : unknown ) => {
314328 try {
315329 const parsed = schema . parse ( args )
316330 return await handler ( parsed )
317331 } catch ( error ) {
318332 log . error ( { tool : tool . name , error } , 'Local tool invocation failed.' )
319333 return createToolErrorResponse ( tool . name , error )
320334 }
321- } )
335+ }
336+
337+ registerToolFn ( tool . name , registrationOptions , registerHandler )
322338}
323339
324340function createToolResponse < Name extends ToolName > (
0 commit comments