[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F4S372EAT7SEAG0WTQPPD3":3,"skill-same:01M6F4S372EAT7SEAG0WTQPPD3":75},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6F4S372EAT7SEAG0WTQPPD3","java-mcp-server-generator",null,"Generate a complete Model Context Protocol server project in Java using the official MCP Java SDK with reactive streams and optional Spring Boot integration.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fgithub\u002Fawesome-copilot\u002Fjava-mcp-server-generator\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"mcp server","generator","java","MCP","server","java mcp server generator","integration","streams","with","complete","project","spring","model","spring boot","protocol","generate","boot","official","model context protocol","sdk","2026-11-10 10:12:30",false,"---\nname: java-mcp-server-generator\ndescription: 'Generate a complete Model Context Protocol server project in Java using the official MCP Java SDK with reactive streams and optional Spring Boot integration.'\n---\n\n# Java MCP Server Generator\n\nGenerate a complete, production-ready MCP server in Java using the official Java SDK with Maven or Gradle.\n\n## Project Generation\n\nWhen asked to create a Java MCP server, generate a complete project with this structure:\n\n```\nmy-mcp-server\u002F\n├── pom.xml (or build.gradle.kts)\n├── src\u002F\n│   ├── main\u002F\n│   │   ├── java\u002F\n│   │   │   └── com\u002Fexample\u002Fmcp\u002F\n│   │   │       ├── McpServerApplication.java\n│   │   │       ├── config\u002F\n│   │   │       │   └── ServerConfiguration.java\n│   │   │       ├── tools\u002F\n│   │   │       │   ├── ToolDefinitions.java\n│   │   │       │   └── ToolHandlers.java\n│   │   │       ├── resources\u002F\n│   │   │       │   ├── ResourceDefinitions.java\n│   │   │       │   └── ResourceHandlers.java\n│   │   │       └── prompts\u002F\n│   │   │           ├── PromptDefinitions.java\n│   │   │           └── PromptHandlers.java\n│   │   └── resources\u002F\n│   │       └── application.properties (if using Spring)\n│   └── test\u002F\n│       └── java\u002F\n│           └── com\u002Fexample\u002Fmcp\u002F\n│               └── McpServerTest.java\n└── README.md\n```\n\n## Maven pom.xml Template\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\n         http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>com.example\u003C\u002FgroupId>\n    \u003CartifactId>my-mcp-server\u003C\u002FartifactId>\n    \u003Cversion>1.0.0\u003C\u002Fversion>\n    \u003Cpackaging>jar\u003C\u002Fpackaging>\n\n    \u003Cname>My MCP Server\u003C\u002Fname>\n    \u003Cdescription>Model Context Protocol server implementation\u003C\u002Fdescription>\n\n    \u003Cproperties>\n        \u003Cjava.version>17\u003C\u002Fjava.version>\n        \u003Cmaven.compiler.source>17\u003C\u002Fmaven.compiler.source>\n        \u003Cmaven.compiler.target>17\u003C\u002Fmaven.compiler.target>\n        \u003Cproject.build.sourceEncoding>UTF-8\u003C\u002Fproject.build.sourceEncoding>\n        \u003Cmcp.version>0.14.1\u003C\u002Fmcp.version>\n        \u003Cslf4j.version>2.0.9\u003C\u002Fslf4j.version>\n        \u003Clogback.version>1.4.11\u003C\u002Flogback.version>\n        \u003Cjunit.version>5.10.0\u003C\u002Fjunit.version>\n    \u003C\u002Fproperties>\n\n    \u003Cdependencies>\n        \u003C!-- MCP Java SDK -->\n        \u003Cdependency>\n            \u003CgroupId>io.modelcontextprotocol.sdk\u003C\u002FgroupId>\n            \u003CartifactId>mcp\u003C\u002FartifactId>\n            \u003Cversion>${mcp.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n\n        \u003C!-- Logging -->\n        \u003Cdependency>\n            \u003CgroupId>org.slf4j\u003C\u002FgroupId>\n            \u003CartifactId>slf4j-api\u003C\u002FartifactId>\n            \u003Cversion>${slf4j.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>ch.qos.logback\u003C\u002FgroupId>\n            \u003CartifactId>logback-classic\u003C\u002FartifactId>\n            \u003Cversion>${logback.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n\n        \u003C!-- Testing -->\n        \u003Cdependency>\n            \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n            \u003CartifactId>junit-jupiter\u003C\u002FartifactId>\n            \u003Cversion>${junit.version}\u003C\u002Fversion>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>io.projectreactor\u003C\u002FgroupId>\n            \u003CartifactId>reactor-test\u003C\u002FartifactId>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\n    \u003Cbuild>\n        \u003Cplugins>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-compiler-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.11.0\u003C\u002Fversion>\n            \u003C\u002Fplugin>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-surefire-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.1.2\u003C\u002Fversion>\n            \u003C\u002Fplugin>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-shade-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.5.0\u003C\u002Fversion>\n                \u003Cexecutions>\n                    \u003Cexecution>\n                        \u003Cphase>package\u003C\u002Fphase>\n                        \u003Cgoals>\n                            \u003Cgoal>shade\u003C\u002Fgoal>\n                        \u003C\u002Fgoals>\n                        \u003Cconfiguration>\n                            \u003Ctransformers>\n                                \u003Ctransformer implementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n                                    \u003CmainClass>com.example.mcp.McpServerApplication\u003C\u002FmainClass>\n                                \u003C\u002Ftransformer>\n                            \u003C\u002Ftransformers>\n                        \u003C\u002Fconfiguration>\n                    \u003C\u002Fexecution>\n                \u003C\u002Fexecutions>\n            \u003C\u002Fplugin>\n        \u003C\u002Fplugins>\n    \u003C\u002Fbuild>\n\u003C\u002Fproject>\n```\n\n## Gradle build.gradle.kts Template\n\n```kotlin\nplugins {\n    id(\"java\")\n    id(\"application\")\n}\n\ngroup = \"com.example\"\nversion = \"1.0.0\"\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_17\n    targetCompatibility = JavaVersion.VERSION_17\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    \u002F\u002F MCP Java SDK\n    implementation(\"io.modelcontextprotocol.sdk:mcp:0.14.1\")\n    \n    \u002F\u002F Logging\n    implementation(\"org.slf4j:slf4j-api:2.0.9\")\n    implementation(\"ch.qos.logback:logback-classic:1.4.11\")\n    \n    \u002F\u002F Testing\n    testImplementation(\"org.junit.jupiter:junit-jupiter:5.10.0\")\n    testImplementation(\"io.projectreactor:reactor-test:3.5.0\")\n}\n\napplication {\n    mainClass.set(\"com.example.mcp.McpServerApplication\")\n}\n\ntasks.test {\n    useJUnitPlatform()\n}\n```\n\n## McpServerApplication.java Template\n\n```java\npackage com.example.mcp;\n\nimport com.example.mcp.tools.ToolHandlers;\nimport com.example.mcp.resources.ResourceHandlers;\nimport com.example.mcp.prompts.PromptHandlers;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.McpServerBuilder;\nimport io.mcp.server.transport.StdioServerTransport;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.Disposable;\n\npublic class McpServerApplication {\n    \n    private static final Logger log = LoggerFactory.getLogger(McpServerApplication.class);\n    \n    public static void main(String[] args) {\n        log.info(\"Starting MCP Server...\");\n        \n        try {\n            McpServer server = createServer();\n            StdioServerTransport transport = new StdioServerTransport();\n            \n            \u002F\u002F Start server\n            Disposable serverDisposable = server.start(transport).subscribe();\n            \n            \u002F\u002F Graceful shutdown\n            Runtime.getRuntime().addShutdownHook(new Thread(() -> {\n                log.info(\"Shutting down MCP server\");\n                serverDisposable.dispose();\n                server.stop().block();\n            }));\n            \n            log.info(\"MCP Server started successfully\");\n            \n            \u002F\u002F Keep running\n            Thread.currentThread().join();\n            \n        } catch (Exception e) {\n            log.error(\"Failed to start MCP server\", e);\n            System.exit(1);\n        }\n    }\n    \n    private static McpServer createServer() {\n        McpServer server = McpServerBuilder.builder()\n            .serverInfo(\"my-mcp-server\", \"1.0.0\")\n            .capabilities(capabilities -> capabilities\n                .tools(true)\n                .resources(true)\n                .prompts(true))\n            .build();\n        \n        \u002F\u002F Register handlers\n        ToolHandlers.register(server);\n        ResourceHandlers.register(server);\n        PromptHandlers.register(server);\n        \n        return server;\n    }\n}\n```\n\n## ToolDefinitions.java Template\n\n```java\npackage com.example.mcp.tools;\n\nimport io.mcp.json.JsonSchema;\nimport io.mcp.server.tool.Tool;\n\nimport java.util.List;\n\npublic class ToolDefinitions {\n    \n    public static List\u003CTool> getTools() {\n        return List.of(\n            createGreetTool(),\n            createCalculateTool()\n        );\n    }\n    \n    private static Tool createGreetTool() {\n        return Tool.builder()\n            .name(\"greet\")\n            .description(\"Generate a greeting message\")\n            .inputSchema(JsonSchema.object()\n                .property(\"name\", JsonSchema.string()\n                    .description(\"Name to greet\")\n                    .required(true)))\n            .build();\n    }\n    \n    private static Tool createCalculateTool() {\n        return Tool.builder()\n            .name(\"calculate\")\n            .description(\"Perform mathematical calculations\")\n            .inputSchema(JsonSchema.object()\n                .property(\"operation\", JsonSchema.string()\n                    .description(\"Operation to perform\")\n                    .enumValues(List.of(\"add\", \"subtract\", \"multiply\", \"divide\"))\n                    .required(true))\n                .property(\"a\", JsonSchema.number()\n                    .description(\"First operand\")\n                    .required(true))\n                .property(\"b\", JsonSchema.number()\n                    .description(\"Second operand\")\n                    .required(true)))\n            .build();\n    }\n}\n```\n\n## ToolHandlers.java Template\n\n```java\npackage com.example.mcp.tools;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.tool.ToolResponse;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\npublic class ToolHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(ToolHandlers.class);\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register tool list handler\n        server.addToolListHandler(() -> {\n            log.debug(\"Listing available tools\");\n            return Mono.just(ToolDefinitions.getTools());\n        });\n        \n        \u002F\u002F Register greet handler\n        server.addToolHandler(\"greet\", ToolHandlers::handleGreet);\n        \n        \u002F\u002F Register calculate handler\n        server.addToolHandler(\"calculate\", ToolHandlers::handleCalculate);\n    }\n    \n    private static Mono\u003CToolResponse> handleGreet(JsonNode arguments) {\n        log.info(\"Greet tool called\");\n        \n        if (!arguments.has(\"name\")) {\n            return Mono.just(ToolResponse.error()\n                .message(\"Missing 'name' parameter\")\n                .build());\n        }\n        \n        String name = arguments.get(\"name\").asText();\n        String greeting = \"Hello, \" + name + \"! Welcome to MCP.\";\n        \n        log.debug(\"Generated greeting for: {}\", name);\n        \n        return Mono.just(ToolResponse.success()\n            .addTextContent(greeting)\n            .build());\n    }\n    \n    private static Mono\u003CToolResponse> handleCalculate(JsonNode arguments) {\n        log.info(\"Calculate tool called\");\n        \n        if (!arguments.has(\"operation\") || !arguments.has(\"a\") || !arguments.has(\"b\")) {\n            return Mono.just(ToolResponse.error()\n                .message(\"Missing required parameters\")\n                .build());\n        }\n        \n        String operation = arguments.get(\"operation\").asText();\n        double a = arguments.get(\"a\").asDouble();\n        double b = arguments.get(\"b\").asDouble();\n        \n        double result;\n        switch (operation) {\n            case \"add\":\n                result = a + b;\n                break;\n            case \"subtract\":\n                result = a - b;\n                break;\n            case \"multiply\":\n                result = a * b;\n                break;\n            case \"divide\":\n                if (b == 0) {\n                    return Mono.just(ToolResponse.error()\n                        .message(\"Division by zero\")\n                        .build());\n                }\n                result = a \u002F b;\n                break;\n            default:\n                return Mono.just(ToolResponse.error()\n                    .message(\"Unknown operation: \" + operation)\n                    .build());\n        }\n        \n        log.debug(\"Calculation: {} {} {} = {}\", a, operation, b, result);\n        \n        return Mono.just(ToolResponse.success()\n            .addTextContent(\"Result: \" + result)\n            .build());\n    }\n}\n```\n\n## ResourceDefinitions.java Template\n\n```java\npackage com.example.mcp.resources;\n\nimport io.mcp.server.resource.Resource;\n\nimport java.util.List;\n\npublic class ResourceDefinitions {\n    \n    public static List\u003CResource> getResources() {\n        return List.of(\n            Resource.builder()\n                .name(\"Example Data\")\n                .uri(\"resource:\u002F\u002Fdata\u002Fexample\")\n                .description(\"Example resource data\")\n                .mimeType(\"application\u002Fjson\")\n                .build(),\n            Resource.builder()\n                .name(\"Configuration\")\n                .uri(\"resource:\u002F\u002Fconfig\")\n                .description(\"Server configuration\")\n                .mimeType(\"application\u002Fjson\")\n                .build()\n        );\n    }\n}\n```\n\n## ResourceHandlers.java Template\n\n```java\npackage com.example.mcp.resources;\n\nimport io.mcp.server.McpServer;\nimport io.mcp.server.resource.ResourceContent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\nimport java.time.Instant;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\npublic class ResourceHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(ResourceHandlers.class);\n    private static final Map\u003CString, Boolean> subscriptions = new ConcurrentHashMap\u003C>();\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register resource list handler\n        server.addResourceListHandler(() -> {\n            log.debug(\"Listing available resources\");\n            return Mono.just(ResourceDefinitions.getResources());\n        });\n        \n        \u002F\u002F Register resource read handler\n        server.addResourceReadHandler(ResourceHandlers::handleRead);\n        \n        \u002F\u002F Register resource subscribe handler\n        server.addResourceSubscribeHandler(ResourceHandlers::handleSubscribe);\n        \n        \u002F\u002F Register resource unsubscribe handler\n        server.addResourceUnsubscribeHandler(ResourceHandlers::handleUnsubscribe);\n    }\n    \n    private static Mono\u003CResourceContent> handleRead(String uri) {\n        log.info(\"Reading resource: {}\", uri);\n        \n        switch (uri) {\n            case \"resource:\u002F\u002Fdata\u002Fexample\":\n                String jsonData = String.format(\n                    \"{\\\"message\\\":\\\"Example resource data\\\",\\\"timestamp\\\":\\\"%s\\\"}\",\n                    Instant.now()\n                );\n                return Mono.just(ResourceContent.text(jsonData, uri, \"application\u002Fjson\"));\n                \n            case \"resource:\u002F\u002Fconfig\":\n                String config = \"{\\\"serverName\\\":\\\"my-mcp-server\\\",\\\"version\\\":\\\"1.0.0\\\"}\";\n                return Mono.just(ResourceContent.text(config, uri, \"application\u002Fjson\"));\n                \n            default:\n                log.warn(\"Unknown resource requested: {}\", uri);\n                return Mono.error(new IllegalArgumentException(\"Unknown resource URI: \" + uri));\n        }\n    }\n    \n    private static Mono\u003CVoid> handleSubscribe(String uri) {\n        log.info(\"Client subscribed to resource: {}\", uri);\n        subscriptions.put(uri, true);\n        return Mono.empty();\n    }\n    \n    private static Mono\u003CVoid> handleUnsubscribe(String uri) {\n        log.info(\"Client unsubscribed from resource: {}\", uri);\n        subscriptions.remove(uri);\n        return Mono.empty();\n    }\n}\n```\n\n## PromptDefinitions.java Template\n\n```java\npackage com.example.mcp.prompts;\n\nimport io.mcp.server.prompt.Prompt;\nimport io.mcp.server.prompt.PromptArgument;\n\nimport java.util.List;\n\npublic class PromptDefinitions {\n    \n    public static List\u003CPrompt> getPrompts() {\n        return List.of(\n            Prompt.builder()\n                .name(\"code-review\")\n                .description(\"Generate a code review prompt\")\n                .argument(PromptArgument.builder()\n                    .name(\"language\")\n                    .description(\"Programming language\")\n                    .required(true)\n                    .build())\n                .argument(PromptArgument.builder()\n                    .name(\"focus\")\n                    .description(\"Review focus area\")\n                    .required(false)\n                    .build())\n                .build()\n        );\n    }\n}\n```\n\n## PromptHandlers.java Template\n\n```java\npackage com.example.mcp.prompts;\n\nimport io.mcp.server.McpServer;\nimport io.mcp.server.prompt.PromptMessage;\nimport io.mcp.server.prompt.PromptResult;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic class PromptHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(PromptHandlers.class);\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register prompt list handler\n        server.addPromptListHandler(() -> {\n            log.debug(\"Listing available prompts\");\n            return Mono.just(PromptDefinitions.getPrompts());\n        });\n        \n        \u002F\u002F Register prompt get handler\n        server.addPromptGetHandler(PromptHandlers::handleCodeReview);\n    }\n    \n    private static Mono\u003CPromptResult> handleCodeReview(String name, Map\u003CString, String> arguments) {\n        log.info(\"Getting prompt: {}\", name);\n        \n        if (!name.equals(\"code-review\")) {\n            return Mono.error(new IllegalArgumentException(\"Unknown prompt: \" + name));\n        }\n        \n        String language = arguments.getOrDefault(\"language\", \"Java\");\n        String focus = arguments.getOrDefault(\"focus\", \"general quality\");\n        \n        String description = \"Code review for \" + language + \" with focus on \" + focus;\n        \n        List\u003CPromptMessage> messages = List.of(\n            PromptMessage.user(\"Please review this \" + language + \" code with focus on \" + focus + \".\"),\n            PromptMessage.assistant(\"I'll review the code focusing on \" + focus + \". Please share the code.\"),\n            PromptMessage.user(\"Here's the code to review: [paste code here]\")\n        );\n        \n        log.debug(\"Generated code review prompt for {} ({})\", language, focus);\n        \n        return Mono.just(PromptResult.builder()\n            .description(description)\n            .messages(messages)\n            .build());\n    }\n}\n```\n\n## McpServerTest.java Template\n\n```java\npackage com.example.mcp;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.McpSyncServer;\nimport io.mcp.server.tool.ToolResponse;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nclass McpServerTest {\n    \n    private McpSyncServer syncServer;\n    private ObjectMapper objectMapper;\n    \n    @BeforeEach\n    void setUp() {\n        McpServer server = createTestServer();\n        syncServer = server.toSyncServer();\n        objectMapper = new ObjectMapper();\n    }\n    \n    private McpServer createTestServer() {\n        \u002F\u002F Same setup as main application\n        McpServer server = McpServerBuilder.builder()\n            .serverInfo(\"test-server\", \"1.0.0\")\n            .capabilities(cap -> cap.tools(true))\n            .build();\n        \n        \u002F\u002F Register handlers\n        ToolHandlers.register(server);\n        \n        return server;\n    }\n    \n    @Test\n    void testGreetTool() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"name\", \"Java\");\n        \n        ToolResponse response = syncServer.callTool(\"greet\", args);\n        \n        assertFalse(response.isError());\n        assertEquals(1, response.getContent().size());\n        assertTrue(response.getContent().get(0).getText().contains(\"Java\"));\n    }\n    \n    @Test\n    void testCalculateTool() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"operation\", \"add\");\n        args.put(\"a\", 5);\n        args.put(\"b\", 3);\n        \n        ToolResponse response = syncServer.callTool(\"calculate\", args);\n        \n        assertFalse(response.isError());\n        assertTrue(response.getContent().get(0).getText().contains(\"8\"));\n    }\n    \n    @Test\n    void testDivideByZero() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"operation\", \"divide\");\n        args.put(\"a\", 10);\n        args.put(\"b\", 0);\n        \n        ToolResponse response = syncServer.callTool(\"calculate\", args);\n        \n        assertTrue(response.isError());\n    }\n}\n```\n\n## README.md Template\n\n```markdown\n# My MCP Server\n\nA Model Context Protocol server built with Java and the official MCP Java SDK.\n\n## Features\n\n- ✅ Tools: greet, calculate\n- ✅ Resources: example data, configuration\n- ✅ Prompts: code-review\n- ✅ Reactive Streams with Project Reactor\n- ✅ Structured logging with SLF4J\n- ✅ Full test coverage\n\n## Requirements\n\n- Java 17 or later\n- Maven 3.6+ or Gradle 7+\n\n## Build\n\n### Maven\n```bash\nmvn clean package\n```\n\n### Gradle\n```bash\n.\u002Fgradlew build\n```\n\n## Run\n\n### Maven\n```bash\njava -jar target\u002Fmy-mcp-server-1.0.0.jar\n```\n\n### Gradle\n```bash\n.\u002Fgradlew run\n```\n\n## Testing\n\n### Maven\n```bash\nmvn test\n```\n\n### Gradle\n```bash\n.\u002Fgradlew test\n```\n\n## Integration with Claude Desktop\n\nAdd to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"my-mcp-server\": {\n      \"command\": \"java\",\n      \"args\": [\"-jar\", \"\u002Fpath\u002Fto\u002Fmy-mcp-server-1.0.0.jar\"]\n    }\n  }\n}\n```\n\n## License\n\nMIT\n```\n\n## Generation Instructions\n\n1. **Ask for project name and package**\n2. **Choose build tool** (Maven or Gradle)\n3. **Generate all files** with proper package structure\n4. **Use Reactive Streams** for async handlers\n5. **Include comprehensive logging** with SLF4J\n6. **Add tests** for all handlers\n7. **Follow Java conventions** (camelCase, PascalCase)\n8. **Include error handling** with proper responses\n9. **Document public APIs** with Javadoc\n10. **Provide both sync and async** examples\n\n","# Java MCP Server Generator\n\nGenerate a complete, production-ready MCP server in Java using the official Java SDK with Maven or Gradle.\n\n## Project Generation\n\nWhen asked to create a Java MCP server, generate a complete project with this structure:\n\n```\nmy-mcp-server\u002F\n├── pom.xml (or build.gradle.kts)\n├── src\u002F\n│   ├── main\u002F\n│   │   ├── java\u002F\n│   │   │   └── com\u002Fexample\u002Fmcp\u002F\n│   │   │       ├── McpServerApplication.java\n│   │   │       ├── config\u002F\n│   │   │       │   └── ServerConfiguration.java\n│   │   │       ├── tools\u002F\n│   │   │       │   ├── ToolDefinitions.java\n│   │   │       │   └── ToolHandlers.java\n│   │   │       ├── resources\u002F\n│   │   │       │   ├── ResourceDefinitions.java\n│   │   │       │   └── ResourceHandlers.java\n│   │   │       └── prompts\u002F\n│   │   │           ├── PromptDefinitions.java\n│   │   │           └── PromptHandlers.java\n│   │   └── resources\u002F\n│   │       └── application.properties (if using Spring)\n│   └── test\u002F\n│       └── java\u002F\n│           └── com\u002Fexample\u002Fmcp\u002F\n│               └── McpServerTest.java\n└── README.md\n```\n\n## Maven pom.xml Template\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\n         http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>com.example\u003C\u002FgroupId>\n    \u003CartifactId>my-mcp-server\u003C\u002FartifactId>\n    \u003Cversion>1.0.0\u003C\u002Fversion>\n    \u003Cpackaging>jar\u003C\u002Fpackaging>\n\n    \u003Cname>My MCP Server\u003C\u002Fname>\n    \u003Cdescription>Model Context Protocol server implementation\u003C\u002Fdescription>\n\n    \u003Cproperties>\n        \u003Cjava.version>17\u003C\u002Fjava.version>\n        \u003Cmaven.compiler.source>17\u003C\u002Fmaven.compiler.source>\n        \u003Cmaven.compiler.target>17\u003C\u002Fmaven.compiler.target>\n        \u003Cproject.build.sourceEncoding>UTF-8\u003C\u002Fproject.build.sourceEncoding>\n        \u003Cmcp.version>0.14.1\u003C\u002Fmcp.version>\n        \u003Cslf4j.version>2.0.9\u003C\u002Fslf4j.version>\n        \u003Clogback.version>1.4.11\u003C\u002Flogback.version>\n        \u003Cjunit.version>5.10.0\u003C\u002Fjunit.version>\n    \u003C\u002Fproperties>\n\n    \u003Cdependencies>\n        \u003C!-- MCP Java SDK -->\n        \u003Cdependency>\n            \u003CgroupId>io.modelcontextprotocol.sdk\u003C\u002FgroupId>\n            \u003CartifactId>mcp\u003C\u002FartifactId>\n            \u003Cversion>${mcp.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n\n        \u003C!-- Logging -->\n        \u003Cdependency>\n            \u003CgroupId>org.slf4j\u003C\u002FgroupId>\n            \u003CartifactId>slf4j-api\u003C\u002FartifactId>\n            \u003Cversion>${slf4j.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>ch.qos.logback\u003C\u002FgroupId>\n            \u003CartifactId>logback-classic\u003C\u002FartifactId>\n            \u003Cversion>${logback.version}\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n\n        \u003C!-- Testing -->\n        \u003Cdependency>\n            \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n            \u003CartifactId>junit-jupiter\u003C\u002FartifactId>\n            \u003Cversion>${junit.version}\u003C\u002Fversion>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>io.projectreactor\u003C\u002FgroupId>\n            \u003CartifactId>reactor-test\u003C\u002FartifactId>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\n    \u003Cbuild>\n        \u003Cplugins>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-compiler-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.11.0\u003C\u002Fversion>\n            \u003C\u002Fplugin>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-surefire-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.1.2\u003C\u002Fversion>\n            \u003C\u002Fplugin>\n            \u003Cplugin>\n                \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n                \u003CartifactId>maven-shade-plugin\u003C\u002FartifactId>\n                \u003Cversion>3.5.0\u003C\u002Fversion>\n                \u003Cexecutions>\n                    \u003Cexecution>\n                        \u003Cphase>package\u003C\u002Fphase>\n                        \u003Cgoals>\n                            \u003Cgoal>shade\u003C\u002Fgoal>\n                        \u003C\u002Fgoals>\n                        \u003Cconfiguration>\n                            \u003Ctransformers>\n                                \u003Ctransformer implementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n                                    \u003CmainClass>com.example.mcp.McpServerApplication\u003C\u002FmainClass>\n                                \u003C\u002Ftransformer>\n                            \u003C\u002Ftransformers>\n                        \u003C\u002Fconfiguration>\n                    \u003C\u002Fexecution>\n                \u003C\u002Fexecutions>\n            \u003C\u002Fplugin>\n        \u003C\u002Fplugins>\n    \u003C\u002Fbuild>\n\u003C\u002Fproject>\n```\n\n## Gradle build.gradle.kts Template\n\n```kotlin\nplugins {\n    id(\"java\")\n    id(\"application\")\n}\n\ngroup = \"com.example\"\nversion = \"1.0.0\"\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_17\n    targetCompatibility = JavaVersion.VERSION_17\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    \u002F\u002F MCP Java SDK\n    implementation(\"io.modelcontextprotocol.sdk:mcp:0.14.1\")\n    \n    \u002F\u002F Logging\n    implementation(\"org.slf4j:slf4j-api:2.0.9\")\n    implementation(\"ch.qos.logback:logback-classic:1.4.11\")\n    \n    \u002F\u002F Testing\n    testImplementation(\"org.junit.jupiter:junit-jupiter:5.10.0\")\n    testImplementation(\"io.projectreactor:reactor-test:3.5.0\")\n}\n\napplication {\n    mainClass.set(\"com.example.mcp.McpServerApplication\")\n}\n\ntasks.test {\n    useJUnitPlatform()\n}\n```\n\n## McpServerApplication.java Template\n\n```java\npackage com.example.mcp;\n\nimport com.example.mcp.tools.ToolHandlers;\nimport com.example.mcp.resources.ResourceHandlers;\nimport com.example.mcp.prompts.PromptHandlers;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.McpServerBuilder;\nimport io.mcp.server.transport.StdioServerTransport;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.Disposable;\n\npublic class McpServerApplication {\n    \n    private static final Logger log = LoggerFactory.getLogger(McpServerApplication.class);\n    \n    public static void main(String[] args) {\n        log.info(\"Starting MCP Server...\");\n        \n        try {\n            McpServer server = createServer();\n            StdioServerTransport transport = new StdioServerTransport();\n            \n            \u002F\u002F Start server\n            Disposable serverDisposable = server.start(transport).subscribe();\n            \n            \u002F\u002F Graceful shutdown\n            Runtime.getRuntime().addShutdownHook(new Thread(() -> {\n                log.info(\"Shutting down MCP server\");\n                serverDisposable.dispose();\n                server.stop().block();\n            }));\n            \n            log.info(\"MCP Server started successfully\");\n            \n            \u002F\u002F Keep running\n            Thread.currentThread().join();\n            \n        } catch (Exception e) {\n            log.error(\"Failed to start MCP server\", e);\n            System.exit(1);\n        }\n    }\n    \n    private static McpServer createServer() {\n        McpServer server = McpServerBuilder.builder()\n            .serverInfo(\"my-mcp-server\", \"1.0.0\")\n            .capabilities(capabilities -> capabilities\n                .tools(true)\n                .resources(true)\n                .prompts(true))\n            .build();\n        \n        \u002F\u002F Register handlers\n        ToolHandlers.register(server);\n        ResourceHandlers.register(server);\n        PromptHandlers.register(server);\n        \n        return server;\n    }\n}\n```\n\n## ToolDefinitions.java Template\n\n```java\npackage com.example.mcp.tools;\n\nimport io.mcp.json.JsonSchema;\nimport io.mcp.server.tool.Tool;\n\nimport java.util.List;\n\npublic class ToolDefinitions {\n    \n    public static List\u003CTool> getTools() {\n        return List.of(\n            createGreetTool(),\n            createCalculateTool()\n        );\n    }\n    \n    private static Tool createGreetTool() {\n        return Tool.builder()\n            .name(\"greet\")\n            .description(\"Generate a greeting message\")\n            .inputSchema(JsonSchema.object()\n                .property(\"name\", JsonSchema.string()\n                    .description(\"Name to greet\")\n                    .required(true)))\n            .build();\n    }\n    \n    private static Tool createCalculateTool() {\n        return Tool.builder()\n            .name(\"calculate\")\n            .description(\"Perform mathematical calculations\")\n            .inputSchema(JsonSchema.object()\n                .property(\"operation\", JsonSchema.string()\n                    .description(\"Operation to perform\")\n                    .enumValues(List.of(\"add\", \"subtract\", \"multiply\", \"divide\"))\n                    .required(true))\n                .property(\"a\", JsonSchema.number()\n                    .description(\"First operand\")\n                    .required(true))\n                .property(\"b\", JsonSchema.number()\n                    .description(\"Second operand\")\n                    .required(true)))\n            .build();\n    }\n}\n```\n\n## ToolHandlers.java Template\n\n```java\npackage com.example.mcp.tools;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.tool.ToolResponse;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\npublic class ToolHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(ToolHandlers.class);\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register tool list handler\n        server.addToolListHandler(() -> {\n            log.debug(\"Listing available tools\");\n            return Mono.just(ToolDefinitions.getTools());\n        });\n        \n        \u002F\u002F Register greet handler\n        server.addToolHandler(\"greet\", ToolHandlers::handleGreet);\n        \n        \u002F\u002F Register calculate handler\n        server.addToolHandler(\"calculate\", ToolHandlers::handleCalculate);\n    }\n    \n    private static Mono\u003CToolResponse> handleGreet(JsonNode arguments) {\n        log.info(\"Greet tool called\");\n        \n        if (!arguments.has(\"name\")) {\n            return Mono.just(ToolResponse.error()\n                .message(\"Missing 'name' parameter\")\n                .build());\n        }\n        \n        String name = arguments.get(\"name\").asText();\n        String greeting = \"Hello, \" + name + \"! Welcome to MCP.\";\n        \n        log.debug(\"Generated greeting for: {}\", name);\n        \n        return Mono.just(ToolResponse.success()\n            .addTextContent(greeting)\n            .build());\n    }\n    \n    private static Mono\u003CToolResponse> handleCalculate(JsonNode arguments) {\n        log.info(\"Calculate tool called\");\n        \n        if (!arguments.has(\"operation\") || !arguments.has(\"a\") || !arguments.has(\"b\")) {\n            return Mono.just(ToolResponse.error()\n                .message(\"Missing required parameters\")\n                .build());\n        }\n        \n        String operation = arguments.get(\"operation\").asText();\n        double a = arguments.get(\"a\").asDouble();\n        double b = arguments.get(\"b\").asDouble();\n        \n        double result;\n        switch (operation) {\n            case \"add\":\n                result = a + b;\n                break;\n            case \"subtract\":\n                result = a - b;\n                break;\n            case \"multiply\":\n                result = a * b;\n                break;\n            case \"divide\":\n                if (b == 0) {\n                    return Mono.just(ToolResponse.error()\n                        .message(\"Division by zero\")\n                        .build());\n                }\n                result = a \u002F b;\n                break;\n            default:\n                return Mono.just(ToolResponse.error()\n                    .message(\"Unknown operation: \" + operation)\n                    .build());\n        }\n        \n        log.debug(\"Calculation: {} {} {} = {}\", a, operation, b, result);\n        \n        return Mono.just(ToolResponse.success()\n            .addTextContent(\"Result: \" + result)\n            .build());\n    }\n}\n```\n\n## ResourceDefinitions.java Template\n\n```java\npackage com.example.mcp.resources;\n\nimport io.mcp.server.resource.Resource;\n\nimport java.util.List;\n\npublic class ResourceDefinitions {\n    \n    public static List\u003CResource> getResources() {\n        return List.of(\n            Resource.builder()\n                .name(\"Example Data\")\n                .uri(\"resource:\u002F\u002Fdata\u002Fexample\")\n                .description(\"Example resource data\")\n                .mimeType(\"application\u002Fjson\")\n                .build(),\n            Resource.builder()\n                .name(\"Configuration\")\n                .uri(\"resource:\u002F\u002Fconfig\")\n                .description(\"Server configuration\")\n                .mimeType(\"application\u002Fjson\")\n                .build()\n        );\n    }\n}\n```\n\n## ResourceHandlers.java Template\n\n```java\npackage com.example.mcp.resources;\n\nimport io.mcp.server.McpServer;\nimport io.mcp.server.resource.ResourceContent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\nimport java.time.Instant;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\npublic class ResourceHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(ResourceHandlers.class);\n    private static final Map\u003CString, Boolean> subscriptions = new ConcurrentHashMap\u003C>();\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register resource list handler\n        server.addResourceListHandler(() -> {\n            log.debug(\"Listing available resources\");\n            return Mono.just(ResourceDefinitions.getResources());\n        });\n        \n        \u002F\u002F Register resource read handler\n        server.addResourceReadHandler(ResourceHandlers::handleRead);\n        \n        \u002F\u002F Register resource subscribe handler\n        server.addResourceSubscribeHandler(ResourceHandlers::handleSubscribe);\n        \n        \u002F\u002F Register resource unsubscribe handler\n        server.addResourceUnsubscribeHandler(ResourceHandlers::handleUnsubscribe);\n    }\n    \n    private static Mono\u003CResourceContent> handleRead(String uri) {\n        log.info(\"Reading resource: {}\", uri);\n        \n        switch (uri) {\n            case \"resource:\u002F\u002Fdata\u002Fexample\":\n                String jsonData = String.format(\n                    \"{\\\"message\\\":\\\"Example resource data\\\",\\\"timestamp\\\":\\\"%s\\\"}\",\n                    Instant.now()\n                );\n                return Mono.just(ResourceContent.text(jsonData, uri, \"application\u002Fjson\"));\n                \n            case \"resource:\u002F\u002Fconfig\":\n                String config = \"{\\\"serverName\\\":\\\"my-mcp-server\\\",\\\"version\\\":\\\"1.0.0\\\"}\";\n                return Mono.just(ResourceContent.text(config, uri, \"application\u002Fjson\"));\n                \n            default:\n                log.warn(\"Unknown resource requested: {}\", uri);\n                return Mono.error(new IllegalArgumentException(\"Unknown resource URI: \" + uri));\n        }\n    }\n    \n    private static Mono\u003CVoid> handleSubscribe(String uri) {\n        log.info(\"Client subscribed to resource: {}\", uri);\n        subscriptions.put(uri, true);\n        return Mono.empty();\n    }\n    \n    private static Mono\u003CVoid> handleUnsubscribe(String uri) {\n        log.info(\"Client unsubscribed from resource: {}\", uri);\n        subscriptions.remove(uri);\n        return Mono.empty();\n    }\n}\n```\n\n## PromptDefinitions.java Template\n\n```java\npackage com.example.mcp.prompts;\n\nimport io.mcp.server.prompt.Prompt;\nimport io.mcp.server.prompt.PromptArgument;\n\nimport java.util.List;\n\npublic class PromptDefinitions {\n    \n    public static List\u003CPrompt> getPrompts() {\n        return List.of(\n            Prompt.builder()\n                .name(\"code-review\")\n                .description(\"Generate a code review prompt\")\n                .argument(PromptArgument.builder()\n                    .name(\"language\")\n                    .description(\"Programming language\")\n                    .required(true)\n                    .build())\n                .argument(PromptArgument.builder()\n                    .name(\"focus\")\n                    .description(\"Review focus area\")\n                    .required(false)\n                    .build())\n                .build()\n        );\n    }\n}\n```\n\n## PromptHandlers.java Template\n\n```java\npackage com.example.mcp.prompts;\n\nimport io.mcp.server.McpServer;\nimport io.mcp.server.prompt.PromptMessage;\nimport io.mcp.server.prompt.PromptResult;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport reactor.core.publisher.Mono;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic class PromptHandlers {\n    \n    private static final Logger log = LoggerFactory.getLogger(PromptHandlers.class);\n    \n    public static void register(McpServer server) {\n        \u002F\u002F Register prompt list handler\n        server.addPromptListHandler(() -> {\n            log.debug(\"Listing available prompts\");\n            return Mono.just(PromptDefinitions.getPrompts());\n        });\n        \n        \u002F\u002F Register prompt get handler\n        server.addPromptGetHandler(PromptHandlers::handleCodeReview);\n    }\n    \n    private static Mono\u003CPromptResult> handleCodeReview(String name, Map\u003CString, String> arguments) {\n        log.info(\"Getting prompt: {}\", name);\n        \n        if (!name.equals(\"code-review\")) {\n            return Mono.error(new IllegalArgumentException(\"Unknown prompt: \" + name));\n        }\n        \n        String language = arguments.getOrDefault(\"language\", \"Java\");\n        String focus = arguments.getOrDefault(\"focus\", \"general quality\");\n        \n        String description = \"Code review for \" + language + \" with focus on \" + focus;\n        \n        List\u003CPromptMessage> messages = List.of(\n            PromptMessage.user(\"Please review this \" + language + \" code with focus on \" + focus + \".\"),\n            PromptMessage.assistant(\"I'll review the code focusing on \" + focus + \". Please share the code.\"),\n            PromptMessage.user(\"Here's the code to review: [paste code here]\")\n        );\n        \n        log.debug(\"Generated code review prompt for {} ({})\", language, focus);\n        \n        return Mono.just(PromptResult.builder()\n            .description(description)\n            .messages(messages)\n            .build());\n    }\n}\n```\n\n## McpServerTest.java Template\n\n```java\npackage com.example.mcp;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport io.mcp.server.McpServer;\nimport io.mcp.server.McpSyncServer;\nimport io.mcp.server.tool.ToolResponse;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nclass McpServerTest {\n    \n    private McpSyncServer syncServer;\n    private ObjectMapper objectMapper;\n    \n    @BeforeEach\n    void setUp() {\n        McpServer server = createTestServer();\n        syncServer = server.toSyncServer();\n        objectMapper = new ObjectMapper();\n    }\n    \n    private McpServer createTestServer() {\n        \u002F\u002F Same setup as main application\n        McpServer server = McpServerBuilder.builder()\n            .serverInfo(\"test-server\", \"1.0.0\")\n            .capabilities(cap -> cap.tools(true))\n            .build();\n        \n        \u002F\u002F Register handlers\n        ToolHandlers.register(server);\n        \n        return server;\n    }\n    \n    @Test\n    void testGreetTool() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"name\", \"Java\");\n        \n        ToolResponse response = syncServer.callTool(\"greet\", args);\n        \n        assertFalse(response.isError());\n        assertEquals(1, response.getContent().size());\n        assertTrue(response.getContent().get(0).getText().contains(\"Java\"));\n    }\n    \n    @Test\n    void testCalculateTool() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"operation\", \"add\");\n        args.put(\"a\", 5);\n        args.put(\"b\", 3);\n        \n        ToolResponse response = syncServer.callTool(\"calculate\", args);\n        \n        assertFalse(response.isError());\n        assertTrue(response.getContent().get(0).getText().contains(\"8\"));\n    }\n    \n    @Test\n    void testDivideByZero() {\n        ObjectNode args = objectMapper.createObjectNode();\n        args.put(\"operation\", \"divide\");\n        args.put(\"a\", 10);\n        args.put(\"b\", 0);\n        \n        ToolResponse response = syncServer.callTool(\"calculate\", args);\n        \n        assertTrue(response.isError());\n    }\n}\n```\n\n## README.md Template\n\n```markdown\n# My MCP Server\n\nA Model Context Protocol server built with Java and the official MCP Java SDK.\n\n## Features\n\n- ✅ Tools: greet, calculate\n- ✅ Resources: example data, configuration\n- ✅ Prompts: code-review\n- ✅ Reactive Streams with Project Reactor\n- ✅ Structured logging with SLF4J\n- ✅ Full test coverage\n\n## Requirements\n\n- Java 17 or later\n- Maven 3.6+ or Gradle 7+\n\n## Build\n\n### Maven\n```bash\nmvn clean package\n```\n\n### Gradle\n```bash\n.\u002Fgradlew build\n```\n\n## Run\n\n### Maven\n```bash\njava -jar target\u002Fmy-mcp-server-1.0.0.jar\n```\n\n### Gradle\n```bash\n.\u002Fgradlew run\n```\n\n## Testing\n\n### Maven\n```bash\nmvn test\n```\n\n### Gradle\n```bash\n.\u002Fgradlew test\n```\n\n## Integration with Claude Desktop\n\nAdd to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"my-mcp-server\": {\n      \"command\": \"java\",\n      \"args\": [\"-jar\", \"\u002Fpath\u002Fto\u002Fmy-mcp-server-1.0.0.jar\"]\n    }\n  }\n}\n```\n\n## License\n\nMIT\n```\n\n## Generation Instructions\n\n1. **Ask for project name and package**\n2. **Choose build tool** (Maven or Gradle)\n3. **Generate all files** with proper package structure\n4. **Use Reactive Streams** for async handlers\n5. **Include comprehensive logging** with SLF4J\n6. **Add tests** for all handlers\n7. **Follow Java conventions** (camelCase, PascalCase)\n8. **Include error handling** with proper responses\n9. **Document public APIs** with Javadoc\n10. **Provide both sync and async** examples\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fgithub\u002Fawesome-copilot\u002Fjava-mcp-server-generator",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill java-mcp-server-generator",{"tool":67,"command":68},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill java-mcp-server-generator",{"tool":70,"command":71},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill java-mcp-server-generator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fgithub\u002Fawesome-copilot\u002Fjava-mcp-server-generator\u002FSKILL.md",true,[],[76,85,94,102,108,115],{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":82,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[81],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[39,83,84],"model hierarchy","model hierarchy skill",{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[90],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[30,92,93],"zoom","zoom mcp",{"skillNo":95,"name":96,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[46,100,101,92],"zoom apps sdk","apps",{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[104],{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":114,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[113],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[110],{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[117]]