项目简介

'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 和资源能力,便于客户端理解和利用服务。

安装步骤

  1. 创建 Jooby 项目: 如果您还没有 Jooby 项目,请先按照 Jooby 官方文档指引创建一个新项目。

  2. 添加 '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>
  3. 配置 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
    }
  4. 实现 MCP 功能: 使用 '@Tool', '@Prompt', '@Resource', '@ResourceTemplate' 等注解在您的 Java 类中定义 MCP 服务器的功能。

  5. 注册 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': 服务器功能的简短描述。

基本使用方法

  1. 定义功能: 在您的 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);
        }
    }
  2. 启动 Jooby 应用: 按照 Jooby 应用的常规方式启动您的服务(例如,通过 'mvn jooby:run' 或运行打包的 JAR)。

  3. MCP 客户端连接: 一个兼容 MCP 协议的 LLM 客户端(例如,基于 'modelcontextprotocol/java-sdk' 的客户端或其他 MCP 实现)可以使用上述生成的配置信息连接到您的 'jooby-mcp' 服务器,并开始调用其声明的工具、获取 Prompt 或读取资源。服务器将根据客户端请求执行相应的方法并返回结果。

信息

分类

开发者工具