Annotation-driven MCP Java SDK

May 3, 2026 ยท View on GitHub

Java Maven Central Commit Activity Coverage GitHub Action

Annotation-driven MCP dev ๐Ÿš€ No Spring, Zero Boilerplate, Pure Java.

This 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

โœจ Why This SDK?

Key Advantages

  • ๐Ÿšซ 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

FeatureOfficial MCP SDKThis SDK
Code Required~50-100 lines~5-10 lines
JSON SchemaHand-coded JSONNo need to care
Type SafetyLimitedFull
Learning CurveSteepGentle
MultilingualUnsupportedSupported

๐ŸŽฏ Quick Start

Prerequisites

  • Java 17 or later (required by official MCP Java SDK)

5-Minutes Tutorial

Step 1: Add Dependency

Maven:

<dependency>
    <groupId>io.github.thought2code</groupId>
    <artifactId>mcp-annotated-java-sdk</artifactId>
    <version>0.13.0</version>
</dependency>

Gradle:

implementation 'io.github.thought2code:mcp-annotated-java-sdk:0.13.0'

Step 2: Create Configuration File

Create mcp-server.yml in your src/main/resources:

enabled: true
mode: STDIO
name: my-first-mcp-server
version: 1.0.0
type: SYNC
instructions: You are a helpful AI assistant
request-timeout: 20000
capabilities:
  resource: true
  prompt: true
  tool: true
change-notification:
  resource: true
  prompt: true
  tool: true

Step 3: Create Your MCP Server

@McpServerApplication
public class MyFirstMcpServer {
    public static void main(String[] args) {
        McpApplication.run(MyFirstMcpServer.class, args);
    }
}

Step 4: Define MCP Resources (if needed)

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;
    }
}

Step 5: Define MCP Tools

public class MyTools {
    @McpTool(description = "Calculate the sum of two numbers")
    public int add(
        @McpToolParam(name = "a", description = "First number") int a,
        @McpToolParam(name = "b", description = "Second number") int b
    ) {
        return a + b;
    }
}

Step 6: Define MCP Prompts (if needed)

public class MyPrompts {
    @McpPrompt(description = "Generate code for a given task")
    public String generateCode(
        @McpPromptParam(name = "language", description = "Programming language") String language,
        @McpPromptParam(name = "task", description = "Task description") String task
    ) {
        return String.format("Write %s code to: %s", language, task);
    }
}

Step 7: Run Your Server

# Compile and run
./mvnw clean package
java -jar target/your-app.jar

That's it! Your MCP server is now ready to serve resources, tools, and prompts!

๐Ÿ“š Core Concepts

What is MCP?

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.

MCP Components

ComponentPurposeAnalogy
ResourcesExpose data to LLMGET endpoints
ToolsExecute actionsPOST endpoints
PromptsReusable templatesForm templates

Supported Server Modes

This SDK supports three MCP server modes:

ModeDescriptionUse Case
STDIOStandard input/output communicationCLI tools, local development
SSEServer-Sent Events (HTTP-based)Real-time web applications (deprecated)
STREAMABLEHTTP streamingWeb applications, recommended for production

๐Ÿ”ง Advanced Usage

Configuration File

Create mcp-server.yml in your classpath:

enabled: true
mode: STREAMABLE
name: my-mcp-server
version: 1.0.0
type: SYNC
instructions: You are a helpful AI assistant
request-timeout: 20000
capabilities:
  resource: true
  subscribe-resource: true
  prompt: true
  tool: true
  completion: true
change-notification:
  resource: true
  prompt: true
  tool: true
streamable:
  mcp-endpoint: /mcp/message
  disallow-delete: true
  keep-alive-interval: 30000
  port: 8080

Configuration Properties

PropertyDescriptionDefault
enabledEnable/disable MCP servertrue
modeServer mode: STDIO, SSE, STREAMABLESTREAMABLE
nameServer namemcp-server
versionServer version1.0.0
typeServer type: SYNC, ASYNCSYNC
instructionsInstructions for the LLM client(empty)
request-timeoutRequest timeout in milliseconds20000
capabilities.resourceEnable resource supporttrue
capabilities.subscribe-resourceEnable resource subscriptiontrue
capabilities.promptEnable prompt supporttrue
capabilities.toolEnable tool supporttrue
capabilities.completionEnable completion supporttrue
change-notification.resourceNotify clients on resource changetrue
change-notification.promptNotify clients on prompt changetrue
change-notification.toolNotify clients on tool changetrue

Profile-based Configuration

You can use profiles for different environments:

# mcp-server.yml (base configuration)
enabled: true
mode: STREAMABLE
name: my-mcp-server
version: 1.0.0
profile: dev
# mcp-server-dev.yml (profile-specific configuration)
streamable:
  port: 8080

Multilingual Support (i18n)

Enable i18n for your MCP components:

@McpServerApplication
@McpI18nEnabled(resourceBundleBaseName = "messages")
public class I18nMcpServer {
    public static void main(String[] args) {
        McpApplication.run(I18nMcpServer.class, args);
    }
}

Create resource bundles:

# 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
# messages_zh_CN.properties
tool.calculate.description=่ฎก็ฎ—ไธคไธชๆ•ฐๅญ—็š„ๅ’Œ
tool.calculate.param.a.description=็ฌฌไธ€ไธชๆ•ฐๅญ—
tool.calculate.param.b.description=็ฌฌไบŒไธชๆ•ฐๅญ—

Use i18n keys in your MCP components:

@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;
}

๐Ÿ—๏ธ Project Structure

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

๐Ÿงช Testing

Run the test suite:

./mvnw clean test

โ“ FAQ

Q: Do I need Spring Framework?

A: No! This SDK is completely independent of Spring Framework. However, the configuration file format is compatible with Spring AI if you want to migrate.

Q: Can I use this in production?

A: This project is currently in active development. While it's stable for development and testing, we recommend thorough testing before production use.

Q: What Java version is required?

A: Java 17 or later is required, as this is a constraint of the underlying MCP Java SDK.

Q: What Maven version is required?

A: Just use the provided Maven wrapper script ./mvnw to build this project.

Q: How do I debug my MCP server?

A: You can use the MCP Inspector and set Java breakpoints to debug your MCP server.

Q: Which server mode should I use?

A:

  • STDIO: For CLI tools and local development
  • STREAMABLE: For web applications and production deployments (recommended)
  • SSE: Deprecated, use STREAMABLE instead

๐Ÿค Contributing

We welcome and appreciate contributions! Please follow these steps to contribute:

  1. Fork the repository
  2. Create a new branch for your feature or bug fix
  3. Add tests for your changes
  4. Update documentation if necessary
  5. Ensure all tests pass
  6. Submit a pull request with a clear description of your changes

Development Setup

# Clone the repository
git clone https://github.com/thought2code/mcp-annotated-java-sdk.git
cd mcp-annotated-java-sdk

# Build the project
./mvnw clean install

# Run tests
./mvnw clean test

๐Ÿ“– Documentation

๐Ÿ“„ License

This project is licensed under the MIT License.

๐Ÿ™ Acknowledgments

Note

This project is under active development. We appreciate your feedback and contributions!