99import java .util .Map ;
1010import java .util .concurrent .ConcurrentHashMap ;
1111import java .util .concurrent .atomic .AtomicReference ;
12+ import java .util .function .BiFunction ;
1213import java .util .function .Function ;
1314import java .util .stream .Collectors ;
1415
1819import io .modelcontextprotocol .client .transport .WebFluxSseClientTransport ;
1920import io .modelcontextprotocol .server .McpServer ;
2021import io .modelcontextprotocol .server .McpServerFeatures ;
22+ import io .modelcontextprotocol .server .McpSyncServerExchange ;
2123import io .modelcontextprotocol .server .transport .WebFluxSseServerTransportProvider ;
2224import io .modelcontextprotocol .spec .McpError ;
2325import 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 ;
3429import org .junit .jupiter .api .AfterEach ;
3530import org .junit .jupiter .api .BeforeEach ;
31+ import org .junit .jupiter .api .Test ;
3632import org .junit .jupiter .params .ParameterizedTest ;
3733import org .junit .jupiter .params .provider .ValueSource ;
3834import reactor .core .publisher .Mono ;
@@ -620,4 +616,48 @@ void testLoggingNotification(String clientType) {
620616 mcpServer .close ();
621617 }
622618
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