Spring Boot Starter for building Model Context Protocol (MCP) servers with auto-configuration, annotation-based tool/resource/prompt definitions, and support for STDIO, SSE, and Streamable-HTTP transports
Get started with Spring AI MCP Server Starter in 5 minutes.
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>implementation 'org.springframework.ai:spring-ai-starter-mcp-server'Create a simple calculator tool:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpToolParam;
@SpringBootApplication
public class CalculatorMcpServer {
public static void main(String[] args) {
SpringApplication.run(CalculatorMcpServer.class, args);
}
}
@Component
public class CalculatorTools {
@McpTool(name = "add", description = "Add two numbers")
public int add(
@McpToolParam(description = "First number", required = true) int a,
@McpToolParam(description = "Second number", required = true) int b) {
return a + b;
}
@McpTool(name = "multiply", description = "Multiply two numbers")
public int multiply(
@McpToolParam(description = "First number", required = true) int a,
@McpToolParam(description = "Second number", required = true) int b) {
return a * b;
}
}Create application.properties:
# Enable STDIO transport for command-line usage
spring.ai.mcp.server.stdio=true
# Server metadata
spring.ai.mcp.server.name=calculator-server
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.instructions=A simple calculator MCP servermvn spring-boot:runOr build and run:
mvn clean package
java -jar target/calculator-mcp-server.jarThe server is now running and can be connected to by MCP clients via STDIO.
Add to your Claude Desktop configuration:
{
"mcpServers": {
"calculator": {
"command": "java",
"args": ["-jar", "/path/to/calculator-mcp-server.jar"]
}
}
}@Component
public class ConfigResource {
@McpResource(
uri = "config://{key}",
name = "Configuration",
description = "Get configuration value")
public String getConfig(String key) {
return switch(key) {
case "version" -> "1.0.0";
case "name" -> "Calculator Server";
default -> "Unknown config key";
};
}
}@McpTool(name = "factorial", description = "Calculate factorial with progress")
public String factorial(
McpSyncRequestContext context,
@McpToolParam(description = "Number", required = true) int n) {
context.info("Starting factorial calculation");
context.progress(0);
long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
context.progress((i * 100) / n);
}
context.info("Calculation complete");
return "Factorial of " + n + " is " + result;
}@McpTool(name = "divide", description = "Divide two numbers")
public CallToolResult divide(
@McpToolParam(description = "Numerator", required = true) double a,
@McpToolParam(description = "Denominator", required = true) double b) {
if (b == 0) {
return CallToolResult.builder()
.addTextContent("Error: Division by zero is not allowed")
.isError(true)
.build();
}
double result = a / b;
return CallToolResult.builder()
.addTextContent("Result: " + result)
.build();
}spring.ai.mcp.server.stdio=truespring.ai.mcp.server.stdio=false
spring.ai.mcp.server.protocol=SSE
server.port=8080spring.ai.mcp.server.protocol=STREAMABLE
server.port=8080spring.ai.mcp.server.protocol=STATELESS
server.port=8080Problem: Your tool isn't showing up.
Solution: Ensure:
@Component annotationProblem: Client can't connect.
Solution:
Problem: Parameter schema not generated.
Solution: Use supported types:
int, double, boolean, StringCallToolRequest for dynamic schemas