{"kind":"Skill","metadata":{"namespace":"community","name":"java-mcp-server-generator","version":"0.1.0"},"spec":{"description":"Generate a complete Model Context Protocol server project in Java using the official MCP Java SDK with reactive streams and optional Spring Boot integration.","files":{"SKILL.md":"---\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/\n├── pom.xml (or build.gradle.kts)\n├── src/\n│   ├── main/\n│   │   ├── java/\n│   │   │   └── com/example/mcp/\n│   │   │       ├── McpServerApplication.java\n│   │   │       ├── config/\n│   │   │       │   └── ServerConfiguration.java\n│   │   │       ├── tools/\n│   │   │       │   ├── ToolDefinitions.java\n│   │   │       │   └── ToolHandlers.java\n│   │   │       ├── resources/\n│   │   │       │   ├── ResourceDefinitions.java\n│   │   │       │   └── ResourceHandlers.java\n│   │   │       └── prompts/\n│   │   │           ├── PromptDefinitions.java\n│   │   │           └── PromptHandlers.java\n│   │   └── resources/\n│   │       └── application.properties (if using Spring)\n│   └── test/\n│       └── java/\n│           └── com/example/mcp/\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\"?\u003e\n\u003cproject xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n         http://maven.apache.org/xsd/maven-4.0.0.xsd\"\u003e\n    \u003cmodelVersion\u003e4.0.0\u003c/modelVersion\u003e\n\n    \u003cgroupId\u003ecom.example\u003c/groupId\u003e\n    \u003cartifactId\u003emy-mcp-server\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.0\u003c/version\u003e\n    \u003cpackaging\u003ejar\u003c/packaging\u003e\n\n    \u003cname\u003eMy MCP Server\u003c/name\u003e\n    \u003cdescription\u003eModel Context Protocol server implementation\u003c/description\u003e\n\n    \u003cproperties\u003e\n        \u003cjava.version\u003e17\u003c/java.version\u003e\n        \u003cmaven.compiler.source\u003e17\u003c/maven.compiler.source\u003e\n        \u003cmaven.compiler.target\u003e17\u003c/maven.compiler.target\u003e\n        \u003cproject.build.sourceEncoding\u003eUTF-8\u003c/project.build.sourceEncoding\u003e\n        \u003cmcp.version\u003e0.14.1\u003c/mcp.version\u003e\n        \u003cslf4j.version\u003e2.0.9\u003c/slf4j.version\u003e\n        \u003clogback.version\u003e1.4.11\u003c/logback.version\u003e\n        \u003cjunit.version\u003e5.10.0\u003c/junit.version\u003e\n    \u003c/properties\u003e\n\n    \u003cdependencies\u003e\n        \u003c!-- MCP Java SDK --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eio.modelcontextprotocol.sdk\u003c/groupId\u003e\n            \u003cartifactId\u003emcp\u003c/artifactId\u003e\n            \u003cversion\u003e${mcp.version}\u003c/version\u003e\n        \u003c/dependency\u003e\n\n        \u003c!-- Logging --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.slf4j\u003c/groupId\u003e\n            \u003cartifactId\u003eslf4j-api\u003c/artifactId\u003e\n            \u003cversion\u003e${slf4j.version}\u003c/version\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ech.qos.logback\u003c/groupId\u003e\n            \u003cartifactId\u003elogback-classic\u003c/artifactId\u003e\n            \u003cversion\u003e${logback.version}\u003c/version\u003e\n        \u003c/dependency\u003e\n\n        \u003c!-- Testing --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.junit.jupiter\u003c/groupId\u003e\n            \u003cartifactId\u003ejunit-jupiter\u003c/artifactId\u003e\n            \u003cversion\u003e${junit.version}\u003c/version\u003e\n            \u003cscope\u003etest\u003c/scope\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eio.projectreactor\u003c/groupId\u003e\n            \u003cartifactId\u003ereactor-test\u003c/artifactId\u003e\n            \u003cscope\u003etest\u003c/scope\u003e\n        \u003c/dependency\u003e\n    \u003c/dependencies\u003e\n\n    \u003cbuild\u003e\n        \u003cplugins\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n                \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e3.11.0\u003c/version\u003e\n            \u003c/plugin\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n                \u003cartifactId\u003emaven-surefire-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e3.1.2\u003c/version\u003e\n            \u003c/plugin\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n                \u003cartifactId\u003emaven-shade-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e3.5.0\u003c/version\u003e\n                \u003cexecutions\u003e\n                    \u003cexecution\u003e\n                        \u003cphase\u003epackage\u003c/phase\u003e\n                        \u003cgoals\u003e\n                            \u003cgoal\u003eshade\u003c/goal\u003e\n                        \u003c/goals\u003e\n                        \u003cconfiguration\u003e\n                            \u003ctransformers\u003e\n                                \u003ctransformer implementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\"\u003e\n                                    \u003cmainClass\u003ecom.example.mcp.McpServerApplication\u003c/mainClass\u003e\n                                \u003c/transformer\u003e\n                            \u003c/transformers\u003e\n                        \u003c/configuration\u003e\n                    \u003c/execution\u003e\n                \u003c/executions\u003e\n            \u003c/plugin\u003e\n        \u003c/plugins\u003e\n    \u003c/build\u003e\n\u003c/project\u003e\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    // MCP Java SDK\n    implementation(\"io.modelcontextprotocol.sdk:mcp:0.14.1\")\n    \n    // Logging\n    implementation(\"org.slf4j:slf4j-api:2.0.9\")\n    implementation(\"ch.qos.logback:logback-classic:1.4.11\")\n    \n    // 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            // Start server\n            Disposable serverDisposable = server.start(transport).subscribe();\n            \n            // Graceful shutdown\n            Runtime.getRuntime().addShutdownHook(new Thread(() -\u003e {\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            // 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 -\u003e capabilities\n                .tools(true)\n                .resources(true)\n                .prompts(true))\n            .build();\n        \n        // 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\u003e 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        // Register tool list handler\n        server.addToolListHandler(() -\u003e {\n            log.debug(\"Listing available tools\");\n            return Mono.just(ToolDefinitions.getTools());\n        });\n        \n        // Register greet handler\n        server.addToolHandler(\"greet\", ToolHandlers::handleGreet);\n        \n        // Register calculate handler\n        server.addToolHandler(\"calculate\", ToolHandlers::handleCalculate);\n    }\n    \n    private static Mono\u003cToolResponse\u003e 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\u003e 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 / 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\u003e getResources() {\n        return List.of(\n            Resource.builder()\n                .name(\"Example Data\")\n                .uri(\"resource://data/example\")\n                .description(\"Example resource data\")\n                .mimeType(\"application/json\")\n                .build(),\n            Resource.builder()\n                .name(\"Configuration\")\n                .uri(\"resource://config\")\n                .description(\"Server configuration\")\n                .mimeType(\"application/json\")\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\u003e subscriptions = new ConcurrentHashMap\u003c\u003e();\n    \n    public static void register(McpServer server) {\n        // Register resource list handler\n        server.addResourceListHandler(() -\u003e {\n            log.debug(\"Listing available resources\");\n            return Mono.just(ResourceDefinitions.getResources());\n        });\n        \n        // Register resource read handler\n        server.addResourceReadHandler(ResourceHandlers::handleRead);\n        \n        // Register resource subscribe handler\n        server.addResourceSubscribeHandler(ResourceHandlers::handleSubscribe);\n        \n        // Register resource unsubscribe handler\n        server.addResourceUnsubscribeHandler(ResourceHandlers::handleUnsubscribe);\n    }\n    \n    private static Mono\u003cResourceContent\u003e handleRead(String uri) {\n        log.info(\"Reading resource: {}\", uri);\n        \n        switch (uri) {\n            case \"resource://data/example\":\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/json\"));\n                \n            case \"resource://config\":\n                String config = \"{\\\"serverName\\\":\\\"my-mcp-server\\\",\\\"version\\\":\\\"1.0.0\\\"}\";\n                return Mono.just(ResourceContent.text(config, uri, \"application/json\"));\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\u003e 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\u003e 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\u003e 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        // Register prompt list handler\n        server.addPromptListHandler(() -\u003e {\n            log.debug(\"Listing available prompts\");\n            return Mono.just(PromptDefinitions.getPrompts());\n        });\n        \n        // Register prompt get handler\n        server.addPromptGetHandler(PromptHandlers::handleCodeReview);\n    }\n    \n    private static Mono\u003cPromptResult\u003e handleCodeReview(String name, Map\u003cString, String\u003e 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\u003e 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        // Same setup as main application\n        McpServer server = McpServerBuilder.builder()\n            .serverInfo(\"test-server\", \"1.0.0\")\n            .capabilities(cap -\u003e cap.tools(true))\n            .build();\n        \n        // 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./gradlew build\n```\n\n## Run\n\n### Maven\n```bash\njava -jar target/my-mcp-server-1.0.0.jar\n```\n\n### Gradle\n```bash\n./gradlew run\n```\n\n## Testing\n\n### Maven\n```bash\nmvn test\n```\n\n### Gradle\n```bash\n./gradlew 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\", \"/path/to/my-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"},"import":{"commit_sha":"541b7819d8c3545c6df122491af4fa1eae415779","imported_at":"2026-05-18T20:05:35Z","license_text":"MIT License\n\nCopyright GitHub, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","owner":"github","repo":"github/awesome-copilot","source_url":"https://github.com/github/awesome-copilot/tree/541b7819d8c3545c6df122491af4fa1eae415779/plugins/java-mcp-development/skills/java-mcp-server-generator"}},"content_hash":[240,22,173,254,196,249,210,13,117,233,78,155,62,184,28,194,95,186,129,219,239,189,54,131,181,242,221,54,124,207,12,2],"trust_level":"unsigned","yanked":false}
