spring-ai-mcp-server-patterns
giuseppe-trisciuoglio/developer-kit
Spring Boot MCP server patterns for AI function calling and tool handlers with Spring AI
What is spring-ai-mcp-server-patterns?
Provides production-ready patterns for building Model Context Protocol servers with Spring AI, including tool handlers, prompt templates, and transport configuration. Use when implementing MCP servers to extend AI capabilities with Spring's framework, enabling AI function calling, custom tools, and MCP client integration.
- Define AI-callable tools with @Tool and @ToolParam annotations
- Create reusable prompt templates with @PromptTemplate for structured prompts
- Configure MCP transports (stdio, HTTP, SSE) for different deployment scenarios
- Implement security filters and role-based access control for tools
- Set up Spring Boot MCP server auto-configuration with @EnableMcpServer
- Handle tool execution with structured error responses and logging
How to install spring-ai-mcp-server-patterns
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill spring-ai-mcp-server-patterns- Spring Boot 3.0 or later
- Java 17 or higher
- spring-ai-mcp-server dependency (1.0.0+)
- spring-ai-starter-model-openai or compatible AI model starter
- OPENAI_API_KEY or equivalent model provider credentials configured
How to use spring-ai-mcp-server-patterns
- 1.Add spring-ai-mcp-server and spring-ai-starter-model-openai dependencies to your Maven or Gradle project
- 2.Configure spring.ai.openai.api-key and spring.ai.mcp properties in application.properties or application.yml
- 3.Annotate your main application class with @EnableMcpServer and @SpringBootApplication
- 4.Create @Component beans with @Tool methods to define AI-callable functions, using @ToolParam for parameter documentation
- 5.Optionally create @Component beans with @PromptTemplate methods for reusable prompt structures
- 6.Configure transport type (stdio, http, or sse) and security filters in McpSecurityConfig if needed
- 7.Test tools with @SpringBootTest and mock dependencies using @MockBean
- 8.Run the application; tools are automatically registered and available to MCP clients
Use cases
- Building weather or data lookup services exposed as MCP tools for AI agents
- Creating secure database query tools with parameterized queries and audit logging
- Implementing code review or analysis tools with prompt templates and focus areas
- Setting up Claude Desktop integration via stdio transport for local MCP servers
- Exposing REST API endpoints as MCP tools for remote AI client integration
- Spring Boot developers building AI-powered applications
- Backend engineers implementing MCP servers for Claude or other AI clients
- Teams integrating AI function calling into existing Spring applications
- Developers needing secure, production-ready tool execution patterns
- Architects designing extensible AI agent infrastructure
spring-ai-mcp-server-patterns FAQ
Use stdio transport (the default). It communicates via standard input/output, which Claude Desktop expects for local MCP server connections.
Use @PreAuthorize annotations on tool methods for role-based access, implement a ToolFilter bean to check permissions per tool, validate and sanitize all AI-generated parameters, and audit log data-modifying operations.
Yes. Use JdbcTemplate for databases (with parameterized queries), RestTemplate or WebClient for HTTP APIs, and @Async for long-running operations. Always set timeouts and implement retry logic for transient failures.
@Tool methods are AI-callable functions that perform actions and return results. @PromptTemplate methods construct structured prompts for the AI model to process; they're not directly callable by the AI but used to format requests.
Use @SpringBootTest with @MockBean to mock dependencies, test tool methods directly, and verify service calls with Mockito. For integration tests, use Testcontainers for databases and WireMock for external APIs.
Full instructions (SKILL.md)
Source of truth, from giuseppe-trisciuoglio/developer-kit.
name: spring-ai-mcp-server-patterns description: Provides Spring Boot MCP server patterns that create Model Context Protocol servers with Spring AI by defining tool handlers, exposing resources, configuring prompt templates, and setting up transports for AI function calling and tool calling. Use when building MCP servers to extend AI capabilities with Spring's official AI framework, implementing AI tools, custom function calling, or MCP client integration. allowed-tools: Read, Write, Edit, Bash, Glob, Grep
Spring AI MCP Server Implementation Patterns
Implements MCP servers with Spring AI for AI function calling, tool handlers, and MCP transport configuration.
Overview
Production-ready MCP server patterns: @Tool functions, @PromptTemplate resources, and stdio/HTTP/SSE transports with Spring AI security.
When to Use
MCP servers, Spring AI function calling, AI tools, tool calling, custom tool handlers, Spring Boot MCP, resource endpoints, or MCP transport configuration.
Quick Reference
Core Annotations
| Annotation | Target | Purpose |
|---|---|---|
@EnableMcpServer | Class | Enable MCP server auto-configuration |
@Tool(description) | Method | Declare AI-callable tool |
@ToolParam(value) | Parameter | Document tool parameter for AI |
@PromptTemplate(name) | Method | Declare reusable prompt template |
@PromptParam(value) | Parameter | Document prompt parameter |
Transport Types
| Transport | Use Case | Config |
|---|---|---|
stdio | Local process / Claude Desktop | Default |
http | Remote HTTP clients | port, path |
sse | Real-time streaming clients | port, path |
Key Dependencies
<!-- Maven -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
<version>1.0.0</version>
</dependency>
// Gradle
implementation 'org.springframework.ai:spring-ai-mcp-server:1.0.0'
implementation 'org.springframework.ai:spring-ai-starter-model-openai:1.0.0'
Instructions
1. Project Setup
Add Spring AI MCP dependencies (see Quick Reference above), configure the AI model in application.properties, and enable MCP with @EnableMcpServer:
@SpringBootApplication
@EnableMcpServer
public class MyMcpApplication {
public static void main(String[] args) {
SpringApplication.run(MyMcpApplication.class, args);
}
}
spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.mcp.enabled=true
spring.ai.mcp.transport.type=stdio
2. Define Tools
Annotate methods with @Tool inside @Component beans. Use @ToolParam to document parameters:
@Component
public class WeatherTools {
@Tool(description = "Get current weather for a city")
public WeatherData getWeather(@ToolParam("City name") String city) {
return weatherService.getCurrentWeather(city);
}
@Tool(description = "Get 5-day forecast for a city")
public ForecastData getForecast(
@ToolParam("City name") String city,
@ToolParam(value = "Unit: celsius or fahrenheit", required = false) String unit) {
return weatherService.getForecast(city, unit != null ? unit : "celsius");
}
}
See references/implementation-patterns.md for database tools, API integration tools, and the FunctionCallback low-level pattern.
3. Create Prompt Templates
@Component
public class CodeReviewPrompts {
@PromptTemplate(
name = "java-code-review",
description = "Review Java code for best practices and issues"
)
public Prompt createCodeReviewPrompt(
@PromptParam("code") String code,
@PromptParam(value = "focusAreas", required = false) List<String> focusAreas) {
String focus = focusAreas != null ? String.join(", ", focusAreas) : "general best practices";
return Prompt.builder()
.system("You are an expert Java code reviewer with 20 years of experience.")
.user("Review the following Java code for " + focus + ":\n```java\n" + code + "\n```")
.build();
}
}
See references/implementation-patterns.md for additional prompt template patterns.
4. Configure Transport
spring:
ai:
mcp:
enabled: true
transport:
type: stdio # stdio | http | sse
http:
port: 8080
path: /mcp
server:
name: my-mcp-server
version: 1.0.0
5. Add Security
@Configuration
public class McpSecurityConfig {
@Bean
public ToolFilter toolFilter(SecurityService securityService) {
return (tool, context) -> {
User user = securityService.getCurrentUser();
if (tool.name().startsWith("admin_")) {
return user.hasRole("ADMIN");
}
return securityService.isToolAllowed(user, tool.name());
};
}
}
Use @PreAuthorize("hasRole('ADMIN')") on tool methods for method-level security. See references/implementation-patterns.md for full security patterns.
6. Testing
@SpringBootTest
class WeatherToolsTest {
@Autowired
private WeatherTools weatherTools;
@MockBean
private WeatherService weatherService;
@Test
void testGetWeather_Success() {
when(weatherService.getCurrentWeather("London"))
.thenReturn(new WeatherData("London", "Cloudy", 15.0));
WeatherData result = weatherTools.getWeather("London");
assertThat(result.city()).isEqualTo("London");
verify(weatherService).getCurrentWeather("London");
}
}
See references/testing-guide.md for integration tests, Testcontainers, security tests, and slice tests.
Best Practices
Tool Design
- Keep tools focused — one operation per tool
- Use clear, action-oriented names (
getWeather,executeQuery) - Always annotate parameters with
@ToolParamand descriptive text - Return structured records/DTOs, not raw strings or maps
- Design tools to be idempotent when possible
Security
- Validate and sanitize all inputs — AI-generated parameters are untrusted
- Use parameterized queries for SQL; validate and normalize paths for file tools
- Apply
@PreAuthorizefor role-based access on sensitive tools - Audit log all data-modifying tool executions
- Never expose credentials or sensitive data in tool descriptions or error messages
Performance
- Use
@Cacheablefor expensive operations with appropriate TTL - Set timeouts for all external calls
- Use
@Asyncfor long-running operations - Monitor with Micrometer metrics
Error Handling
- Return structured error responses with user-friendly messages
- Log context (user, tool name, parameters) for debugging
- Implement retry logic for transient failures
- Implement
@ControllerAdvicefor consistent error responses
Examples
Example 1: Minimal Weather MCP Server
@SpringBootApplication
@EnableMcpServer
public class WeatherMcpApplication {
public static void main(String[] args) {
SpringApplication.run(WeatherMcpApplication.class, args);
}
}
@Component
public class WeatherTools {
@Tool(description = "Get current weather for a city")
public WeatherData getWeather(@ToolParam("City name") String city) {
return new WeatherData(city, "Sunny", 22.5);
}
}
record WeatherData(String city, String condition, double temperatureCelsius) {}
Example 2: Secure Database Tool
@Component
@PreAuthorize("hasRole('USER')")
public class DatabaseTools {
private final JdbcTemplate jdbcTemplate;
@Tool(description = "Execute a read-only SQL query and return results")
public QueryResult executeQuery(
@ToolParam("SQL SELECT query") String sql,
@ToolParam(value = "Parameters as JSON map", required = false) String paramsJson) {
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
throw new IllegalArgumentException("Only SELECT queries are allowed");
}
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
return new QueryResult(rows, rows.size());
}
}
See references/examples.md for complete examples including file system tools, REST API integration, and prompt template servers.
Constraints and Warnings
Security
- Never expose sensitive data in tool descriptions, parameters, or error messages
- Input validation is mandatory — always validate before executing
- External content is untrusted — tools fetching URLs may receive prompt injection payloads; validate all fetched content
- SQL injection: use parameterized queries exclusively
- Path traversal: normalize and validate all file paths against a base path
Operational
- Responses should be concise — large responses can exceed AI context window limits
- All tools must implement timeouts; default should be configurable
- Rate limit expensive operations
- Tools may be called concurrently — ensure thread safety
Spring AI Specific
- Spring AI is actively developed — pin specific versions in production
- Error messages thrown by tools are exposed to AI models; sanitize them
- Choose transport type carefully:
stdiofor local processes,http/ssefor remote clients
References
Consult these files for detailed patterns and examples:
- references/implementation-patterns.md - Tool creation, prompt templates, FunctionCallback, Spring Boot auto-configuration, application properties
- references/advanced-patterns.md - Dynamic tool registration, multi-model support, caching, error handling
- references/testing-guide.md - Unit tests, integration tests, Testcontainers, security tests, slice tests
- references/examples.md - Complete server examples: weather, database, file system, REST API, prompt templates
- references/api-reference.md - Full API: annotations, interfaces, configuration classes, transport implementations, event system
- references/migration-guide.md - Migrating from LangChain4j MCP to Spring AI MCP
Related skills
More from giuseppe-trisciuoglio/developer-kit and the wider catalog.

spring-boot-actuator
Production-grade monitoring, health checks, and metrics for Spring Boot services via Actuator and Micrometer.

spring-boot-cache
Configure Spring Boot caching with Redis/Caffeine/EhCache, TTL policies, and @Cacheable/@CacheEvict annotations.

spring-boot-crud-patterns
Generate complete CRUD workflows for Spring Boot 3 services with DDD-inspired architecture and REST APIs.

spring-boot-dependency-injection
Constructor-first dependency injection patterns for Spring Boot services and configurations.

spring-boot-event-driven-patterns
Event-Driven Architecture patterns for Spring Boot with domain events, Kafka, and transactional outbox.

spring-boot-openapi-documentation
Generate OpenAPI 3.0 documentation and Swagger UI for Spring Boot 3.x REST APIs with SpringDoc