CtrlK
BlogDocsLog inGet started
Tessl Logo

giuseppe-trisciuoglio/developer-kit

Comprehensive developer toolkit providing reusable skills for Java/Spring Boot, TypeScript/NestJS/React/Next.js, Python, PHP, AWS CloudFormation, AI/RAG, DevOps, and more.

89

Quality

89%

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Risky

Do not use without reviewing

Overview
Quality
Evals
Security
Files

migration-guide.mdplugins/developer-kit-java/skills/spring-ai-mcp-server-patterns/references/

Migrating from LangChain4j MCP to Spring AI MCP

Guide for migrating existing LangChain4j MCP server implementations to Spring AI.

Key Differences

AspectLangChain4jSpring AI
Tool annotation@ToolMethod@Tool(description)
Parameter annotation@P@ToolParam
ConfigurationCustom propertiesSpring Boot auto-configuration
SecurityManualSpring Security integration
IntegrationStandaloneDeep Spring ecosystem integration
Function callingAiToolFunctionCallback

Migration Steps

  1. Replace @ToolMethod("description") with @Tool(description = "description") on tool methods
  2. Replace @P("description") on parameters with @ToolParam("description")
  3. Wrap tool classes with @Component (LangChain4j may use different registration)
  4. Update configuration from LangChain4j properties to spring.ai.mcp.* properties
  5. Migrate prompt templates to use @PromptTemplate and @PromptParam
  6. Replace LangChain4j-specific types with Spring AI equivalents
  7. Add @EnableMcpServer to the main application class
  8. Configure Spring Security if you had custom auth in LangChain4j

Code Migration Example

Before (LangChain4j):

public class WeatherTools {

    @ToolMethod("Get weather information for a city")
    public String getWeather(@P("city name") String city) {
        return weatherService.getWeather(city);
    }

    @ToolMethod("Get 5-day forecast")
    public String getForecast(
            @P("city name") String city,
            @P("temperature unit") String unit) {
        return weatherService.getForecast(city, unit);
    }
}

After (Spring AI):

@Component
public class WeatherTools {

    private final WeatherService weatherService;

    public WeatherTools(WeatherService weatherService) {
        this.weatherService = weatherService;
    }

    @Tool(description = "Get weather information for a city")
    public WeatherResponse getWeather(@ToolParam("City name") String city) {
        return weatherService.getWeather(city);
    }

    @Tool(description = "Get 5-day forecast")
    public ForecastResponse getForecast(
            @ToolParam("City name") String city,
            @ToolParam(value = "Temperature unit: celsius or fahrenheit", required = false) String unit) {
        return weatherService.getForecast(city, unit != null ? unit : "celsius");
    }
}

Configuration Migration

Before (LangChain4j application.properties):

langchain4j.mcp.enabled=true
langchain4j.mcp.transport=stdio
langchain4j.openai.api-key=${OPENAI_API_KEY}

After (Spring AI application.properties):

spring.ai.mcp.enabled=true
spring.ai.mcp.transport.type=stdio
spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.options.model=gpt-4o-mini

Prompt Template Migration

Before (LangChain4j):

public class CodePrompts {

    public AiPrompt createCodeReviewPrompt(String code) {
        return AiPrompt.builder()
                .system("You are a code reviewer.")
                .user("Review: " + code)
                .build();
    }
}

After (Spring AI):

@Component
public class CodePrompts {

    @PromptTemplate(
        name = "code-review",
        description = "Review Java code for best practices"
    )
    public Prompt createCodeReviewPrompt(@PromptParam("code") String code) {
        return Prompt.builder()
                .system("You are a code reviewer.")
                .user("Review the following code:\n```java\n" + code + "\n```")
                .build();
    }
}

Main Application Class Update

Before:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

After:

@SpringBootApplication
@EnableMcpServer
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Benefits After Migration

  • Full Spring Boot auto-configuration reduces boilerplate
  • Native Spring Security integration simplifies auth
  • Spring Cache integration via @Cacheable on tool methods
  • Spring Actuator health checks out of the box
  • Micrometer metrics integration
  • Constructor injection for better testability
  • Spring profiles for environment-specific configuration
  • Deep integration with Spring Data, WebFlux, and other Spring modules

plugins

developer-kit-java

skills

README.md

CHANGELOG.md

context7.json

CONTRIBUTING.md

README_CN.md

README_ES.md

README_IT.md

README.md

tessl.json

tile.json