发现优秀的 MCP 服务器

通过 MCP 服务器扩展您的代理能力,拥有 14,536 个能力。

全部14,536
PC-MCP

PC-MCP

针对操作个人电脑的 MCP 服务器,该项目当前主要针对 smart-pet-with-mcp 项目的搭配演示用。 (This translation aims to be as accurate and natural as possible.)

UIThub MCP Server

UIThub MCP Server

简单的 GitHub MCP 服务器。

github-mcp-cursor-project-rules

github-mcp-cursor-project-rules

Okay, here's a translation of "Cursor project rules and MCP server" into Chinese, along with some context to make sure it's the most accurate translation: **Possible Translations:** * **精确翻译 (Literal):** 光标项目规则和 MCP 服务器 (Guāngbiāo xiàngmù guīzé hé MCP fúwùqì) * **更自然的翻译 (More Natural):** 光标项目的规则与 MCP 服务器 (Guāngbiāo xiàngmù de guīzé yǔ MCP fúwùqì) **Explanation of the Translation Choices:** * **光标 (Guāngbiāo):** Cursor (as in the mouse cursor or a text cursor) * **项目 (Xiàngmù):** Project * **规则 (Guīzé):** Rules * **和 (Hé) / 与 (Yǔ):** And (both are acceptable, 与 is slightly more formal) * **MCP 服务器 (MCP Fúwùqì):** MCP Server (MCP is usually kept as is, as it's an acronym. 服务器 means "server.") * **的 (De):** A possessive particle, used to connect "光标项目" (Cursor project) and "规则" (rules) to make it "Cursor project's rules". **Which Translation to Use:** The more natural translation, **光标项目的规则与 MCP 服务器 (Guāngbiāo xiàngmù de guīzé yǔ MCP fúwùqì)**, is generally preferred because it flows better in Chinese. **Important Considerations (Context is Key):** To give you the *best* translation, I need a little more context. Here are some questions to consider: * **What kind of "Cursor project" is this?** Is it a software project involving cursors? Is it a project *named* "Cursor"? Knowing this will help me choose the most appropriate wording. * **What is the MCP server used for?** Knowing the purpose of the server will help ensure the translation is accurate. **Example with More Context:** Let's say the "Cursor project" is a software development project focused on improving cursor behavior, and the MCP server is used for managing the project's resources. Then, a possible translation could be: * **针对光标行为改进的软件项目规则与 MCP 服务器** (Zhēnduì guāngbiāo xíngwéi gǎijìn de ruǎnjiàn xiàngmù guīzé yǔ MCP fúwùqì) * This translates to: "Rules for the software project aimed at improving cursor behavior and the MCP server." Therefore, please provide more context if you want a more precise and accurate translation.

@waldzellai/mcp-servers

@waldzellai/mcp-servers

Waldzell AI 的 MCP 服务器单体仓库,用于模型增强。应用于 Claude Desktop、Cline、Roo Code 等!

mcp-server-email

mcp-server-email

好的,这是关于使用 Golang 发送电子邮件的 mcp-server 演示: **标题:使用 Golang 在 mcp-server 中发送电子邮件** **简介:** 本演示展示了如何在 mcp-server 环境中使用 Golang 发送电子邮件。我们将使用 `net/smtp` 包来连接 SMTP 服务器并发送邮件。 **先决条件:** * 安装 Golang (1.16 或更高版本) * 安装 mcp-server * 一个可用的 SMTP 服务器 (例如:Gmail, Outlook, 或本地 SMTP 服务器) * SMTP 服务器的凭据 (用户名和密码) **代码示例:** ```go package main import ( "fmt" "net/smtp" "log" ) // 配置信息 const ( smtpServer = "smtp.gmail.com" // 你的 SMTP 服务器地址 smtpPort = 587 // 你的 SMTP 服务器端口 senderEmail = "your_email@gmail.com" // 你的邮箱地址 senderPassword = "your_password" // 你的邮箱密码 (或应用专用密码) receiverEmail = "recipient_email@example.com" // 收件人邮箱地址 ) func main() { // 邮件内容 subject := "Golang Email Demo" body := "This is a test email sent from a Golang application in mcp-server." // 构建邮件消息 message := []byte( "To: " + receiverEmail + "\r\n" + "Subject: " + subject + "\r\n" + "\r\n" + body + "\r\n", ) // 认证信息 auth := smtp.PlainAuth("", senderEmail, senderPassword, smtpServer) // 连接到 SMTP 服务器并发送邮件 err := smtp.SendMail(smtpServer+":"+fmt.Sprintf("%d", smtpPort), auth, senderEmail, []string{receiverEmail}, message) if err != nil { log.Fatal(err) return } fmt.Println("Email sent successfully!") } ``` **代码解释:** 1. **导入必要的包:** `net/smtp` 用于 SMTP 连接和邮件发送,`fmt` 用于格式化字符串,`log` 用于错误处理。 2. **配置信息:** 定义了 SMTP 服务器地址、端口、发件人邮箱、发件人密码和收件人邮箱。 **请务必替换这些值为你自己的信息。** 对于 Gmail,你可能需要启用“允许安全性较低的应用访问”或使用应用专用密码。 3. **邮件内容:** 定义了邮件的主题和正文。 4. **构建邮件消息:** 使用字符串拼接构建邮件消息。 `\r\n` 用于换行。 5. **认证信息:** 使用 `smtp.PlainAuth` 创建一个认证对象,用于向 SMTP 服务器验证身份。 6. **连接到 SMTP 服务器并发送邮件:** 使用 `smtp.SendMail` 函数连接到 SMTP 服务器并发送邮件。 该函数接受 SMTP 服务器地址、认证对象、发件人邮箱、收件人邮箱列表和邮件消息作为参数。 7. **错误处理:** 检查 `smtp.SendMail` 函数是否返回错误,如果返回错误,则打印错误信息并退出程序。 8. **成功提示:** 如果邮件发送成功,则打印一条成功消息。 **运行步骤:** 1. 将代码保存为 `main.go` 文件。 2. 在 mcp-server 环境中,使用 `go run main.go` 命令运行程序。 3. 检查收件人邮箱,确认是否收到邮件。 **注意事项:** * **安全性:** 请勿将密码硬编码到代码中。 建议使用环境变量或配置文件来存储密码。 * **Gmail:** 如果使用 Gmail,你可能需要启用“允许安全性较低的应用访问”或使用应用专用密码。 启用“允许安全性较低的应用访问”可能会降低你的账户安全性,因此建议使用应用专用密码。 * **错误处理:** 在实际应用中,应该进行更完善的错误处理,例如重试发送邮件或记录错误日志。 * **速率限制:** 某些 SMTP 服务器可能会对发送邮件的速率进行限制。 如果遇到速率限制,可以尝试降低发送邮件的频率或使用其他 SMTP 服务器。 * **mcp-server 集成:** 本示例是一个独立的程序。 要将其集成到 mcp-server 中,你需要将其作为 mcp-server 的一个模块或服务来运行。 具体集成方式取决于 mcp-server 的架构和配置。 **中文翻译:** **标题:使用 Golang 在 mcp-server 中发送电子邮件** **简介:** 本演示展示了如何在 mcp-server 环境中使用 Golang 发送电子邮件。我们将使用 `net/smtp` 包来连接 SMTP 服务器并发送邮件。 **先决条件:** * 安装 Golang (1.16 或更高版本) * 安装 mcp-server * 一个可用的 SMTP 服务器 (例如:Gmail, Outlook, 或本地 SMTP 服务器) * SMTP 服务器的凭据 (用户名和密码) **代码示例:** ```go package main import ( "fmt" "net/smtp" "log" ) // 配置信息 const ( smtpServer = "smtp.gmail.com" // 你的 SMTP 服务器地址 smtpPort = 587 // 你的 SMTP 服务器端口 senderEmail = "your_email@gmail.com" // 你的邮箱地址 senderPassword = "your_password" // 你的邮箱密码 (或应用专用密码) receiverEmail = "recipient_email@example.com" // 收件人邮箱地址 ) func main() { // 邮件内容 subject := "Golang 邮件演示" body := "这是一封来自 mcp-server 中 Golang 应用程序的测试邮件。" // 构建邮件消息 message := []byte( "To: " + receiverEmail + "\r\n" + "Subject: " + subject + "\r\n" + "\r\n" + body + "\r\n", ) // 认证信息 auth := smtp.PlainAuth("", senderEmail, senderPassword, smtpServer) // 连接到 SMTP 服务器并发送邮件 err := smtp.SendMail(smtpServer+":"+fmt.Sprintf("%d", smtpPort), auth, senderEmail, []string{receiverEmail}, message) if err != nil { log.Fatal(err) return } fmt.Println("邮件发送成功!") } ``` **代码解释:** 1. **导入必要的包:** `net/smtp` 用于 SMTP 连接和邮件发送,`fmt` 用于格式化字符串,`log` 用于错误处理。 2. **配置信息:** 定义了 SMTP 服务器地址、端口、发件人邮箱、发件人密码和收件人邮箱。 **请务必替换这些值为你自己的信息。** 对于 Gmail,你可能需要启用“允许安全性较低的应用访问”或使用应用专用密码。 3. **邮件内容:** 定义了邮件的主题和正文。 4. **构建邮件消息:** 使用字符串拼接构建邮件消息。 `\r\n` 用于换行。 5. **认证信息:** 使用 `smtp.PlainAuth` 创建一个认证对象,用于向 SMTP 服务器验证身份。 6. **连接到 SMTP 服务器并发送邮件:** 使用 `smtp.SendMail` 函数连接到 SMTP 服务器并发送邮件。 该函数接受 SMTP 服务器地址、认证对象、发件人邮箱、收件人邮箱列表和邮件消息作为参数。 7. **错误处理:** 检查 `smtp.SendMail` 函数是否返回错误,如果返回错误,则打印错误信息并退出程序。 8. **成功提示:** 如果邮件发送成功,则打印一条成功消息。 **运行步骤:** 1. 将代码保存为 `main.go` 文件。 2. 在 mcp-server 环境中,使用 `go run main.go` 命令运行程序。 3. 检查收件人邮箱,确认是否收到邮件。 **注意事项:** * **安全性:** 请勿将密码硬编码到代码中。 建议使用环境变量或配置文件来存储密码。 * **Gmail:** 如果使用 Gmail,你可能需要启用“允许安全性较低的应用访问”或使用应用专用密码。 启用“允许安全性较低的应用访问”可能会降低你的账户安全性,因此建议使用应用专用密码。 * **错误处理:** 在实际应用中,应该进行更完善的错误处理,例如重试发送邮件或记录错误日志。 * **速率限制:** 某些 SMTP 服务器可能会对发送邮件的速率进行限制。 如果遇到速率限制,可以尝试降低发送邮件的频率或使用其他 SMTP 服务器。 * **mcp-server 集成:** 本示例是一个独立的程序。 要将其集成到 mcp-server 中,你需要将其作为 mcp-server 的一个模块或服务来运行。 具体集成方式取决于 mcp-server 的架构和配置。 **总结:** 这个演示提供了一个使用 Golang 在 mcp-server 环境中发送电子邮件的基本示例。 你可以根据自己的需求修改代码,例如添加附件、使用 HTML 格式的邮件内容等。 记住要处理错误并注意安全性。 希望这个演示对你有所帮助!

Mcp Server Code Analyzer

Mcp Server Code Analyzer

stackzero-labs/mcp

stackzero-labs/mcp

A model context protocol server that enables applications to use stackzero-labs/ui components through the MCP protocol, supporting both standalone operation and integration with Claude Desktop and Cursor.

Echo MCP Server

Echo MCP Server

一个简单的服务器,实现了模型上下文协议(MCP),会将消息回显,专为测试 MCP 客户端而设计。

CTF-MCP-Server

CTF-MCP-Server

MCP Web Extractor

MCP Web Extractor

使用 Readability.js 提取网页内容的 MCP 服务器。

ERPNext MCP Server

ERPNext MCP Server

A production-ready server that enables AI assistants like Claude Desktop to seamlessly integrate with ERPNext for document operations, reporting, and custom workflows through natural language interaction.

Redmine MCP Server

Redmine MCP Server

镜子 (jìng zi)

jira-mcp-server

jira-mcp-server

Cursor Talk to Figma MCP

Cursor Talk to Figma MCP

Enables Cursor AI to communicate with Figma for reading designs and modifying them programmatically, allowing users to automate design tasks through natural language.

Bankless Onchain MCP Server

Bankless Onchain MCP Server

将 Bankless Onchain API 引入 MCP

Letter Counter MCP Server

Letter Counter MCP Server

一个 MCP 服务器,它使 LLM 能够计算单词中特定字母的出现次数,创建该服务器是为了作为模型上下文协议的学习示例。

YouTube Knowledge MCP

YouTube Knowledge MCP

Transforms YouTube into a queryable knowledge source with search, video details, transcript analysis, and AI-powered tools for summaries, learning paths, and knowledge graphs. Features quota-aware API access with caching and optional OpenAI/Anthropic integration for advanced content analysis.

Database Schema MCP Server

Database Schema MCP Server

GitLab MCP Server

GitLab MCP Server

MCP-Kit Developer Task Assignment System

MCP-Kit Developer Task Assignment System

Enables intelligent task assignment to developers using hybrid AI algorithms that match tasks based on past experience, skill sets, workload balance, and project alignment. Features enterprise-grade security with AES-256 encryption and 75% performance optimization through smart caching.

🚀 Go-Tapd-SDK

🚀 Go-Tapd-SDK

Go Tapd SDK 是一个用于访问 Tapd API 的 Go 客户端库,并且它也支持最新的 MCP 服务器。

Cohere MCP Server

Cohere MCP Server

Cohere MCP 服务器 (Cohere MCP fúwùqì)

DAV MCP Server

DAV MCP Server

A Model Context Protocol server that allows users to interact with their CalDAV, CardDAV, and WebDAV services (calendars, contacts, and files) from Fastmail and Apple iCloud accounts.

shortcuts-mcp-server

shortcuts-mcp-server

shortcuts-mcp-server

Pagos Data MCP Server

Pagos Data MCP Server

Enables Claude to retrieve BIN (Bank Identification Number) data for payment cards, with options for basic or enhanced insights through the Pagos API.

rest-to-mcp

rest-to-mcp

好的,这是一个将 REST API 转换为 MCP 服务器的教程项目: **项目目标:** * 创建一个 MCP 服务器,该服务器可以接收来自客户端的请求。 * 将接收到的请求转换为对现有 REST API 的调用。 * 将 REST API 的响应转换回 MCP 响应并发送回客户端。 **技术栈:** * **MCP (Minecraft Protocol):** 理解 Minecraft 协议是关键。你需要了解数据包的结构和如何发送/接收它们。 * **Java (或你熟悉的语言):** Java 是 Minecraft 服务器开发的常用语言,但你也可以使用其他语言,只要它们支持网络编程和 JSON 处理。 * **Netty (或类似的网络库):** Netty 是一个高性能的网络应用程序框架,可以简化网络编程。 * **JSON 处理库 (Gson, Jackson, etc.):** 用于序列化和反序列化 JSON 数据。 * **HTTP 客户端库 (HttpClient, OkHttp, etc.):** 用于调用 REST API。 **项目步骤:** 1. **环境搭建:** * 安装 Java Development Kit (JDK)。 * 安装一个 IDE (例如 IntelliJ IDEA 或 Eclipse)。 * 创建一个新的 Java 项目。 * 添加 Netty、JSON 处理库和 HTTP 客户端库作为项目依赖。 (使用 Maven 或 Gradle 管理依赖) 2. **理解 Minecraft 协议:** * **研究 Minecraft 协议:** 了解客户端和服务器之间如何通信。 你可以参考以下资源: * [Wiki.vg](https://wiki.vg/Protocol) (非常详细的协议文档) * [MCProtocolLib](https://github.com/Steveice112/MCProtocolLib) (一个 Java 库,可以帮助你处理 Minecraft 协议) * **确定要支持的协议版本:** 不同的 Minecraft 版本使用不同的协议。选择一个你想要支持的版本。 * **分析需要拦截的数据包:** 确定哪些客户端数据包需要被拦截并转换为 REST API 调用。 例如,聊天消息、命令、物品使用等。 * **分析需要发送的数据包:** 确定哪些服务器数据包需要被发送回客户端,以及如何将 REST API 的响应转换为这些数据包。 3. **创建 MCP 服务器:** * **使用 Netty 创建一个 TCP 服务器:** 监听指定的端口 (例如 25565,Minecraft 的默认端口)。 * **实现一个 ChannelHandler:** 这个 handler 将处理客户端连接、接收数据包、发送数据包和处理错误。 * **处理握手 (Handshake) 数据包:** 客户端首先发送一个握手数据包,其中包含协议版本、服务器地址和端口。 你需要解析这个数据包并验证协议版本。 * **处理登录 (Login) 数据包:** 客户端发送登录数据包,其中包含玩家的用户名。 你需要验证用户名并发送登录成功数据包。 4. **拦截和转换数据包:** * **拦截客户端数据包:** 在 ChannelHandler 中,拦截你想要处理的客户端数据包。 * **解析数据包内容:** 根据协议文档,解析数据包中的数据。 * **将数据转换为 REST API 请求:** 将解析后的数据转换为一个 HTTP 请求,并发送到你的 REST API。 例如,如果客户端发送了一个聊天消息,你可以将消息内容发送到 REST API 的一个端点。 * **处理 REST API 响应:** 接收 REST API 的响应。 * **将 REST API 响应转换为 MCP 数据包:** 将 REST API 的响应转换为一个或多个 MCP 数据包,并发送回客户端。 例如,如果 REST API 返回一个自定义的聊天消息,你可以将其转换为一个聊天消息数据包并发送回客户端。 5. **调用 REST API:** * **使用 HTTP 客户端库发送 HTTP 请求:** 使用你选择的 HTTP 客户端库 (例如 HttpClient 或 OkHttp) 发送 HTTP 请求到你的 REST API。 * **处理 HTTP 响应:** 接收 HTTP 响应并解析响应内容。 6. **错误处理:** * **处理网络错误:** 处理连接错误、超时错误等。 * **处理协议错误:** 处理无效的数据包、错误的协议版本等。 * **处理 REST API 错误:** 处理 REST API 返回的错误。 * **向客户端发送错误消息:** 如果发生错误,向客户端发送一个错误消息。 7. **测试:** * **使用 Minecraft 客户端连接到你的 MCP 服务器:** 确保你的 Minecraft 客户端使用与你的服务器相同的协议版本。 * **测试所有功能:** 测试所有你想要支持的功能,例如聊天消息、命令、物品使用等。 * **调试错误:** 如果出现错误,使用调试器来查找问题并修复它们。 **代码示例 (简化版,仅供参考):** ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.buffer.ByteBuf; import java.util.List; public class McpServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new PacketDecoder(), new PacketEncoder(), new McpServerHandler() ); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(25565).sync(); System.out.println("MCP Server started on port 25565"); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } // 示例:数据包解码器 static class PacketDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { // 读取数据包长度 (VarInt) int packetLength = readVarInt(in); // 确保有足够的数据 if (in.readableBytes() < packetLength) { in.resetReaderIndex(); // 重置读取索引,等待更多数据 return; } // 读取数据包 ID (VarInt) int packetId = readVarInt(in); // 读取数据包内容 ByteBuf packetData = in.readBytes(packetLength - varIntLength(packetId)); // 创建一个数据包对象 (你需要定义你的数据包类) Packet packet = new Packet(packetId, packetData); out.add(packet); } // 读取 VarInt (Minecraft 使用的变长整数) private int readVarInt(ByteBuf in) { int numRead = 0; int result = 0; byte read; do { read = in.readByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new RuntimeException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } // 计算 VarInt 的长度 private int varIntLength(int value) { int length = 0; do { value >>>= 7; length++; } while (value != 0); return length; } } // 示例:数据包编码器 static class PacketEncoder extends MessageToByteEncoder<Packet> { @Override protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception { ByteBuf packetData = msg.getData(); int packetId = msg.getId(); // 计算数据包长度 int packetLength = varIntLength(packetId) + packetData.readableBytes(); // 写入数据包长度 (VarInt) writeVarInt(out, packetLength); // 写入数据包 ID (VarInt) writeVarInt(out, packetId); // 写入数据包内容 out.writeBytes(packetData); } // 写入 VarInt private void writeVarInt(ByteBuf out, int value) { while (true) { if ((value & ~0x7F) == 0) { out.writeByte(value); return; } out.writeByte((value & 0x7F) | 0x80); value >>>= 7; } } // 计算 VarInt 的长度 private int varIntLength(int value) { int length = 0; do { value >>>= 7; length++; } while (value != 0); return length; } } // 示例:服务器处理器 static class McpServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { Packet packet = (Packet) msg; int packetId = packet.getId(); ByteBuf packetData = packet.getData(); System.out.println("Received packet with ID: " + packetId); // 根据数据包 ID 处理数据包 switch (packetId) { case 0x00: // Handshake handleHandshake(ctx, packetData); break; case 0x00: // Login Start handleLoginStart(ctx, packetData); break; // 其他数据包处理 default: System.out.println("Unknown packet ID: " + packetId); break; } } private void handleHandshake(ChannelHandlerContext ctx, ByteBuf packetData) { // 解析握手数据包 int protocolVersion = readVarInt(packetData); String serverAddress = readString(packetData); int serverPort = packetData.readUnsignedShort(); int nextState = readVarInt(packetData); System.out.println("Handshake received: protocolVersion=" + protocolVersion + ", serverAddress=" + serverAddress + ", serverPort=" + serverPort + ", nextState=" + nextState); // 根据 nextState 进行处理 (例如,切换到状态 1 - Status 或 2 - Login) if (nextState == 1) { // 发送 Status Response sendStatusResponse(ctx); } else if (nextState == 2) { // 准备处理 Login } } private void handleLoginStart(ChannelHandlerContext ctx, ByteBuf packetData) { // 解析登录开始数据包 String username = readString(packetData); System.out.println("Login Start received: username=" + username); // TODO: 调用 REST API 进行身份验证 // 发送 Login Success 数据包 sendLoginSuccess(ctx, username); } private void sendStatusResponse(ChannelHandlerContext ctx) { // 创建 Status Response 数据包 String jsonResponse = "{\"version\": {\"name\": \"My MCP Server\", \"protocol\": 754}, \"players\": {\"max\": 100, \"online\": 0}, \"description\": {\"text\": \"A custom MCP server\"}}"; ByteBuf responseData = ctx.alloc().buffer(); writeString(responseData, jsonResponse); // 创建数据包 Packet statusResponsePacket = new Packet(0x00, responseData); // 发送数据包 ctx.writeAndFlush(statusResponsePacket); } private void sendLoginSuccess(ChannelHandlerContext ctx, String username) { // 创建 Login Success 数据包 ByteBuf responseData = ctx.alloc().buffer(); writeString(responseData, "00000000-0000-0000-0000-000000000000"); // UUID (可以生成一个) writeString(responseData, username); // 创建数据包 Packet loginSuccessPacket = new Packet(0x02, responseData); // 发送数据包 ctx.writeAndFlush(loginSuccessPacket); } // 读取 VarInt private int readVarInt(ByteBuf in) { int numRead = 0; int result = 0; byte read; do { read = in.readByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new RuntimeException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } // 写入 VarInt private void writeVarInt(ByteBuf out, int value) { while (true) { if ((value & ~0x7F) == 0) { out.writeByte(value); return; } out.writeByte((value & 0x7F) | 0x80); value >>>= 7; } } // 读取字符串 private String readString(ByteBuf in) { int length = readVarInt(in); ByteBuf stringData = in.readBytes(length); return stringData.toString(java.nio.charset.StandardCharsets.UTF_8); } // 写入字符串 private void writeString(ByteBuf out, String value) { byte[] stringBytes = value.getBytes(java.nio.charset.StandardCharsets.UTF_8); writeVarInt(out, stringBytes.length); out.writeBytes(stringBytes); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } } // 数据包类 static class Packet { private final int id; private final ByteBuf data; public Packet(int id, ByteBuf data) { this.id = id; this.data = data; } public int getId() { return id; } public ByteBuf getData() { return data; } } } ``` **重要提示:** * **安全性:** 确保你的 REST API 是安全的,并且只允许授权的客户端访问。 使用身份验证和授权机制。 * **性能:** 优化你的代码以获得最佳性能。 使用缓存、连接池等技术。 * **可扩展性:** 设计你的服务器以支持大量的并发连接。 使用异步编程和非阻塞 I/O。 * **错误处理:** 实现完善的错误处理机制,以便在出现问题时能够快速诊断和修复。 * **协议版本:** 密切关注 Minecraft 协议的更新,并及时更新你的服务器以支持最新的协议版本。 * **代码组织:** 将你的代码组织成模块化的组件,以便于维护和扩展。 **下一步:** 1. **创建你的 REST API:** 如果你还没有 REST API,你需要创建一个。 你可以使用任何你喜欢的编程语言和框架。 2. **实现数据包处理逻辑:** 根据你的 REST API 的需求,实现数据包处理逻辑。 3. **测试你的服务器:** 使用 Minecraft 客户端连接到你的服务器并测试所有功能。 这是一个复杂的项目,需要对 Minecraft 协议和网络编程有深入的了解。 祝你成功! **中文翻译:** 好的,这是一个将 REST API 转换为 MCP 服务器的教程项目: **项目目标:** * 创建一个 MCP 服务器,该服务器可以接收来自客户端的请求。 * 将接收到的请求转换为对现有 REST API 的调用。 * 将 REST API 的响应转换回 MCP 响应并发送回客户端。 **技术栈:** * **MCP (Minecraft 协议):** 理解 Minecraft 协议是关键。你需要了解数据包的结构和如何发送/接收它们。 * **Java (或你熟悉的语言):** Java 是 Minecraft 服务器开发的常用语言,但你也可以使用其他语言,只要它们支持网络编程和 JSON 处理。 * **Netty (或类似的網絡庫):** Netty 是一个高性能的网络应用程序框架,可以简化网络编程。 * **JSON 处理库 (Gson, Jackson, etc.):** 用于序列化和反序列化 JSON 数据。 * **HTTP 客户端库 (HttpClient, OkHttp, etc.):** 用于调用 REST API。 **项目步骤:** 1. **环境搭建:** * 安装 Java Development Kit (JDK)。 * 安装一个 IDE (例如 IntelliJ IDEA 或 Eclipse)。 * 创建一个新的 Java 项目。 * 添加 Netty、JSON 处理库和 HTTP 客户端库作为项目依赖。 (使用 Maven 或 Gradle 管理依赖) 2. **理解 Minecraft 协议:** * **研究 Minecraft 协议:** 了解客户端和服务器之间如何通信。 你可以参考以下资源: * [Wiki.vg](https://wiki.vg/Protocol) (非常详细的协议文档) * [MCProtocolLib](https://github.com/Steveice112/MCProtocolLib) (一个 Java 库,可以帮助你处理 Minecraft 协议) * **确定要支持的协议版本:** 不同的 Minecraft 版本使用不同的协议。选择一个你想要支持的版本。 * **分析需要拦截的数据包:** 确定哪些客户端数据包需要被拦截并转换为 REST API 调用。 例如,聊天消息、命令、物品使用等。 * **分析需要发送的数据包:** 确定哪些服务器数据包需要被发送回客户端,以及如何将 REST API 的响应转换为这些数据包。 3. **创建 MCP 服务器:** * **使用 Netty 创建一个 TCP 服务器:** 监听指定的端口 (例如 25565,Minecraft 的默认端口)。 * **实现一个 ChannelHandler:** 这个 handler 将处理客户端连接、接收数据包、发送数据包和处理错误。 * **处理握手 (Handshake) 数据包:** 客户端首先发送一个握手数据包,其中包含协议版本、服务器地址和端口。 你需要解析这个数据包并验证协议版本。 * **处理登录 (Login) 数据包:** 客户端发送登录数据包,其中包含玩家的用户名。 你需要验证用户名并发送登录成功数据包。 4. **拦截和转换数据包:** * **拦截客户端数据包:** 在 ChannelHandler 中,拦截你想要处理的客户端数据包。 * **解析数据包内容:** 根据协议文档,解析数据包中的数据。 * **将数据转换为 REST API 请求:** 将解析后的数据转换为一个 HTTP 请求,并发送到你的 REST API。 例如,如果客户端发送了一个聊天消息,你可以将消息内容发送到 REST API 的一个端点。 * **处理 REST API 响应:** 接收 REST API 的响应。 * **将 REST API 响应转换为 MCP 数据包:** 将 REST API 的响应转换为一个或多个 MCP 数据包,并发送回客户端。 例如,如果 REST API 返回一个自定义的聊天消息,你可以将其转换为一个聊天消息数据包并发送回客户端。 5. **调用 REST API:** * **使用 HTTP 客户端库发送 HTTP 请求:** 使用你选择的 HTTP 客户端库 (例如 HttpClient 或 OkHttp) 发送 HTTP 请求到你的 REST API。 * **处理 HTTP 响应:** 接收 HTTP 响应并解析响应内容。 6. **错误处理:** * **处理网络错误:** 处理连接错误、超时错误等。 * **处理协议错误:** 处理无效的数据包、错误的协议版本等。 * **处理 REST API 错误:** 处理 REST API 返回的错误。 * **向客户端发送错误消息:** 如果发生错误,向客户端发送一个错误消息。 7. **测试:** * **使用 Minecraft 客户端连接到你的 MCP 服务器:** 确保你的 Minecraft 客户端使用与你的服务器相同的协议版本。 * **测试所有功能:** 测试所有你想要支持的功能,例如聊天消息、命令、物品使用等。 * **调试错误:** 如果出现错误,使用调试器来查找问题并修复它们。 **代码示例 (简化版,仅供参考):** ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.buffer.ByteBuf; import java.util.List; public class McpServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new PacketDecoder(), new PacketEncoder(), new McpServerHandler() ); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(25565).sync(); System.out.println("MCP Server started on port 25565"); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } // 示例:数据包解码器 static class PacketDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { // 读取数据包长度 (VarInt) int packetLength = readVarInt(in); // 确保有足够的数据 if (in.readableBytes() < packetLength) { in.resetReaderIndex(); // 重置读取索引,等待更多数据 return; } // 读取数据包 ID (VarInt) int packetId = readVarInt(in); // 读取数据包内容 ByteBuf packetData = in.readBytes(packetLength - varIntLength(packetId)); // 创建一个数据包对象 (你需要定义你的数据包类) Packet packet = new Packet(packetId, packetData); out.add(packet); } // 读取 VarInt (Minecraft 使用的变长整数) private int readVarInt(ByteBuf in) { int numRead = 0; int result = 0; byte read; do { read = in.readByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new RuntimeException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } // 计算 VarInt 的长度 private int varIntLength(int value) { int length = 0; do { value >>>= 7; length++; } while (value != 0); return length; } } // 示例:数据包编码器 static class PacketEncoder extends MessageToByteEncoder<Packet> { @Override protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception { ByteBuf packetData = msg.getData(); int packetId = msg.getId(); // 计算数据包长度 int packetLength = varIntLength(packetId) + packetData.readableBytes(); // 写入数据包长度 (VarInt) writeVarInt(out, packetLength); // 写入数据包 ID (VarInt) writeVarInt(out, packetId); // 写入数据包内容 out.writeBytes(packetData); } // 写入 VarInt private void writeVarInt(ByteBuf out, int value) { while (true) { if ((value & ~0x7F) == 0) { out.writeByte(value); return; } out.writeByte((value & 0x7F) | 0x80); value >>>= 7; } } // 计算 VarInt 的长度 private int varIntLength(int value) { int length = 0; do { value >>>= 7; length++; } while (value != 0); return length; } } // 示例:服务器处理器 static class McpServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { Packet packet = (Packet) msg; int packetId = packet.getId(); ByteBuf packetData = packet.getData(); System.out.println("Received packet with ID: " + packetId); // 根据数据包 ID 处理数据包 switch (packetId) { case 0x00: // Handshake handleHandshake(ctx, packetData); break; case 0x00: // Login Start handleLoginStart(ctx, packetData); break; // 其他数据包处理 default: System.out.println("Unknown packet ID: " + packetId); break; } } private void handleHandshake(ChannelHandlerContext ctx, ByteBuf packetData) { // 解析握手数据包 int protocolVersion = readVarInt(packetData); String serverAddress = readString(packetData); int serverPort = packetData.readUnsignedShort(); int nextState = readVarInt(packetData); System.out.println("Handshake received: protocolVersion=" + protocolVersion + ", serverAddress=" + serverAddress + ", serverPort=" + serverPort + ", nextState=" + nextState); // 根据 nextState 进行处理 (例如,切换到状态 1 - Status 或 2 - Login) if (nextState == 1) { // 发送 Status Response sendStatusResponse(ctx); } else if (nextState == 2) { // 准备处理 Login } } private void handleLoginStart(ChannelHandlerContext ctx, ByteBuf packetData) { // 解析登录开始数据包 String username = readString(packetData); System.out.println("Login Start received: username=" + username); // TODO: 调用 REST API 进行身份验证 // 发送 Login Success 数据包 sendLoginSuccess(ctx, username); } private void sendStatusResponse(ChannelHandlerContext ctx) { // 创建 Status Response 数据包 String jsonResponse = "{\"version\": {\"name\": \"My MCP Server\", \"protocol\": 754}, \"players\": {\"max\": 100, \"online\": 0}, \"description\": {\"text\": \"A custom MCP server\"}}"; ByteBuf responseData = ctx.alloc().buffer(); writeString(responseData, jsonResponse); // 创建数据包 Packet statusResponsePacket = new Packet(0x00, responseData); // 发送数据包 ctx.writeAndFlush(statusResponsePacket); } private void sendLoginSuccess(ChannelHandlerContext ctx, String username) { // 创建 Login Success 数据包 ByteBuf responseData = ctx.alloc().buffer(); writeString(responseData, "00000000-0000-0000-0000-000000000000"); // UUID (可以生成一个) writeString(responseData, username); // 创建数据包 Packet loginSuccessPacket = new Packet(0x02, responseData); // 发送数据包 ctx.writeAndFlush(loginSuccessPacket); } // 读取 VarInt private int readVarInt(ByteBuf in) { int numRead = 0; int result = 0; byte read; do { read = in.readByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new RuntimeException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } // 写入 VarInt private void writeVarInt(ByteBuf out, int value) { while (true) { if ((value & ~0x7F) == 0) { out.writeByte(value); return; } out.writeByte((value & 0x7F) | 0x80); value >>>= 7; } } // 读取字符串 private String readString(ByteBuf in) { int length = readVarInt(in); ByteBuf stringData = in.readBytes(length); return stringData.toString(java.nio.charset.StandardCharsets.UTF_8); } // 写入字符串 private void writeString(ByteBuf out, String value) { byte[] stringBytes = value.getBytes(java.nio.charset.StandardCharsets.UTF_8); writeVarInt(out, stringBytes.length); out.writeBytes(stringBytes); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } } // 数据包类 static class Packet { private final int id; private final ByteBuf data; public Packet(int id, ByteBuf data) { this.id = id; this.data = data; } public int getId() { return id; } public ByteBuf getData() { return data; } } } ``` **重要提示:** * **安全性:** 确保你的 REST API 是安全的,并且只允许授权的客户端访问。 使用身份验证和授权机制。 * **性能:** 优化你的代码以获得最佳性能。 使用缓存、连接池等技术。 * **可扩展性:** 设计你的服务器以支持大量的并发连接。 使用异步编程和非阻塞 I/O。 * **错误处理:** 实现完善的错误处理机制,以便在出现问题时能够快速诊断和修复。 * **协议版本:** 密切关注 Minecraft 协议的更新,并及时更新你的服务器以支持最新的协议版本。 * **代码组织:** 将你的代码组织成模块化的组件,以便于维护和扩展。 **下一步:** 1. **创建你的 REST API:** 如果你还没有 REST API,你需要创建一个。 你可以使用任何你喜欢的编程语言和框架。 2. **实现数据包处理逻辑:** 根据你的 REST API 的需求,实现数据包处理逻辑。 3. **测试你的服务器:** 使用 Minecraft 客户端连接到你的服务器并测试所有功能。 这是一个复杂的项目,需要对 Minecraft 协议和网络编程有深入的了解。 祝你成功!

XML Documents MCP Server by CData

XML Documents MCP Server by CData

XML Documents MCP Server by CData

Enrichment MCP Server

Enrichment MCP Server

A Model Context Protocol server that enables users to perform third-party enrichment lookups for security observables (IP addresses, domains, URLs, emails) through services like VirusTotal, Shodan, and others.

Remote MCP Server on Cloudflare

Remote MCP Server on Cloudflare

Rongcloud Native

Rongcloud Native

Native MCP Overview RongCloud Native MCP is a lightweight RongCloud IM service wrapper based on the MCP (Model Control Protocol) protocol. By directly wrapping the high-performance Rust IM SDK, it provides a simple and efficient instant messaging solution for client-side or local applications