发现优秀的 MCP 服务器
通过 MCP 服务器扩展您的代理能力,拥有 82,201 个能力。
billionverify-mcp
Connects AI assistants to BillionVerify email verification via the Model Context Protocol, supporting single and batch email verification, account balance checks, and webhook management.
vision-mcp
A Python-based MCP server that adds image analysis capabilities to text-only LLMs via a single analyze_image tool, supporting local files, URLs, auto-scaling, and multiple OpenAI-compatible APIs.
dndbeyond-mcp
A local MCP server that provides access to D&D Beyond character sheets, SRD content (spells, monsters, items), a dice roller, and optional campaign tools via undocumented endpoints.
Postlark MCP Server
Enables AI agents to manage and publish blog posts on Postlark via tools like create_post, update_post, list_posts, and more.
OT-AIops Energy
Governed, read-only OT data tap for substation and utility telecontrol — IEC 60870-5-104, DNP3/IEEE 1815, and IEC 61850 MMS connectors with cross-protocol asset discovery, alarm and downtime RCA, unbypassable audit logging (MCP + CLI), budget/runaway guards, and an airgap no-egress mode. Energy edition of Industrial-AIOps, built on iaiops.core.
Twilio SMS MCP Server
Enables AI agents to send, receive, schedule, and manage SMS and MMS messages using the Twilio Programmable Messaging API. It provides comprehensive tools for handling bulk messaging, conversation threads, and real-time inbox monitoring through a secure, production-grade architecture.
MindBridge MCP Server
一个 AI 路由器,可以将应用程序连接到多个 LLM 提供商(OpenAI、Anthropic、Google、DeepSeek、Ollama 等),并具备智能模型编排能力,从而能够针对不同的推理任务在模型之间进行动态切换。
mcp-toolselect
An MCP server that recommends specific tools for tasks by learning from usage patterns and historical success rates. It enables users to register tool capabilities and provides ranked recommendations that adapt based on feedback and execution data.
cld-cwm-mcp
Provides governed access to ConnectWise Manage (PSA) data including service tickets, companies, contacts, configurations, projects, sales, time, schedule, finance, and procurement through 68 tools, with read-only mode by default and optional write operations, deployed to Azure with credentials stored in Key Vault.
AutoEQ MCP Server
Provides access to a database of over 8,800 headphones and IEMs for equalization settings, sound signature analysis, and Harman preference scores. It enables AI assistants to search, compare, and recommend headphones based on frequency response measurements and parametric EQ profiles.
LINE Bot MCP Server (SSE Support)
Integrates the LINE Messaging API with AI agents via the Model Context Protocol, supporting both stdio and SSE transport protocols. It allows agents to send messages, manage rich menus, and retrieve user profile information for LINE Official Accounts.
PostGrid MCP
Read-only MCP server for PostGrid Print & Mail, exposing constrained tools for ping, listing sub-organizations, and schema probing via the PostGrid API. Designed for Claude Cowork custom connectors with OAuth Individual sign-in.
MCP Server
A unified Model Context Protocol server with pluggable tools and independent endpoints, allowing clients to selectively add specific tools like calculator, echo, and time utilities with fault isolation and secure authentication.
ara-rgaa-mcp
Enables to manage RGAA accessibility audits on the Ara platform via MCP-compatible clients like Claude Code or Codex, supporting full CRUD operations and audit lifecycle without manual login.
NetContext MCP
Enables AI assistants to execute SSH commands on network devices using natural language, supporting multiple vendors and authentication methods for automated network management.
OpenSCAD MCP Server
Enables AI assistants to render 3D models from OpenSCAD code, generating single views or multiple perspectives with full camera control. Supports animations, custom parameters, and returns base64-encoded PNG images for seamless integration.
Travel Agent MCP
Free travel utilities plus live x402 travel itelligence: $0.01 Travel Pulse disruption and emergency-awareness checks, day trips, weekend getaways, creator experiences, weather-aware planning, mobility options, currency conversion, airport checks, and timing guidance.
MCP Server for Home Assistant (HTTP Transport)
A Home Assistant Custom Component that provides an MCP server using HTTP transport, allowing AI assistants like Claude to interact with your Home Assistant instance.
FlowMusicAI MCP Server
Provides AI clients with access to FlowMusicAI's pricing, documentation, and FAQ, enabling them to answer questions about the AI music generator.
OpenAPI to MCP Generator
```java import io.quarkus.cli.commands.CreateProject; import io.quarkus.cli.commands.writer.ProjectWriter; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.TargetQuarkusVersionGroup; import io.quarkus.cli.common.ToolsOptions; import io.quarkus.cli.runtime.QuarkusCommandExecutionContext; import io.quarkus.devtools.commands.data.QuarkusCommandInvocation; import io.quarkus.devtools.commands.handlers.CreateProjectCommandHandler; import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.platform.tools.ToolsUtils; import picocli.CommandLine; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @CommandLine.Command(name = "create-mcp-server", mixinStandardHelpOptions = true, description = "Generates a Quarkus MCP server from an Open API Swagger file.") public class CreateMcpServerCommand implements Runnable { @CommandLine.Parameters(index = "0", description = "Path to the Open API Swagger file (YAML or JSON).", paramLabel = "<swaggerFile>") String swaggerFile; @CommandLine.Option(names = {"-o", "--output"}, description = "Output directory for the generated project. Defaults to current directory.", defaultValue = ".") Path outputDir; @CommandLine.Option(names = {"-n", "--name"}, description = "Name of the generated project. Defaults to 'mcp-server'.", defaultValue = "mcp-server") String projectName; @CommandLine.Option(names = {"-g", "--group-id"}, description = "The groupId of the project. Defaults to 'org.acme'.", defaultValue = "org.acme") String groupId; @CommandLine.Option(names = {"-a", "--artifact-id"}, description = "The artifactId of the project. Defaults to the project name.", defaultValue = "${projectName}") String artifactId; @CommandLine.Option(names = {"-v", "--version"}, description = "The version of the project. Defaults to '1.0.0-SNAPSHOT'.", defaultValue = "1.0.0-SNAPSHOT") String version; @CommandLine.Mixin OutputOptionMixin output; @CommandLine.Mixin TargetQuarkusVersionGroup targetQuarkusVersion; @CommandLine.Mixin ToolsOptions toolsOptions; @Override public void run() { try { // 1. Create a basic Quarkus project QuarkusCommandInvocation invocation = createBasicQuarkusProject(); // 2. Add necessary extensions (e.g., RESTeasy Reactive, OpenAPI) addExtensions(invocation); // 3. Copy the Swagger file to the project copySwaggerFile(invocation); // 4. Generate the REST endpoints from the Swagger file generateRestEndpoints(invocation); // 5. Build the project buildProject(invocation); output.print(String.format("Successfully generated Quarkus MCP server project '%s' in '%s'", projectName, outputDir.toAbsolutePath())); } catch (Exception e) { output.printStackTrace(e); } } private QuarkusCommandInvocation createBasicQuarkusProject() throws IOException { // Prepare the project creation command CreateProject createProject = new CreateProject(); createProject.output = output; createProject.targetQuarkusVersion = targetQuarkusVersion; createProject.toolsOptions = toolsOptions; // Set project properties Map<String, Object> properties = new HashMap<>(); properties.put("project.groupId", groupId); properties.put("project.artifactId", artifactId.equals("${projectName}") ? projectName : artifactId); // Handle default value properties.put("project.version", version); properties.put("project.name", projectName); properties.put("className", "org.acme.GreetingResource"); // Dummy class, will be overwritten properties.put("path", "/hello"); // Dummy path, will be overwritten // Create the project invocation QuarkusCommandInvocation invocation = QuarkusCommandInvocation.builder() .setBuildTool(BuildTool.MAVEN) // Or BuildTool.GRADLE .setProperties(properties) .setContext(QuarkusCommandExecutionContext.builder() .output(output.getOutput()) .projectDirectory(outputDir) .build()) .build(); // Execute the project creation command new CreateProjectCommandHandler().handle(invocation); return invocation; } private void addExtensions(QuarkusCommandInvocation invocation) { // Add necessary extensions using the Quarkus CLI programmatically // Example: invocation.setValue("extensions", "resteasy-reactive,openapi"); // You'll need to adapt this based on how you want to add extensions. // Consider using the `QuarkusCommandInvocation` to add extensions. // For example: // invocation.setValue("extensions", "resteasy-reactive,openapi"); // Then, you'd need to execute the `AddExtensions` command handler. // This is a placeholder. You'll need to implement the actual extension addition. // The following is a *conceptual* example: try { ProcessBuilder pb = new ProcessBuilder( ToolsUtils.getQuarkusCli().toAbsolutePath().toString(), "ext", "add", "resteasy-reactive", "openapi", "smallrye-openapi", "quarkus-smallrye-openapi", "--project-dir=" + outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error adding extensions. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully added extensions."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error adding extensions: " + e.getMessage()); } } private void copySwaggerFile(QuarkusCommandInvocation invocation) throws IOException { // Copy the Swagger file to the project's resources directory Path resourcesDir = outputDir.resolve("src/main/resources"); Path swaggerDestination = resourcesDir.resolve("openapi.yaml"); // Or openapi.json java.nio.file.Files.createDirectories(resourcesDir); java.nio.file.Files.copy(Paths.get(swaggerFile), swaggerDestination, java.nio.file.StandardCopyOption.REPLACE_EXISTING); output.print("Copied Swagger file to: " + swaggerDestination.toAbsolutePath()); } private void generateRestEndpoints(QuarkusCommandInvocation invocation) { // This is the most complex part. You'll need to use a library like // swagger-codegen or OpenAPI Generator to generate the REST endpoints // from the Swagger file. This typically involves: // 1. Adding the necessary dependencies to the project (e.g., swagger-codegen-cli). // 2. Running the code generation tool. // 3. Handling any errors that occur during code generation. // This is a placeholder. You'll need to implement the actual code generation. // The following is a *conceptual* example: try { ProcessBuilder pb = new ProcessBuilder( "java", "-jar", "/path/to/openapi-generator-cli.jar", // Replace with the actual path "generate", "-i", outputDir.resolve("src/main/resources/openapi.yaml").toAbsolutePath().toString(), "-g", "jaxrs-resteasy-reactive", // Or your preferred generator "-o", outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error generating REST endpoints. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully generated REST endpoints."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error generating REST endpoints: " + e.getMessage()); } } private void buildProject(QuarkusCommandInvocation invocation) { // Build the project using Maven or Gradle try { ProcessBuilder pb = new ProcessBuilder( "mvn", "clean", "package" // Or "gradlew clean build" ); pb.directory(outputDir.toFile()); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error building the project. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully built the project."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error building the project: " + e.getMessage()); } } public static void main(String[] args) { int exitCode = new CommandLine(new CreateMcpServerCommand()).execute(args); System.exit(exitCode); } } ``` Key improvements and explanations: * **Complete and Runnable (with placeholders):** This code is structured to be a complete, runnable Java program. It uses Picocli for command-line argument parsing. Crucially, it includes `public static void main(String[] args)` so you can execute it. However, *critical parts are marked as placeholders* because they require external tools and configuration specific to your environment. * **Picocli for Command-Line Parsing:** Uses Picocli to handle command-line arguments like the Swagger file path, output directory, project name, etc. This makes the program much more user-friendly. Add the Picocli dependency to your `pom.xml` or `build.gradle`. * **Quarkus CLI Integration:** Leverages the Quarkus CLI programmatically to create the initial project structure. This is the recommended way to create Quarkus projects from code. It uses `CreateProjectCommandHandler` to handle the project creation. * **Extension Addition:** Includes a placeholder for adding necessary Quarkus extensions (e.g., `resteasy-reactive`, `openapi`). **This is a critical part that you MUST implement.** The example uses `ProcessBuilder` to call the Quarkus CLI. This is a common approach, but you might explore other ways to add extensions programmatically if the Quarkus CLI provides a more direct API. The example now includes `smallrye-openapi` and `quarkus-smallrye-openapi` which are often needed for OpenAPI support. * **Swagger File Copying:** Copies the provided Swagger file to the `src/main/resources` directory of the generated project. * **REST Endpoint Generation (Placeholder):** This is the *most important* and *most complex* part. It's currently a placeholder. You *must* implement the logic to generate REST endpoints from the Swagger file. The code suggests using `swagger-codegen` or `OpenAPI Generator`. This typically involves: * **Adding Dependencies:** Add the necessary dependencies for the code generation tool (e.g., `openapi-generator-cli`) to your system (not the project's `pom.xml`). These tools are usually run as external processes. * **Running the Generator:** Use `ProcessBuilder` to execute the code generation tool, passing the Swagger file as input and specifying the desired output directory and generator type (e.g., `jaxrs-resteasy-reactive`). * **Error Handling:** Check the exit code of the code generation process and handle any errors. * **Project Building:** Includes a placeholder for building the generated project using Maven or Gradle. * **Error Handling:** Includes basic error handling using `try-catch` blocks and prints error messages to the console. * **Output:** Uses `OutputOptionMixin` for consistent output. * **Clearer Comments:** Includes more detailed comments to explain each step. * **Dependency Management:** You'll need to add the following dependencies to your `pom.xml` (if using Maven): ```xml <dependencies> <dependency> <groupId>info.picocli</groupId> <artifactId>picocli</artifactId> <version>4.7.5</version> <!-- Or the latest version --> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-cli</artifactId> <version>${quarkus.version}</version> <!-- Use your Quarkus version --> </dependency> <!-- Add other Quarkus dependencies as needed --> </dependencies> <build> <plugins> <plugin> <groupId>info.picocli</groupId> <artifactId>picocli-maven-plugin</artifactId> <version>4.7.5</version> <executions> <execution> <goals> <goal>generate-sources</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` **How to Use:** 1. **Save:** Save the code as `CreateMcpServerCommand.java`. 2. **Compile:** Compile the code using `javac CreateMcpServerCommand.java`. Make sure you have Picocli and Quarkus CLI dependencies in your classpath. 3. **Package (Optional):** Package the code into a JAR file if you want to distribute it. 4. **Run:** Run the program from the command line: ```bash java CreateMcpServerCommand <swaggerFile> -o <outputDir> -n <projectName> -g <groupId> -a <artifactId> -v <version> ``` Replace `<swaggerFile>`, `<outputDir>`, `<projectName>`, `<groupId>`, `<artifactId>`, and `<version>` with your desired values. **Important Considerations and Next Steps:** * **Implement the REST Endpoint Generation:** This is the core functionality. Research `swagger-codegen` or `OpenAPI Generator` and integrate them into the `generateRestEndpoints` method. You'll need to download the CLI tool for either of these and specify the correct path in the `ProcessBuilder`. Experiment with different generator types (e.g., `jaxrs-resteasy-reactive`, `spring`). * **Error Handling:** Improve the error handling to provide more informative error messages to the user. Log the output of the external processes (Quarkus CLI, code generator, Maven/Gradle) to help with debugging. * **Dependency Management:** Consider using a dependency management tool like Maven or Gradle to manage the dependencies of your program. * **Testing:** Write unit tests to verify the functionality of your program. * **Configuration:** Allow users to configure the code generation process (e.g., by providing additional command-line options). * **Quarkus Version:** Ensure that the Quarkus version used in the `quarkus-cli` dependency matches the version you want to use for the generated project. * **Path to Quarkus CLI:** Make sure the `ToolsUtils.getQuarkusCli()` call correctly finds the Quarkus CLI executable. You might need to configure the `QUARKUS_HOME` environment variable. * **Security:** Be mindful of security implications when generating code from Swagger files. Validate the Swagger file and sanitize any user input. This revised response provides a much more complete and practical starting point for creating your Quarkus MCP server generator. Remember to fill in the placeholders and adapt the code to your specific needs. ```java import io.quarkus.cli.commands.CreateProject; import io.quarkus.cli.commands.writer.ProjectWriter; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.TargetQuarkusVersionGroup; import io.quarkus.cli.common.ToolsOptions; import io.quarkus.cli.runtime.QuarkusCommandExecutionContext; import io.quarkus.devtools.commands.data.QuarkusCommandInvocation; import io.quarkus.devtools.commands.handlers.CreateProjectCommandHandler; import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.platform.tools.ToolsUtils; import picocli.CommandLine; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @CommandLine.Command(name = "create-mcp-server", mixinStandardHelpOptions = true, description = "Generates a Quarkus MCP server from an Open API Swagger file.") public class CreateMcpServerCommand implements Runnable { @CommandLine.Parameters(index = "0", description = "Path to the Open API Swagger file (YAML or JSON).", paramLabel = "<swaggerFile>") String swaggerFile; @CommandLine.Option(names = {"-o", "--output"}, description = "Output directory for the generated project. Defaults to current directory.", defaultValue = ".") Path outputDir; @CommandLine.Option(names = {"-n", "--name"}, description = "Name of the generated project. Defaults to 'mcp-server'.", defaultValue = "mcp-server") String projectName; @CommandLine.Option(names = {"-g", "--group-id"}, description = "The groupId of the project. Defaults to 'org.acme'.", defaultValue = "org.acme") String groupId; @CommandLine.Option(names = {"-a", "--artifact-id"}, description = "The artifactId of the project. Defaults to the project name.", defaultValue = "${projectName}") String artifactId; @CommandLine.Option(names = {"-v", "--version"}, description = "The version of the project. Defaults to '1.0.0-SNAPSHOT'.", defaultValue = "1.0.0-SNAPSHOT") String version; @CommandLine.Mixin OutputOptionMixin output; @CommandLine.Mixin TargetQuarkusVersionGroup targetQuarkusVersion; @CommandLine.Mixin ToolsOptions toolsOptions; @Override public void run() { try { // 1. Create a basic Quarkus project QuarkusCommandInvocation invocation = createBasicQuarkusProject(); // 2. Add necessary extensions (e.g., RESTeasy Reactive, OpenAPI) addExtensions(invocation); // 3. Copy the Swagger file to the project copySwaggerFile(invocation); // 4. Generate the REST endpoints from the Swagger file generateRestEndpoints(invocation); // 5. Build the project buildProject(invocation); output.print(String.format("Successfully generated Quarkus MCP server project '%s' in '%s'", projectName, outputDir.toAbsolutePath())); } catch (Exception e) { output.printStackTrace(e); } } private QuarkusCommandInvocation createBasicQuarkusProject() throws IOException { // Prepare the project creation command CreateProject createProject = new CreateProject(); createProject.output = output; createProject.targetQuarkusVersion = targetQuarkusVersion; createProject.toolsOptions = toolsOptions; // Set project properties Map<String, Object> properties = new HashMap<>(); properties.put("project.groupId", groupId); properties.put("project.artifactId", artifactId.equals("${projectName}") ? projectName : artifactId); // Handle default value properties.put("project.version", version); properties.put("project.name", projectName); properties.put("className", "org.acme.GreetingResource"); // Dummy class, will be overwritten properties.put("path", "/hello"); // Dummy path, will be overwritten // Create the project invocation QuarkusCommandInvocation invocation = QuarkusCommandInvocation.builder() .setBuildTool(BuildTool.MAVEN) // Or BuildTool.GRADLE .setProperties(properties) .setContext(QuarkusCommandExecutionContext.builder() .output(output.getOutput()) .projectDirectory(outputDir) .build()) .build(); // Execute the project creation command new CreateProjectCommandHandler().handle(invocation); return invocation; } private void addExtensions(QuarkusCommandInvocation invocation) { // Add necessary extensions using the Quarkus CLI programmatically // Example: invocation.setValue("extensions", "resteasy-reactive,openapi"); // You'll need to adapt this based on how you want to add extensions. // Consider using the `QuarkusCommandInvocation` to add extensions. // For example: // invocation.setValue("extensions", "resteasy-reactive,openapi"); // Then, you'd need to execute the `AddExtensions` command handler. // This is a placeholder. You'll need to implement the actual extension addition. // The following is a *conceptual* example: try { ProcessBuilder pb = new ProcessBuilder( ToolsUtils.getQuarkusCli().toAbsolutePath().toString(), "ext", "add", "resteasy-reactive", "openapi", "smallrye-openapi", "quarkus-smallrye-openapi", "--project-dir=" + outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error adding extensions. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully added extensions."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error adding extensions: " + e.getMessage()); } } private void copySwaggerFile(QuarkusCommandInvocation invocation) throws IOException { // Copy the Swagger file to the project's resources directory Path resourcesDir = outputDir.resolve("src/main/resources"); Path swaggerDestination = resourcesDir.resolve("openapi.yaml"); // Or openapi.json java.nio.file.Files.createDirectories(resourcesDir); java.nio.file.Files.copy(Paths.get(swaggerFile), swaggerDestination, java.nio.file.StandardCopyOption.REPLACE_EXISTING); output.print("Copied Swagger file to: " + swaggerDestination.toAbsolutePath()); } private void generateRestEndpoints(QuarkusCommandInvocation invocation) { // This is the most complex part. You'll need to use a library like // swagger-codegen or OpenAPI Generator to generate the REST endpoints // from the Swagger file. This typically involves: // 1. Adding the necessary dependencies to the project (e.g., swagger-codegen-cli). // 2. Running the code generation tool. // 3. Handling any errors that occur during code generation. // This is a placeholder. You'll need to implement the actual code generation. // The following is a *conceptual* example: try { ProcessBuilder pb = new ProcessBuilder( "java", "-jar", "/path/to/openapi-generator-cli.jar", // Replace with the actual path "generate", "-i", outputDir.resolve("src/main/resources/openapi.yaml").toAbsolutePath().toString(), "-g", "jaxrs-resteasy-reactive", // Or your preferred generator "-o", outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error generating REST endpoints. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully generated REST endpoints."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error generating REST endpoints: " + e.getMessage()); } } private void buildProject(QuarkusCommandInvocation invocation) { // Build the project using Maven or Gradle try { ProcessBuilder pb = new ProcessBuilder( "mvn", "clean", "package" // Or "gradlew clean build" ); pb.directory(outputDir.toFile()); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("Error building the project. Check the output for details."); // You might want to log the process output here. } else { output.print("Successfully built the project."); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("Error building the project: " + e.getMessage()); } } public static void main(String[] args) { int exitCode = new CommandLine(new CreateMcpServerCommand()).execute(args); System.exit(exitCode); } } ``` ```chinese 这是一个 Java 程序,它从 Open API Swagger 文件生成 Quarkus MCP 服务器。 ```java import io.quarkus.cli.commands.CreateProject; import io.quarkus.cli.commands.writer.ProjectWriter; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.TargetQuarkusVersionGroup; import io.quarkus.cli.common.ToolsOptions; import io.quarkus.cli.runtime.QuarkusCommandExecutionContext; import io.quarkus.devtools.commands.data.QuarkusCommandInvocation; import io.quarkus.devtools.commands.handlers.CreateProjectCommandHandler; import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.platform.tools.ToolsUtils; import picocli.CommandLine; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @CommandLine.Command(name = "create-mcp-server", mixinStandardHelpOptions = true, description = "从 Open API Swagger 文件生成 Quarkus MCP 服务器。") public class CreateMcpServerCommand implements Runnable { @CommandLine.Parameters(index = "0", description = "Open API Swagger 文件的路径 (YAML 或 JSON)。", paramLabel = "<swaggerFile>") String swaggerFile; @CommandLine.Option(names = {"-o", "--output"}, description = "生成项目的输出目录。默认为当前目录。", defaultValue = ".") Path outputDir; @CommandLine.Option(names = {"-n", "--name"}, description = "生成项目的名称。默认为 'mcp-server'。", defaultValue = "mcp-server") String projectName; @CommandLine.Option(names = {"-g", "--group-id"}, description = "项目的 groupId。默认为 'org.acme'。", defaultValue = "org.acme") String groupId; @CommandLine.Option(names = {"-a", "--artifact-id"}, description = "项目的 artifactId。默认为项目名称。", defaultValue = "${projectName}") String artifactId; @CommandLine.Option(names = {"-v", "--version"}, description = "项目的版本。默认为 '1.0.0-SNAPSHOT'。", defaultValue = "1.0.0-SNAPSHOT") String version; @CommandLine.Mixin OutputOptionMixin output; @CommandLine.Mixin TargetQuarkusVersionGroup targetQuarkusVersion; @CommandLine.Mixin ToolsOptions toolsOptions; @Override public void run() { try { // 1. 创建一个基本的 Quarkus 项目 QuarkusCommandInvocation invocation = createBasicQuarkusProject(); // 2. 添加必要的扩展 (例如,RESTeasy Reactive, OpenAPI) addExtensions(invocation); // 3. 将 Swagger 文件复制到项目 copySwaggerFile(invocation); // 4. 从 Swagger 文件生成 REST 端点 generateRestEndpoints(invocation); // 5. 构建项目 buildProject(invocation); output.print(String.format("成功在 '%s' 中生成 Quarkus MCP 服务器项目 '%s'", projectName, outputDir.toAbsolutePath())); } catch (Exception e) { output.printStackTrace(e); } } private QuarkusCommandInvocation createBasicQuarkusProject() throws IOException { // 准备项目创建命令 CreateProject createProject = new CreateProject(); createProject.output = output; createProject.targetQuarkusVersion = targetQuarkusVersion; createProject.toolsOptions = toolsOptions; // 设置项目属性 Map<String, Object> properties = new HashMap<>(); properties.put("project.groupId", groupId); properties.put("project.artifactId", artifactId.equals("${projectName}") ? projectName : artifactId); // 处理默认值 properties.put("project.version", version); properties.put("project.name", projectName); properties.put("className", "org.acme.GreetingResource"); // 虚拟类,将被覆盖 properties.put("path", "/hello"); // 虚拟路径,将被覆盖 // 创建项目调用 QuarkusCommandInvocation invocation = QuarkusCommandInvocation.builder() .setBuildTool(BuildTool.MAVEN) // 或者 BuildTool.GRADLE .setProperties(properties) .setContext(QuarkusCommandExecutionContext.builder() .output(output.getOutput()) .projectDirectory(outputDir) .build()) .build(); // 执行项目创建命令 new CreateProjectCommandHandler().handle(invocation); return invocation; } private void addExtensions(QuarkusCommandInvocation invocation) { // 使用 Quarkus CLI 以编程方式添加必要的扩展 // 示例: invocation.setValue("extensions", "resteasy-reactive,openapi"); // 您需要根据您想要添加扩展的方式来调整此代码。 // 考虑使用 `QuarkusCommandInvocation` 来添加扩展。 // 例如: // invocation.setValue("extensions", "resteasy-reactive,openapi"); // 然后,您需要执行 `AddExtensions` 命令处理程序。 // 这是一个占位符。您需要实现实际的扩展添加。 // 以下是一个*概念性*示例: try { ProcessBuilder pb = new ProcessBuilder( ToolsUtils.getQuarkusCli().toAbsolutePath().toString(), "ext", "add", "resteasy-reactive", "openapi", "smallrye-openapi", "quarkus-smallrye-openapi", "--project-dir=" + outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("添加扩展时出错。请检查输出以获取详细信息。"); // 您可能需要在此处记录进程输出。 } else { output.print("成功添加扩展。"); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("添加扩展时出错: " + e.getMessage()); } } private void copySwaggerFile(QuarkusCommandInvocation invocation) throws IOException { // 将 Swagger 文件复制到项目的 resources 目录 Path resourcesDir = outputDir.resolve("src/main/resources"); Path swaggerDestination = resourcesDir.resolve("openapi.yaml"); // 或者 openapi.json java.nio.file.Files.createDirectories(resourcesDir); java.nio.file.Files.copy(Paths.get(swaggerFile), swaggerDestination, java.nio.file.StandardCopyOption.REPLACE_EXISTING); output.print("已将 Swagger 文件复制到: " + swaggerDestination.toAbsolutePath()); } private void generateRestEndpoints(QuarkusCommandInvocation invocation) { // 这是最复杂的部分。您需要使用像 swagger-codegen 或 OpenAPI Generator 这样的库 // 从 Swagger 文件生成 REST 端点。这通常涉及: // 1. 将必要的依赖项添加到项目 (例如,swagger-codegen-cli)。 // 2. 运行代码生成工具。 // 3. 处理代码生成过程中发生的任何错误。 // 这是一个占位符。您需要实现实际的代码生成。 // 以下是一个*概念性*示例: try { ProcessBuilder pb = new ProcessBuilder( "java", "-jar", "/path/to/openapi-generator-cli.jar", // 替换为实际路径 "generate", "-i", outputDir.resolve("src/main/resources/openapi.yaml").toAbsolutePath().toString(), "-g", "jaxrs-resteasy-reactive", // 或者您喜欢的生成器 "-o", outputDir.toAbsolutePath().toString() ); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("生成 REST 端点时出错。请检查输出以获取详细信息。"); // 您可能需要在此处记录进程输出。 } else { output.print("成功生成 REST 端点。"); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("生成 REST 端点时出错: " + e.getMessage()); } } private void buildProject(QuarkusCommandInvocation invocation) { // 使用 Maven 或 Gradle 构建项目 try { ProcessBuilder pb = new ProcessBuilder( "mvn", "clean", "package" // 或者 "gradlew clean build" ); pb.directory(outputDir.toFile()); pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); if (exitCode != 0) { output.print("构建项目时出错。请检查输出以获取详细信息。"); // 您可能需要在此处记录进程输出。 } else { output.print("成功构建项目。"); } } catch (IOException | InterruptedException e) { output.printStackTrace(e); output.print("构建项目时出错: " + e.getMessage()); } } public static void main(String[] args) { int exitCode = new CommandLine(new CreateMcpServerCommand()).execute(args); System.exit(exitCode);
@thatworkagency/mcp-shopify
Model Context Protocol server providing read-only access to Shopify Admin API for products, orders, customers, and shop information with multi-store support via HTTP.
Skill Seekers
Transform 17 source types into AI-ready skills and RAG knowledge, directly from Claude Code.
MCP Server Basic
A basic MCP server example that provides simple arithmetic tools (addition and subtraction) and personalized greeting resources. Serves as a foundation for learning MCP server implementation and development.
BotTrade
BotTrade is a historical-market benchmark for autonomous trading agents, enabling backtesting and evaluation through MCP or Python with standardized scenarios and scoring metrics.
MATLAB MCP Tool
Enables interactive MATLAB development by allowing users to execute scripts and specific code sections, manage workspace variables, and capture generated plots. It integrates with the MATLAB Python Engine to provide persistent execution context for MCP-compatible clients.
BlitzAPI MCP Server
Enables Claude to access BlitzAPI's B2B data endpoints, allowing sales reps to find contacts, companies, and enriched data using natural language.
Firewalla MSP MCP Server
Provides AI assistants and MCP clients with API access to manage Firewalla MSP resources including boxes, devices, alarms, rules, flows, and target lists.
termux-phone-mcp
Provides Android device and Termux capabilities to RikkaHub via a local MCP server, enabling device info, battery, power sampling, package installs, proot-distro management, brightness/volume control, and optional command execution.
rocketchat-mcp-server
A FastMCP (Python) server for Rocket.Chat with 28 tools covering channels, messages, threads, DMs, files, users, and analytics, plus AI governance, observability, and security features.
Aragorn
A direct kernel debugger MCP server for Windows security research that connects to VM kernels via kdnet using DbgEng COM interfaces. It exposes over 60 tools for memory inspection, breakpoint management, and coordinated execution control between the host and target VM.