MCP Annotated Java SDK

June 7, 2026 · View on GitHub

English · 简体中文

MCP Annotated Java SDK

注解驱动 MCP 开发 — 无需 Spring、零样板代码、纯 Java。

用注解代替样板代码,在 Java 中构建 MCP 服务端。

快速开始 · 为什么选择本 SDK · 文档 · 许可证

Java Maven Central Coverage GitHub Action


概述

本 SDK 是一个轻量级的注解框架,用于简化 Java 中的 MCP 服务端开发。你可以用极少的代码定义、开发并集成 MCP 资源(Resources)、提示词(Prompts)与工具(Tools),且无需 Spring 框架

工作流: 添加依赖 → 配置 mcp-server.yml → 注解 Resources / Tools / Prompts / Completions → 通过 McpApplication 启动

📖 文档 · 💡 示例 · 🐛 提交 Issue


✨ 为什么选择本 SDK?

核心优势

  • 🚫 无需 Spring 框架 — 纯 Java 实现,轻量、快速
  • 一行启动 MCP 服务 — 最少只需一行代码即可运行服务端
  • 🎉 零样板代码 — 无需编写底层 MCP SDK 胶水代码
  • 👏 无需手写 JSON Schema — 告别复杂冗长的 JSON 定义
  • 🎯 专注业务逻辑 — 把精力放在核心功能上
  • 🔌 兼容 Spring AI 配置 — 配置文件格式与 Spring AI 框架兼容
  • 📦 类型安全 — 充分利用 Java 类型系统在编译期保障正确性

官方 MCP Java SDK对比

特性官方 MCP SDK本 SDK
所需代码量约 50–100 行约 5–10 行
JSON Schema手写 JSON无需关心
类型安全有限完整
学习曲线较陡平缓

🎯 快速开始

环境要求

  • Java 17 或更高版本(官方 MCP Java SDK 的硬性要求)

5 分钟上手

第 1 步:添加依赖

Maven:

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

Gradle:

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

第 2 步:创建配置文件

src/main/resources 下创建 mcp-server.yml

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
  subscribe-resource: true
  prompt: true
  tool: true
  completion: true
change-notification:
  resource: true
  prompt: true
  tool: true

第 3 步:创建 MCP 服务端入口

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

第 4 步:定义 MCP 资源(可选)

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

第 5 步:定义 MCP 工具

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

第 6 步:定义 MCP 提示词(可选)

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

第 7 步:运行服务端

# 编译项目
./mvnw clean package

在 IDE 中运行 MyFirstMcpServer,或使用 java -cp ... 指定编译产物与依赖 classpath。若希望用 java -jar 单文件启动,需在你的项目中自行配置可执行 JAR(例如 Spring Boot 或 Maven Shade 插件)。

完成!你的 MCP 服务端已可提供资源、工具与提示词。

📚 核心概念

什么是 MCP?

Model Context Protocol(MCP) 是一套标准化协议,用于构建向 LLM 应用暴露数据与能力的服务端。可以把它理解为面向 LLM 交互场景设计的「专用 API」。

MCP 组件

组件作用类比
Resources向 LLM 暴露数据GET 接口
Tools执行操作POST 接口
Prompts可复用模板表单模板

支持的服务端模式

本 SDK 支持两种 MCP 服务端传输模式:

模式说明适用场景
STDIO标准输入/输出通信CLI 工具、本地开发
STREAMABLEHTTP 流式传输Web 应用、生产环境(推荐)

🔧 进阶用法

配置文件

在 classpath 中创建 mcp-server.yml

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: false
  keep-alive-interval: 20000
  port: 8080

配置项说明

配置项说明默认值
enabled是否启用 MCP 服务端true
mode服务端模式:STDIOSTREAMABLESTREAMABLE
name服务端名称mcp-server
version服务端版本1.0.0
type服务端类型:SYNCASYNCSYNC
instructions给 LLM 客户端的说明必填(YAML 中不可为空)
request-timeout请求超时(毫秒)20000
capabilities.resource启用资源能力true
capabilities.subscribe-resource启用资源订阅true
capabilities.prompt启用提示词能力true
capabilities.tool启用工具能力true
capabilities.completion启用补全能力true
change-notification.resource资源变更时通知客户端true
change-notification.prompt提示词变更时通知客户端true
change-notification.tool工具变更时通知客户端true
streamable.mcp-endpointStreamable HTTP MCP 路径/mcp/message
streamable.disallow-delete是否拒绝会话 HTTP DELETEfalse
streamable.keep-alive-interval保活间隔(毫秒)20000
streamable.portSTREAMABLE 模式 HTTP 端口8080

基于 Profile 的配置

在基础配置中设置 profile 后,会从 classpath 加载 mcp-server-{profile}.yml,并通过 Jackson deep merge 与基础配置合并;capabilitiesstreamable 等嵌套对象按字段递归覆盖。profile 名称始终取自基础配置文件。合并完成后,会清除与当前 mode 不匹配的传输配置(例如 mode: STDIO 时会移除 streamable)。

可通过 Profile 区分不同环境:

# mcp-server.yml(基础配置)
enabled: true
mode: STREAMABLE
name: my-mcp-server
version: 1.0.0
profile: dev
# mcp-server-dev.yml(Profile 覆盖配置)
streamable:
  port: 8080

运行时模型与稳定性

SYNC 与 ASYNC(type

type 配置项决定框架使用哪一种 MCP Java SDK 服务端 API不会把你的组件方法变成响应式代码。

type行为
SYNC在请求线程上直接调用 @McpTool / @McpPrompt / @McpResource 方法。
ASYNC为兼容 MCP SDK 的异步 API,handler 返回 Reactor Mono。SDK 用 Mono.fromCallable(...) 包装调用 — 方法体仍是普通的 阻塞式 Java 调用。

ASYNC 不是非阻塞或 Project Reactor 编程模型。 注解方法中无需也不应返回 Mono/Flux。耗时或 CPU 密集的逻辑仍会占用 Reactor 工作线程。除非部署环境明确要求 async MCP 服务端 API,否则优先使用 SYNC。高并发场景请保持 handler 简短,并合理设置 request-timeout

组件实例与并发

SDK 为每个组件类创建 唯一实例(无参构造),该类上所有 MCP 请求共享该对象。

  • 组件类应 无状态,或仅持有 线程安全 的可变状态。
  • 不要在实例字段中存放未同步的 per-request 数据。
  • 需要共享可变状态时,请委托给线程安全的服务层。

当前 McpApplicationContext.from(...) 使用默认的单例-per-class 工厂;组件类需提供 public 无参构造器。公开 API 尚未内置 Spring/CDI 集成。

McpApplication.run(mainClass, args) 默认加载 mcp-server.yml;可通过第三个参数指定 classpath 中的其他配置文件名。

MCP Java SDK 2.x(候选版本)

本项目基于官方 MCP Java SDK 2.0.0-RC1,属于 预发布候选版本。2.0 正式版发布前 API 仍可能变更 — 请锁定依赖版本,升级后重新跑集成测试。

  • 当前支持的 HTTP 传输为 STREAMABLE

🏗️ 推荐项目结构

your-mcp-project/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── MyMcpServer.java         # 入口类
│   │   │           ├── components/
│   │   │           │   ├── MyResources.java     # MCP 资源
│   │   │           │   ├── MyTools.java         # MCP 工具
│   │   │           │   └── MyPrompts.java       # MCP 提示词
│   │   │           └── service/
│   │   │               └── BusinessLogic.java   # 业务逻辑
│   │   └── resources/
│   │       └── mcp-server.yml                   # MCP 配置
│   └── test/
│       └── java/
│           └── com/
│               └── example/
│                   └── McpServerTest.java       # 单元测试

🧪 测试

运行单元测试(请使用 Maven Wrapper 构建,勿使用系统安装的 mvn):

./mvnw clean test

Windows:

mvnw.cmd clean test

❓ 常见问题

问:必须使用 Spring 框架吗?

答: 不需要。本 SDK 完全独立于 Spring。若你后续希望迁移到 Spring AI,配置文件格式是兼容的。

问:可以用于生产环境吗?

答: 注解层用于开发与测试已较稳定,但依赖官方 MCP Java SDK 2.0.0-RC1(候选版本)。生产使用前请锁定依赖版本、跑完自己的集成测试,并关注 2.0 正式版发布前可能的 SDK API 变更。

问:type: ASYNC 是什么意思?

答: 表示使用底层 SDK 的 async MCP 服务端 API。你的 @McpTool / @McpPrompt / @McpResource 方法仍是普通阻塞 Java 代码,框架会用 Mono.fromCallable(...) 包装。无特殊需求时请优先使用 SYNC。

问:组件类是单例吗?

答: 是。SDK 为每个组件类创建一个实例并在所有请求间复用。请保持组件无状态或线程安全,不要在实例字段中存放未同步的 per-request 可变状态。

问:需要什么 Java 版本?

答: 需要 Java 17 或更高版本,这是底层 MCP Java SDK 的要求。

问:需要什么 Maven 版本?

答: 直接使用项目自带的 Maven Wrapper(./mvnwmvnw.cmd)即可构建。

问:如何调试 MCP 服务端?

答: 可使用 MCP Inspector,并在 Java 代码中设置断点进行调试。

问:应该选择哪种服务端模式?

答:

  • STDIO:CLI 工具与本地开发
  • STREAMABLE:Web 应用与生产部署(推荐)

🤝 参与贡献

欢迎贡献代码与文档!建议流程:

  1. Fork 本仓库
  2. 创建功能或修复分支
  3. 为改动补充测试
  4. 必要时更新文档
  5. 确保测试通过
  6. 提交 Pull Request,并清晰描述变更内容

本地开发

# 克隆仓库
git clone https://github.com/thought2code/mcp-annotated-java-sdk.git
cd mcp-annotated-java-sdk

# 构建项目(validate 阶段会执行 Spotless 格式检查)
./mvnw clean install

# 运行测试
./mvnw clean test

📖 相关链接

📄 许可证

本项目采用 MIT License

🙏 致谢

Note

本项目仍在积极开发中,欢迎反馈与贡献!