@@ -708,4 +708,68 @@ describe('Feature: MCP Proxy', () => {
708
708
} ) ,
709
709
)
710
710
} )
711
+
712
+ it ( 'Scenario: Block tools/call for ignored tools with delete* filter' , async ( ) => {
713
+ // Given mock transports for client and server
714
+ const mockTransportToClient = {
715
+ send : vi . fn ( ) . mockResolvedValue ( undefined ) ,
716
+ close : vi . fn ( ) . mockResolvedValue ( undefined ) ,
717
+ start : vi . fn ( ) . mockResolvedValue ( undefined ) ,
718
+ onmessage : vi . fn ( ) ,
719
+ onclose : vi . fn ( ) ,
720
+ onerror : vi . fn ( ) ,
721
+ } as unknown as Transport
722
+
723
+ const mockTransportToServer = {
724
+ send : vi . fn ( ) . mockResolvedValue ( undefined ) ,
725
+ close : vi . fn ( ) . mockResolvedValue ( undefined ) ,
726
+ start : vi . fn ( ) . mockResolvedValue ( undefined ) ,
727
+ onmessage : vi . fn ( ) ,
728
+ onclose : vi . fn ( ) ,
729
+ onerror : vi . fn ( ) ,
730
+ } as unknown as Transport
731
+
732
+ // When setting up the proxy with delete* filter
733
+ mcpProxy ( {
734
+ transportToClient : mockTransportToClient ,
735
+ transportToServer : mockTransportToServer ,
736
+ ignoredTools : [ 'delete*' ] ,
737
+ } )
738
+
739
+ // And when client tries to call a deleteTask tool
740
+ const toolsCallMessage = {
741
+ jsonrpc : '2.0' as const ,
742
+ method : 'tools/call' ,
743
+ id : '3' ,
744
+ params : {
745
+ name : 'deleteTask' ,
746
+ arguments : {
747
+ taskId : '1' ,
748
+ } ,
749
+ _meta : {
750
+ progressToken : 1 ,
751
+ } ,
752
+ } ,
753
+ }
754
+
755
+ // Simulate client sending the tools/call message
756
+ if ( mockTransportToClient . onmessage ) {
757
+ mockTransportToClient . onmessage ( toolsCallMessage )
758
+ }
759
+
760
+ // Then the call should NOT be forwarded to the server
761
+ expect ( mockTransportToServer . send ) . not . toHaveBeenCalled ( )
762
+
763
+ // And an error response should be sent back to the client
764
+ expect ( mockTransportToClient . send ) . toHaveBeenCalledWith (
765
+ expect . objectContaining ( {
766
+ jsonrpc : '2.0' ,
767
+ id : '3' ,
768
+ error : expect . objectContaining ( {
769
+ code : expect . any ( Number ) ,
770
+ message : expect . stringContaining ( 'Tool "deleteTask" is not available' ) ,
771
+ } ) ,
772
+ } ) ,
773
+ )
774
+ } )
711
775
} )
0 commit comments