项目简介
'jooby-mcp' 是一个用于 Jooby 框架的模块,它集成了官方 Java Model Context Protocol (MCP) SDK,让开发者能够以声明式(基于注解)的方式轻松构建和部署 MCP 服务器。它通过自动化工具、Prompt 模板和资源的管理与注册,简化了 LLM 应用后端服务的开发,并支持多种传输协议,为大型语言模型(LLM)应用提供强大的上下文服务框架。
主要功能点
- 工具 (Tools) 注册与执行: 允许您定义可供 LLM 调用的外部函数或服务,例如数学计算、数据库查询等。'jooby-mcp' 支持输入参数验证和自动输出 Schema 生成,简化了工具的集成。
- Prompt 模板 (Prompts) 管理与渲染: 支持创建可定制的 Prompt 模板,LLM 可以通过调用这些模板获取生成请求的文本,实现灵活的 LLM 交互模式。
- 资源 (Resources) 托管与访问: 提供数据访问能力,LLM 可以读取服务器上托管的各种资源,如文档、图片或结构化数据。
- 资源模板 (Resource Templates): 支持参数化的资源访问,通过 URI 模板动态生成和获取资源内容,例如根据项目名称获取项目详情。
- 自动补全 (Completions): 为 Prompt 参数和资源模板参数提供自动补全功能,提升 LLM 交互的准确性和体验。
- 多种传输协议: 支持 SSE (Server-Sent Events) 和 Streamable HTTP 两种传输协议,确保灵活高效的客户端-服务器通信。
- 多服务器支持: 可以在同一个 Jooby 应用中运行多个独立的 MCP 服务器实例,每个服务器拥有自己的功能集和配置,实现服务的模块化管理。
- 注解驱动开发: 利用注解处理器在编译时发现和注册功能,无需运行时反射,从而提高应用程序的启动性能和整体效率。
- 会话管理与能力声明: 服务器自动处理客户端会话,并向连接的客户端声明其提供的所有工具、Prompt 和资源能力,便于客户端理解和利用服务。
安装步骤
-
创建 Jooby 项目: 如果您还没有 Jooby 项目,请先按照 Jooby 官方文档指引创建一个新项目。
-
添加 'jooby-mcp' 依赖: 在您的 'pom.xml' 文件中,添加 'jooby-mcp' 模块依赖及其注解处理器。请将 '${jooby.mcp.version}' 替换为实际的版本号,例如 '1.x' 系列的最新版本。
<dependency> <groupId>io.github.kliushnichenko</groupId> <artifactId>jooby-mcp</artifactId> <version>${jooby.mcp.version}</version> </dependency><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>io.github.kliushnichenko</groupId> <artifactId>jooby-mcp-apt</artifactId> <version>${jooby.mcp.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> -
配置 MCP 服务器: 在您的 'application.conf' 文件中添加 MCP 服务器的配置。这是一个基本的 'streamable-http' 传输配置示例:
mcp.default { name: "my-awesome-mcp-server" version: "0.1.0" transport: "streamable-http" mcpEndpoint: "/mcp" disallowDelete: false keepAliveInterval: 45 } -
实现 MCP 功能: 使用 '@Tool', '@Prompt', '@Resource', '@ResourceTemplate' 等注解在您的 Java 类中定义 MCP 服务器的功能。
-
注册 MCP 模块: 在您的 Jooby 应用主类中,安装 'JacksonModule' (用于 JSON 编解码),选择一个依赖注入模块 (例如 'AvajeInjectModule'),然后安装 'McpModule' 并传入由注解处理器生成的 MCP 服务器实例(例如 'DefaultMcpServer')。
import io.github.kliushnichenko.jooby.mcp.McpModule; import io.jooby.Jooby; import io.jooby.avaje.inject.AvajeInjectModule; import io.jooby.jackson.JacksonModule; public class App extends Jooby { { install(new JacksonModule()); install(AvajeInjectModule.of()); // 或您选择的其他DI模块 // DefaultMcpServer 是由 jooby-mcp-apt 注解处理器生成的类 install(new McpModule(new DefaultMcpServer())); } public static void main(String[] args) { runApp(args, App::new); } }
服务器配置
MCP 客户端需要 MCP 服务器的启动命令 (command) 及其参数 (args) 来与其建立连接。以下是 'jooby-mcp' 服务器的典型 JSON 配置示例,假定您的 Jooby 应用已打包成可执行 JAR。
{ "name": "my-awesome-mcp-server", "command": "java", "args": [ "-jar", "path/to/your-jooby-app.jar" ], "env": { "mcp.default.name": "my-awesome-mcp-server", "mcp.default.version": "0.1.0", "mcp.default.transport": "streamable-http", "mcp.default.mcpEndpoint": "/mcp", "mcp.default.disallowDelete": false, "mcp.default.keepAliveInterval": 45 }, "description": "一个使用Jooby框架实现的Model Context Protocol服务器,提供各种上下文服务和功能。" }
参数注释:
- 'name': MCP 服务器的唯一名称,例如 '"my-awesome-mcp-server"'。
- 'command': 启动 Jooby 应用的命令,通常是 '"java"'。
- 'args': 传递给 'command' 的参数列表,例如 '"-jar"' 和您的 Jooby 应用 JAR 文件的相对或绝对路径。
- 'env': 环境变量,用于配置 MCP 服务器的具体行为,会覆盖 'application.conf' 中的同名配置。
- 'mcp.default.name': MCP 服务器在协议中声明的名称(必需)。
- 'mcp.default.version': MCP 服务器的版本号(必需)。
- 'mcp.default.transport': 传输协议类型,可选 '"sse"' 或 '"streamable-http"' (默认)。
- 'mcp.default.mcpEndpoint': 对于 Streamable HTTP 传输,这是 MCP 服务端点的路径(默认 '/mcp')。
- 'mcp.default.sseEndpoint': 对于 SSE 传输,这是 SSE 事件流的路径(默认 '/mcp/sse')。
- 'mcp.default.messageEndpoint': 对于 SSE 传输,这是用于发送客户端消息的路径(默认 '/mcp/message')。
- 'mcp.default.disallowDelete': 是否禁止通过 DELETE 请求关闭会话(默认 'false')。
- 'mcp.default.keepAliveInterval': 保持连接的间隔时间(秒),设置为正整数启用,默认不启用。
- 'description': 服务器功能的简短描述。
基本使用方法
-
定义功能: 在您的 Jooby 项目中,创建 Java 类并使用 '@Tool', '@Prompt', '@Resource', '@ResourceTemplate' 等注解来定义您的业务逻辑。例如,一个简单的加法工具:
import io.github.kliushnichenko.jooby.mcp.annotation.Tool; import io.github.kliushnichenko.jooby.mcp.annotation.ToolArg; import jakarta.inject.Singleton; @Singleton public class CalculatorService { @Tool(name = "add", description = "Adds two numbers together") public String add( @ToolArg(name = "first", description = "First number to add") int a, @ToolArg(name = "second", description = "Second number to add") int b ) { int result = a + b; return String.valueOf(result); } } -
启动 Jooby 应用: 按照 Jooby 应用的常规方式启动您的服务(例如,通过 'mvn jooby:run' 或运行打包的 JAR)。
-
MCP 客户端连接: 一个兼容 MCP 协议的 LLM 客户端(例如,基于 'modelcontextprotocol/java-sdk' 的客户端或其他 MCP 实现)可以使用上述生成的配置信息连接到您的 'jooby-mcp' 服务器,并开始调用其声明的工具、获取 Prompt 或读取资源。服务器将根据客户端请求执行相应的方法并返回结果。
信息
分类
开发者工具