一个极简的Java框架,用于快速创建MCP(模型上下文协议)服务器,无需处理Jetty配置、JSON处理或反射魔法的麻烦。
@McpTool和@McpParam注解你的方法git clone https://github.com/qaware/mcp-server-kickstart.git
cd mcp-server-kickstart
./gradlew build
public class MyTools {
@McpTool("将两个数字相加")
public int add(@McpParam(name = "a", description = "第一个数字") int a,
@McpParam(name = "b", description = "第二个数字") int b) {
return a + b;
}
@McpTool("获取目录中文件的信息")
public List<String> listFiles(@McpParam(name = "directory", description = "目录路径") String directory) {
return Arrays.stream(new File(directory).listFiles())
.map(File::getName)
.collect(Collectors.toList());
}
}
public class Server {
public static void main(String[] args) throws Exception {
McpServer.create()
.serverInfo("我的MCP服务器", "1.0.0")
.port(8090)
.addTool(new MyTools())
.start();
}
}
./gradlew run
你的MCP服务器将在http://localhost:8090/mcp上可用。
如果你想暴露不同的工具,请使用
./gradlew run --args com.qaware.mcp.tools.McpSourceTool
你可以提供多个类名。
服务器记录了所有工具注册和请求。检查控制台输出:
INFO - 创建MCP Servlet '我的MCP服务器' v1.0.0
INFO - 注册来自:MyTools 的工具
INFO - MCP服务器成功启动在 http://localhost:8090
框架会自动处理以下数据类型的JSON模式生成:
McpServer.create()
.serverInfo("我的服务器", "2.0.0") // 服务器名称和版本
.port(8080) // HTTP端口(默认:8090)
.addTool(new MyTools()) // 添加工具实例
.addTool(new MoreTools()) // 添加多个工具
.start();
方法必须用@McpTool("描述")注解
所有参数都必须用@McpParam(name = "参数名", description = "...")注解
返回类型会被自动JSON序列化
异常会被自动捕获并作为错误响应返回
在你的KiloCode MCP配置中添加这行(你需要使用SSE!):
{
"mcpServers": {
"java-kickstart-server": {
"url": "http://localhost:8090/sse",
"headers": {
"Authorization": "Bearer your-token-here"
},
"alwaysAllow": ["hello", "add", "getItems"],
"disabled": false
}
}
}
位置:
配置:
{
"servers": {
"my-local-server": {
"url": "http://localhost:8090/mcp",
"requestInit": {
"headers": {
"Authorization": "Bearer XYZ!"
}
}
}
}
}
根据文档,这应该适用于Claude Desktop:
位置:
配置:
{
"mcpServers": {
"my-java-server": {
"command": "node",
"args": ["path/to/your/mcp-server"],
"env": {
"SERVER_URL": "http://localhost:8_090/sse"
}
}
}
}
注意:Claude Desktop配置可能有所不同,请查看官方Claude MCP文档以获取确切格式。
任何MCP客户端都应该能够连接到:http://localhost:8090/sse
public class Calculator {
@McpTool("执行基本算术运算")
public double calculate(@McpParam(name = "operation", description = "操作:+, -, *, /") String op,
@McpParam(name = "a") double a,
@McpParam(name = "b") double b) {
return switch (op) {
case "+" -> a + b;
case "-" -> a - b;
case "*" -> a * b;
case "/" -> a / b;
default -> throw new IllegalArgumentException("未知操作:" + op);
};
}
}
public class FileTools {
@McpTool("从文件读取内容")
public String readFile(@McpParam(name = "path", description = "文件路径") String path) throws IOException {
return Files.readString(Paths.get(path));
}
@McpTool("列出目录中的文件")
public List<String> listDirectory(@McpParam(name = "path") String path) {
File dir = new File(path);
return dir.isDirectory() ? Arrays.asList(dir.list()) : List.of();
}
}
public class DataTools {
@McpTool("过滤数字列表")
public List<Integer> filterNumbers(@McpParam(name = "numbers") List<Integer> numbers,
@McpParam(name = "threshold") int threshold) {
return numbers.stream()
.filter(n -> n > threshold)
.collect(Collectors.toList());
}
}
./gradlew fatJar
java -jar build/libs/mcp-server-kickstart-1.0.0.jar
io.modelcontextprotocol.sdk:mcp:0.10.0org.eclipse.jetty:jetty-server:12.0.22com.fasterxml.jackson.core:jackson-databind:2.16.1org.slf4j:slf4j-simple:2.0.9MIT许可证 - 欢迎在你的项目中使用!