@@ -23,25 +23,29 @@ public async Task AddIncomingMessageFilter_Logs_For_Request()
2323 List < string > messageTypes = [ ] ;
2424
2525 McpServerBuilder
26- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
26+ . WithMessageFilters ( filters =>
2727 {
28- var logger = GetLogger ( context . Services , "MessageFilter1" ) ;
29- logger . LogInformation ( "MessageFilter1 before" ) ;
28+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
29+ {
30+ var logger = GetLogger ( context . Services , "MessageFilter1" ) ;
31+ logger . LogInformation ( "MessageFilter1 before" ) ;
3032
31- var messageTypeName = context . JsonRpcMessage . GetType ( ) . Name ;
32- messageTypes . Add ( messageTypeName ) ;
33+ var messageTypeName = context . JsonRpcMessage . GetType ( ) . Name ;
34+ messageTypes . Add ( messageTypeName ) ;
3335
34- await next ( context , cancellationToken ) ;
36+ await next ( context , cancellationToken ) ;
3537
36- logger . LogInformation ( "MessageFilter1 after" ) ;
37- } ) )
38- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
39- {
40- var logger = GetLogger ( context . Services , "MessageFilter2" ) ;
41- logger . LogInformation ( "MessageFilter2 before" ) ;
42- await next ( context , cancellationToken ) ;
43- logger . LogInformation ( "MessageFilter2 after" ) ;
44- } ) )
38+ logger . LogInformation ( "MessageFilter1 after" ) ;
39+ } ) ;
40+
41+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
42+ {
43+ var logger = GetLogger ( context . Services , "MessageFilter2" ) ;
44+ logger . LogInformation ( "MessageFilter2 before" ) ;
45+ await next ( context , cancellationToken ) ;
46+ logger . LogInformation ( "MessageFilter2 after" ) ;
47+ } ) ;
48+ } )
4549 . WithTools < TestTool > ( )
4650 . WithPrompts < TestPrompt > ( )
4751 . WithResources < TestResource > ( ) ;
@@ -91,20 +95,24 @@ public async Task AddIncomingMessageFilter_Intercepts_Request_Messages()
9195 public async Task AddIncomingMessageFilter_Multiple_Filters_Execute_In_Order ( )
9296 {
9397 McpServerBuilder
94- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
95- {
96- var logger = GetLogger ( context . Services , "MessageFilter1" ) ;
97- logger . LogInformation ( "MessageFilter1 before" ) ;
98- await next ( context , cancellationToken ) ;
99- logger . LogInformation ( "MessageFilter1 after" ) ;
100- } ) )
101- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
98+ . WithMessageFilters ( filters =>
10299 {
103- var logger = GetLogger ( context . Services , "MessageFilter2" ) ;
104- logger . LogInformation ( "MessageFilter2 before" ) ;
105- await next ( context , cancellationToken ) ;
106- logger . LogInformation ( "MessageFilter2 after" ) ;
107- } ) )
100+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
101+ {
102+ var logger = GetLogger ( context . Services , "MessageFilter1" ) ;
103+ logger . LogInformation ( "MessageFilter1 before" ) ;
104+ await next ( context , cancellationToken ) ;
105+ logger . LogInformation ( "MessageFilter1 after" ) ;
106+ } ) ;
107+
108+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
109+ {
110+ var logger = GetLogger ( context . Services , "MessageFilter2" ) ;
111+ logger . LogInformation ( "MessageFilter2 before" ) ;
112+ await next ( context , cancellationToken ) ;
113+ logger . LogInformation ( "MessageFilter2 after" ) ;
114+ } ) ;
115+ } )
108116 . WithTools < TestTool > ( ) ;
109117
110118 StartServer ( ) ;
@@ -166,19 +174,23 @@ public async Task AddIncomingMessageFilter_Items_Dictionary_Can_Be_Used()
166174 string ? capturedValue = null ;
167175
168176 McpServerBuilder
169- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
170- {
171- context . Items [ "testKey" ] = "testValue" ;
172- await next ( context , cancellationToken ) ;
173- } ) )
174- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
177+ . WithMessageFilters ( filters =>
175178 {
176- if ( context . Items . TryGetValue ( "testKey" , out var value ) )
179+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
177180 {
178- capturedValue = value as string ;
179- }
180- await next ( context , cancellationToken ) ;
181- } ) )
181+ context . Items [ "testKey" ] = "testValue" ;
182+ await next ( context , cancellationToken ) ;
183+ } ) ;
184+
185+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
186+ {
187+ if ( context . Items . TryGetValue ( "testKey" , out var value ) )
188+ {
189+ capturedValue = value as string ;
190+ }
191+ await next ( context , cancellationToken ) ;
192+ } ) ;
193+ } )
182194 . WithTools < TestTool > ( ) ;
183195
184196 StartServer ( ) ;
@@ -529,36 +541,40 @@ public async Task AddIncomingMessageFilter_Items_Preserved_When_Context_Replaced
529541 object ? secondFilterValue = null ;
530542
531543 McpServerBuilder
532- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
533- {
534- // First filter sets an item
535- if ( context . JsonRpcMessage is JsonRpcRequest request && request . Method == RequestMethods . ToolsList )
536- {
537- context . Items [ "firstFilterKey" ] = "firstFilterValue" ;
538- }
539- await next ( context , cancellationToken ) ;
540- } ) )
541- . WithMessageFilters ( filters => filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
544+ . WithMessageFilters ( filters =>
542545 {
543- // Second filter creates a new context with a new JsonRpcRequest and adds an item
544- if ( context . JsonRpcMessage is JsonRpcRequest request && request . Method == RequestMethods . ToolsList )
546+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
545547 {
546- var newRequest = new JsonRpcRequest
548+ // First filter sets an item
549+ if ( context . JsonRpcMessage is JsonRpcRequest request && request . Method == RequestMethods . ToolsList )
547550 {
548- Id = request . Id ,
549- Method = RequestMethods . ToolsList ,
550- Params = request . Params ,
551- Context = new JsonRpcMessageContext { RelatedTransport = request . Context ? . RelatedTransport } ,
552- } ;
551+ context . Items [ "firstFilterKey" ] = "firstFilterValue" ;
552+ }
553+ await next ( context , cancellationToken ) ;
554+ } ) ;
553555
554- var newContext = new MessageContext ( context . Server , newRequest ) ;
555- newContext . Items [ "secondFilterKey" ] = "secondFilterValue" ;
556-
557- await next ( newContext , cancellationToken ) ;
558- return ;
559- }
560- await next ( context , cancellationToken ) ;
561- } ) )
556+ filters . AddIncomingFilter ( ( next ) => async ( context , cancellationToken ) =>
557+ {
558+ // Second filter creates a new context with a new JsonRpcRequest and adds an item
559+ if ( context . JsonRpcMessage is JsonRpcRequest request && request . Method == RequestMethods . ToolsList )
560+ {
561+ var newRequest = new JsonRpcRequest
562+ {
563+ Id = request . Id ,
564+ Method = RequestMethods . ToolsList ,
565+ Params = request . Params ,
566+ Context = new JsonRpcMessageContext { RelatedTransport = request . Context ? . RelatedTransport } ,
567+ } ;
568+
569+ var newContext = new MessageContext ( context . Server , newRequest ) ;
570+ newContext . Items [ "secondFilterKey" ] = "secondFilterValue" ;
571+
572+ await next ( newContext , cancellationToken ) ;
573+ return ;
574+ }
575+ await next ( context , cancellationToken ) ;
576+ } ) ;
577+ } )
562578 . WithRequestFilters ( filters => filters . AddListToolsFilter ( ( next ) => async ( request , cancellationToken ) =>
563579 {
564580 // Request filter should see items from message filters
@@ -592,25 +608,29 @@ public async Task AddIncomingMessageFilter_Items_Flow_Through_Multiple_Request_F
592608 }
593609 await next ( context , cancellationToken ) ;
594610 } ) )
595- . WithRequestFilters ( filters => filters . AddListToolsFilter ( ( next ) => async ( request , cancellationToken ) =>
611+ . WithRequestFilters ( filters =>
596612 {
597- // First request filter reads and modifies
598- if ( request . Items . TryGetValue ( "sharedKey" , out var value ) )
613+ filters . AddListToolsFilter ( ( next ) => async ( request , cancellationToken ) =>
599614 {
600- observedValues . Add ( ( string ) value ! ) ;
601- request . Items [ "sharedKey" ] = "modifiedByFilter1" ;
602- }
603- return await next ( request , cancellationToken ) ;
604- } ) )
605- . WithRequestFilters ( filters => filters . AddListToolsFilter ( ( next ) => async ( request , cancellationToken ) =>
606- {
607- // Second request filter should see modified value
608- if ( request . Items . TryGetValue ( "sharedKey" , out var value ) )
615+ // First request filter reads and modifies
616+ if ( request . Items . TryGetValue ( "sharedKey" , out var value ) )
617+ {
618+ observedValues . Add ( ( string ) value ! ) ;
619+ request . Items [ "sharedKey" ] = "modifiedByFilter1" ;
620+ }
621+ return await next ( request , cancellationToken ) ;
622+ } ) ;
623+
624+ filters . AddListToolsFilter ( ( next ) => async ( request , cancellationToken ) =>
609625 {
610- observedValues . Add ( ( string ) value ! ) ;
611- }
612- return await next ( request , cancellationToken ) ;
613- } ) )
626+ // Second request filter should see modified value
627+ if ( request . Items . TryGetValue ( "sharedKey" , out var value ) )
628+ {
629+ observedValues . Add ( ( string ) value ! ) ;
630+ }
631+ return await next ( request , cancellationToken ) ;
632+ } ) ;
633+ } )
614634 . WithTools < TestTool > ( ) ;
615635
616636 StartServer ( ) ;
0 commit comments