9
9
import java .util .Map ;
10
10
import java .util .concurrent .ConcurrentHashMap ;
11
11
import java .util .concurrent .atomic .AtomicReference ;
12
+ import java .util .function .BiFunction ;
12
13
import java .util .function .Function ;
13
14
import java .util .stream .Collectors ;
14
15
18
19
import io .modelcontextprotocol .client .transport .WebFluxSseClientTransport ;
19
20
import io .modelcontextprotocol .server .McpServer ;
20
21
import io .modelcontextprotocol .server .McpServerFeatures ;
22
+ import io .modelcontextprotocol .server .McpSyncServerExchange ;
21
23
import io .modelcontextprotocol .server .transport .WebFluxSseServerTransportProvider ;
22
24
import io .modelcontextprotocol .spec .McpError ;
23
25
import io .modelcontextprotocol .spec .McpSchema ;
24
- import io .modelcontextprotocol .spec .McpSchema .CallToolResult ;
25
- import io .modelcontextprotocol .spec .McpSchema .ClientCapabilities ;
26
- import io .modelcontextprotocol .spec .McpSchema .CreateMessageRequest ;
27
- import io .modelcontextprotocol .spec .McpSchema .CreateMessageResult ;
28
- import io .modelcontextprotocol .spec .McpSchema .InitializeResult ;
29
- import io .modelcontextprotocol .spec .McpSchema .ModelPreferences ;
30
- import io .modelcontextprotocol .spec .McpSchema .Role ;
31
- import io .modelcontextprotocol .spec .McpSchema .Root ;
32
- import io .modelcontextprotocol .spec .McpSchema .ServerCapabilities ;
33
- import io .modelcontextprotocol .spec .McpSchema .Tool ;
26
+ import io .modelcontextprotocol .spec .McpSchema .*;
27
+ import io .modelcontextprotocol .spec .McpSchema .ServerCapabilities .CompletionCapabilities ;
28
+ import io .modelcontextprotocol .spec .McpServerSession ;
34
29
import org .junit .jupiter .api .AfterEach ;
35
30
import org .junit .jupiter .api .BeforeEach ;
31
+ import org .junit .jupiter .api .Test ;
36
32
import org .junit .jupiter .params .ParameterizedTest ;
37
33
import org .junit .jupiter .params .provider .ValueSource ;
38
34
import reactor .core .publisher .Mono ;
@@ -620,4 +616,48 @@ void testLoggingNotification(String clientType) {
620
616
mcpServer .close ();
621
617
}
622
618
623
- }
619
+ @ ParameterizedTest (name = "{0} : Completion call" )
620
+ @ ValueSource (strings = { "httpclient" , "webflux" })
621
+ void testCompletionShouldReturnExpectedSuggestions (String clientType ) {
622
+ var clientBuilder = clientBuilders .get (clientType );
623
+
624
+ var expectedValues = List .of ("python" , "pytorch" , "pyside" );
625
+ var completionResponse = new McpSchema .CompleteResult (new CompleteResult .CompleteCompletion (expectedValues , 10 , // total
626
+ true // hasMore
627
+ ));
628
+
629
+ BiFunction <McpSyncServerExchange , CompleteRequest , CompleteResult > completionHandler = (mcpSyncServerExchange ,
630
+ request ) -> {
631
+ assertThat (request .argument ().name ()).isEqualTo ("language" );
632
+ assertThat (request .argument ().value ()).isEqualTo ("py" );
633
+ assertThat (request .ref ().type ()).isEqualTo ("ref/prompt" );
634
+ return completionResponse ;
635
+ };
636
+
637
+ var mcpServer = McpServer .sync (mcpServerTransportProvider )
638
+ .capabilities (ServerCapabilities .builder ().completions (new CompletionCapabilities ()).build ())
639
+ .prompts (new McpServerFeatures .SyncPromptSpecification (
640
+ new Prompt ("code_review" , "this is code review prompt" , List .of ()),
641
+ (mcpSyncServerExchange , getPromptRequest ) -> null ))
642
+ .completions (new McpServerFeatures .SyncCompletionSpecification (
643
+ new McpServerFeatures .CompletionRefKey ("ref/prompt" , "code_review" ), completionHandler ))
644
+ .build ();
645
+
646
+ try (var mcpClient = clientBuilder .build ()) {
647
+
648
+ InitializeResult initResult = mcpClient .initialize ();
649
+ assertThat (initResult ).isNotNull ();
650
+
651
+ CompleteRequest request = new CompleteRequest (
652
+ new CompleteRequest .PromptReference ("ref/prompt" , "code_review" ),
653
+ new CompleteRequest .CompleteArgument ("language" , "py" ));
654
+
655
+ CompleteResult result = mcpClient .completeCompletion (request );
656
+
657
+ assertThat (result ).isNotNull ();
658
+ }
659
+
660
+ mcpServer .close ();
661
+ }
662
+
663
+ }
0 commit comments