๐ Declarative MCP Java SDK Development with Java Annotations
Annotation-driven MCP Java SDK is a lightweight, annotation-based framework that simplifies MCP server development in Java. Define, develop and integrate your MCP Resources / Prompts / Tools with minimal code - No Spring Framework Required.
๐ Documentation | ๐ก Examples | ๐ Report Issues
- ๐ซ No Spring Framework Required - Pure Java, lightweight and fast
- โก Instant MCP Server - Get your server running with just 1 line of code
- ๐ Zero Boilerplate - No need to write low-level MCP SDK code
- ๐ No JSON Schema - Forget about complex and lengthy JSON definitions
- ๐ฏ Focus on Logic - Concentrate on your core business logic
- ๐ Spring AI Compatible - Configuration file compatible with Spring AI Framework
- ๐ Multilingual Support - Built-in i18n support for MCP components
- ๐ฆ Type-Safe - Leverage Java's type system for compile-time safety
Comparison with Official MCP Java SDK
| Feature | Official MCP SDK | This SDK |
|---|---|---|
| Code Required | ~50-100 lines | ~5-10 lines |
| JSON Schema | Hand-coded JSON | No need to care |
| Type Safety | Limited | Full |
| Learning Curve | Steep | Gentle |
| Multilingual | Unsupported | Supported |
- Java 17 or later (required by official MCP Java SDK)
- Maven 3.6+ or Gradle 7+
Maven:
<dependency>
<groupId>io.github.codeboyzhou</groupId>
<artifactId>mcp-declarative-java-sdk</artifactId>
<version>0.9.0</version>
</dependency>Gradle:
implementation 'io.github.codeboyzhou:mcp-declarative-java-sdk:0.9.0'@McpServerApplication
// If your MCP server components don't need to be multilingual, you can remove this annotation.
@McpI18nEnabled(resourceBundleBaseName = "i18n/mcp_server_components_info")
public class MyFirstMcpServer {
public static void main(String[] args) {
McpServers.run(MyFirstMcpServer.class, args)
.startStdioServer(McpServerInfo.builder()
.name("my-first-mcp-server")
.version("1.0.0")
.build());
}
}public class MyResources {
@McpResource(uri = "system://info", description = "System information")
public Map<String, String> getSystemInfo() {
Map<String, String> info = new HashMap<>();
info.put("os", System.getProperty("os.name"));
info.put("java", System.getProperty("java.version"));
info.put("cores", String.valueOf(Runtime.getRuntime().availableProcessors()));
return info;
}
}public class MyTools {
@McpTool(description = "Calculate the sum of two numbers")
public int add(
@McpToolParam(name = "a", description = "First number", required = true) int a,
@McpToolParam(name = "b", description = "Second number", required = true) int b
) {
return a + b;
}
}public class MyPrompts {
@McpPrompt(description = "Generate code for a given task")
public String generateCode(
@McpPromptParam(name = "language", description = "Programming language", required = true) String language,
@McpPromptParam(name = "task", description = "Task description", required = true) String task
) {
return String.format("Write %s code to: %s", language, task);
}
}# Compile and run
mvn clean package
java -jar target/your-app.jarThat's it! Your MCP server is now ready to serve resources, tools, and prompts!
The Model Context Protocol (MCP) is a standardized protocol for building servers that expose data and functionality to LLM applications. Think of it like a web API, but specifically designed for LLM interactions.
| Component | Purpose | Analogy |
|---|---|---|
| Resources | Expose data to LLM | GET endpoints |
| Tools | Execute actions | POST endpoints |
| Prompts | Reusable templates | Form templates |
This SDK supports three MCP server modes:
- STDIO - Standard input/output communication (default for CLI tools)
- SSE (Server-Sent Events) - HTTP-based real-time communication
- Streamable HTTP - HTTP streaming for web applications
Create mcp-server.yml in your classpath:
enabled: true
mode: STREAMABLE
name: my-mcp-server
version: 1.0.0
type: SYNC
request-timeout: 20000
capabilities:
resource: true
prompt: true
tool: true
change-notification:
resource: true
prompt: true
tool: true
streamable:
mcp-endpoint: /mcp/message
disallow-delete: true
keep-alive-interval: 30000
port: 8080Then start your server:
McpServers servers = McpServers.run(MyMcpServer.class, args);
servers.startServer(); // Uses default mcp-server.yml
// or
servers.startServer("custom-config.yml");Enable i18n for your MCP components:
@McpServerApplication
@McpI18nEnabled(resourceBundleBaseName = "messages")
public class I18nMcpServer {
public static void main(String[] args) {
McpServers.run(I18nMcpServer.class, args)
.startStdioServer(McpServerInfo.builder()
.name("i18n-server")
.version("1.0.0")
.build());
}
}
// Create messages.properties
# messages.properties
tool.calculate.description=Calculate the sum of two numbers
tool.calculate.param.a.description=First number
tool.calculate.param.b.description=Second number
// Create messages_zh_CN.properties
# messages_zh_CN.properties
tool.calculate.description=่ฎก็ฎไธคไธชๆฐๅญ็ๅ
tool.calculate.param.a.description=็ฌฌไธไธชๆฐๅญ
tool.calculate.param.b.description=็ฌฌไบไธชๆฐๅญ
// Then use the i18n messages in your MCP components, like this:
@McpTool(description = "tool.calculate.description")
public int add(
@McpToolParam(name = "a", description = "tool.calculate.param.a.description") int a,
@McpToolParam(name = "b", description = "tool.calculate.param.b.description") int b
) {
return a + b;
}A typical project structure:
your-mcp-project/
โโโ pom.xml
โโโ src/
โ โโโ main/
โ โ โโโ java/
โ โ โ โโโ com/
โ โ โ โโโ example/
โ โ โ โโโ MyMcpServer.java # Main entry point
โ โ โ โโโ components/
โ โ โ โ โโโ MyResources.java # MCP Resources
โ โ โ โ โโโ MyTools.java # MCP Tools
โ โ โ โ โโโ MyPrompts.java # MCP Prompts
โ โ โ โโโ service/
โ โ โ โโโ BusinessLogic.java # Your business logic
โ โ โโโ resources/
โ โ โโโ mcp-server.yml # MCP configuration
โ โ โโโ messages.properties # i18n messages
โ โโโ test/
โ โโโ java/
โ โโโ com/
โ โโโ example/
โ โโโ McpServerTest.java # Unit tests
Run the test suite:
mvn testRun tests with coverage:
mvn clean test jacoco:reportA: No! This SDK is completely independent of Spring Framework. However, the configuration file format is compatible with Spring AI if you want to migrate.
A: This project is currently in active development. While it's stable for development and testing, we recommend thorough testing before production use.
A: Java 17 or later is required, as this is a constraint of the underlying MCP Java SDK.
A: You can use the inspector and set Java breakpoint to debug your MCP server.
We welcome and appreciate contributions! Please follow these steps to contribute:
- Fork the repository
- Create a new branch for your feature or bug fix
- Submit a pull request with a clear description of your changes
# Clone the repository
git clone https://github.com/codeboyzhou/mcp-declarative-java-sdk.git
cd mcp-declarative-java-sdk
# Build the project
mvn clean install
# Run tests
mvn testThis project is licensed under the MIT License.
- MCP Java SDK - The underlying MCP implementation
- Model Context Protocol - The protocol specification
Note
This project is under active development. We appreciate your feedback and contributions!