import org.springaicommunity.claude.agent.sdk.ClaudeClient;
import org.springaicommunity.claude.agent.sdk.ClaudeSyncClient;
import org.springaicommunity.claude.agent.sdk.config.PermissionMode;
import org.springaicommunity.claude.agent.sdk.mcp.McpServerConfig;
import org.springaicommunity.claude.agent.sdk.parsing.ParsedMessage;
import org.springaicommunity.claude.agent.sdk.transport.CLIOptions;
import org.springaicommunity.claude.agent.sdk.types.AssistantMessage;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
// Create test files
Path testDir = Files.createTempDirectory("mcp-multi-test");
Files.writeString(testDir.resolve("notes.txt"), "Important: MCP tools use namespaced naming.");
// Configure servers
McpServerConfig.McpStdioServerConfig filesystemServer = new McpServerConfig.McpStdioServerConfig(
"npx", List.of("-y", "@modelcontextprotocol/server-filesystem", testDir.toString()), Map.of()
);
McpServerConfig.McpStdioServerConfig memoryServer = new McpServerConfig.McpStdioServerConfig(
"npx", List.of("-y", "@modelcontextprotocol/server-memory"), Map.of()
);
// Pre-approve tools from both servers
List<String> allowedTools = List.of(
"mcp__fs__read_file",
"mcp__fs__list_directory",
"mcp__mem__store",
"mcp__mem__retrieve"
);
try (ClaudeSyncClient client = ClaudeClient.sync()
.workingDirectory(testDir)
.model(CLIOptions.MODEL_HAIKU)
.permissionMode(PermissionMode.BYPASS_PERMISSIONS)
.mcpServer("fs", filesystemServer)
.mcpServer("mem", memoryServer)
.allowedTools(allowedTools)
.build()) {
// Task 1: List files (filesystem server)
client.connect("List files using the filesystem MCP tools.");
printResponse(client);
// Task 2: Store data (memory server)
client.query("Store 'Hello from MCP' with key 'greeting' using memory MCP tools.");
printResponse(client);
// Task 3: Cross-server workflow
client.query("Read notes.txt and store its content in memory with key 'backup'.");
printResponse(client);
// Task 4: Retrieve from memory
client.query("Retrieve the value with key 'greeting' from memory.");
printResponse(client);
}
private static void printResponse(ClaudeSyncClient client) {
Iterator<ParsedMessage> response = client.receiveResponse();
while (response.hasNext()) {
ParsedMessage msg = response.next();
if (msg.isRegularMessage() && msg.asMessage() instanceof AssistantMessage am) {
am.getTextContent().ifPresent(System.out::println);
}
}
}