Files
gh-giuseppe-trisciuoglio-de…/skills/langchain4j/langchain4j-mcp-server-patterns/assets/mcp-server-template.java
2025-11-29 18:28:30 +08:00

315 lines
9.3 KiB
Java

package com.example.mcp;
import dev.langchain4j.mcp.*;
import dev.langchain4j.mcp.transport.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.List;
// Helper imports
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
/**
* Template for creating MCP servers with LangChain4j.
*
* This template provides a starting point for building MCP servers with:
* - Tool providers
* - Resource providers
* - Prompt providers
* - Spring Boot integration
* - Configuration management
*/
@SpringBootApplication
public class MCPServerTemplate {
public static void main(String[] args) {
SpringApplication.run(MCPServerTemplate.class, args);
}
/**
* Configure and build the main MCP server instance.
*/
@Bean
public MCPServer mcpServer(
List<ToolProvider> toolProviders,
List<ResourceListProvider> resourceProviders,
List<PromptListProvider> promptProviders) {
return MCPServer.builder()
.server(new StdioServer.Builder())
.addToolProvider(toolProviders)
.addResourceProvider(resourceProviders)
.addPromptProvider(promptProviders)
.enableLogging(true)
.build();
}
/**
* Configure MCP clients for connecting to external MCP servers.
*/
@Bean
public McpClient mcpClient() {
StdioMcpTransport transport = new StdioMcpTransport.Builder()
.command(List.of("npm", "exec", "@modelcontextprotocol/server-everything@0.6.2"))
.logEvents(true)
.build();
return new DefaultMcpClient.Builder()
.key("template-client")
.transport(transport)
.cacheToolList(true)
.build();
}
/**
* Configure MCP tool provider for AI services integration.
*/
@Bean
public McpToolProvider mcpToolProvider(McpClient mcpClient) {
return McpToolProvider.builder()
.mcpClients(mcpClient)
.failIfOneServerFails(false)
.build();
}
}
/**
* Example tool provider implementing a simple calculator.
*/
class CalculatorToolProvider implements ToolProvider {
@Override
public List<ToolSpecification> listTools() {
return List.of(
ToolSpecification.builder()
.name("add")
.description("Add two numbers")
.inputSchema(Map.of(
"type", "object",
"properties", Map.of(
"a", Map.of("type", "number", "description", "First number"),
"b", Map.of("type", "number", "description", "Second number")
),
"required", List.of("a", "b")
))
.build(),
ToolSpecification.builder()
.name("multiply")
.description("Multiply two numbers")
.inputSchema(Map.of(
"type", "object",
"properties", Map.of(
"a", Map.of("type", "number", "description", "First number"),
"b", Map.of("type", "number", "description", "Second number")
),
"required", List.of("a", "b")
))
.build()
);
}
@Override
public String executeTool(String name, String arguments) {
try {
// Parse JSON arguments
ObjectMapper mapper = new ObjectMapper();
JsonNode argsNode = mapper.readTree(arguments);
double a = argsNode.get("a").asDouble();
double b = argsNode.get("b").asDouble();
switch (name) {
case "add":
return String.valueOf(a + b);
case "multiply":
return String.valueOf(a * b);
default:
throw new UnsupportedOperationException("Unknown tool: " + name);
}
} catch (Exception e) {
return "Error executing tool: " + e.getMessage();
}
}
}
/**
* Example resource provider for static company information.
*/
class CompanyResourceProvider implements ResourceListProvider, ResourceReadHandler {
@Override
public List<McpResource> listResources() {
return List.of(
McpResource.builder()
.uri("company-info")
.name("Company Information")
.description("Basic company details and contact information")
.mimeType("text/plain")
.build(),
McpResource.builder()
.uri("policies")
.name("Company Policies")
.description("Company policies and procedures")
.mimeType("text/markdown")
.build()
);
}
@Override
public String readResource(String uri) {
switch (uri) {
case "company-info":
return loadCompanyInfo();
case "policies":
return loadPolicies();
default:
throw new ResourceNotFoundException("Resource not found: " + uri);
}
}
private String loadCompanyInfo() {
return """
Company Information:
===================
Name: Example Corporation
Founded: 2020
Industry: Technology
Employees: 100+
Contact:
- Email: info@example.com
- Phone: +1-555-0123
- Website: https://example.com
Mission: To deliver innovative AI solutions
""";
}
private String loadPolicies() {
return """
Company Policies:
=================
1. Code of Conduct
- Treat all team members with respect
- Maintain professional communication
- Report any concerns to management
2. Security Policy
- Use strong passwords
- Enable 2FA when available
- Report security incidents immediately
3. Work Environment
- Flexible working hours
- Remote work options
- Support for continuous learning
""";
}
}
/**
* Example prompt template provider for common AI tasks.
*/
class PromptTemplateProvider implements PromptListProvider, PromptGetHandler {
@Override
public List<Prompt> listPrompts() {
return List.of(
Prompt.builder()
.name("code-review")
.description("Review code for quality, security, and best practices")
.build(),
Prompt.builder()
.name("documentation-generation")
.description("Generate technical documentation from code")
.build(),
Prompt.builder()
.name("bug-analysis")
.description("Analyze and explain potential bugs in code")
.build()
);
}
@Override
public String getPrompt(String name, Map<String, String> arguments) {
switch (name) {
case "code-review":
return createCodeReviewPrompt(arguments);
case "documentation-generation":
return createDocumentationPrompt(arguments);
case "bug-analysis":
return createBugAnalysisPrompt(arguments);
default:
throw new PromptNotFoundException("Prompt not found: " + name);
}
}
private String createCodeReviewPrompt(Map<String, String> args) {
String code = args.getOrDefault("code", "");
String language = args.getOrDefault("language", "unknown");
return String.format("""
Review the following %s code for quality, security, and best practices:
```%s
%s
```
Please analyze:
1. Code quality and readability
2. Security vulnerabilities
3. Performance optimizations
4. Best practices compliance
5. Error handling
Provide specific recommendations for improvements.
""", language, language, code);
}
private String createDocumentationPrompt(Map<String, String> args) {
String code = args.getOrDefault("code", "");
String component = args.getOrDefault("component", "function");
return String.format("""
Generate comprehensive documentation for the following %s:
```%s
%s
```
Include:
1. Function/method signatures
2. Parameters and return values
3. Purpose and usage examples
4. Dependencies and requirements
5. Error conditions and handling
""", component, "java", code);
}
private String createBugAnalysisPrompt(Map<String, String> args) {
String code = args.getOrDefault("code", "");
return String.format("""
Analyze the following code for potential bugs and issues:
```java
%s
```
Look for:
1. Null pointer exceptions
2. Logic errors
3. Resource leaks
4. Race conditions
5. Edge cases
6. Type mismatches
Explain each issue found and suggest fixes.
""", code);
}
}