Discover Awesome MCP Servers
Extend your agent with 16,348 capabilities via MCP servers.
- All16,348
- Developer Tools3,867
- Search1,714
- Research & Data1,557
- AI Integration Systems229
- Cloud Platforms219
- Data & App Analysis181
- Database Interaction177
- Remote Shell Execution165
- Browser Automation147
- Databases145
- Communication137
- AI Content Generation127
- OS Automation120
- Programming Docs Access109
- Content Fetching108
- Note Taking97
- File Systems96
- Version Control93
- Finance91
- Knowledge & Memory90
- Monitoring79
- Security71
- Image & Video Processing69
- Digital Note Management66
- AI Memory Systems62
- Advanced AI Reasoning59
- Git Management Tools58
- Cloud Storage51
- Entertainment & Media43
- Virtualization42
- Location Services35
- Web Automation & Stealth32
- Media Content Processing32
- Calendar Management26
- Ecommerce & Retail18
- Speech Processing18
- Customer Data Platforms16
- Travel & Transportation14
- Education & Learning Tools13
- Home Automation & IoT13
- Web Search Integration12
- Health & Wellness10
- Customer Support10
- Marketing9
- Games & Gamification8
- Google Cloud Integrations7
- Art & Culture4
- Language Translation3
- Legal & Compliance2
Simple MCP Server
好的,这是一个用极简代码演示如何构建一个 MCP (Mesh Configuration Protocol) 服务器的示例,使用 Python 和 gRPC: ```python # server.py import grpc from concurrent import futures import mcp_pb2 import mcp_pb2_grpc class McpService(mcp_pb2_grpc.AggregatedDiscoveryServiceServicer): def StreamAggregatedResources(self, request_iterator, context): for request in request_iterator: print(f"Received request: {request}") # 构造一个简单的响应 response = mcp_pb2.AggregatedDiscoveryResponse( version_info="v1", resources=[], type_url=request.type_url, nonce="nonce-123" ) yield response def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) mcp_pb2_grpc.add_AggregatedDiscoveryServiceServicer_to_server(McpService(), server) server.add_insecure_port('[::]:50051') server.start() print("MCP Server started on port 50051") server.wait_for_termination() if __name__ == '__main__': serve() ``` **代码解释:** 1. **导入必要的库:** * `grpc`: gRPC 库。 * `concurrent.futures`: 用于创建线程池。 * `mcp_pb2` 和 `mcp_pb2_grpc`: 从 MCP 的 protobuf 定义生成的 Python 代码。 你需要先安装 `protobuf` 和 `grpcio-tools`,然后使用 `protoc` 命令生成这些文件。 例如: ```bash pip install protobuf grpcio-tools # 假设你的 mcp.proto 文件在当前目录 python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. mcp.proto ``` 确保你的 `mcp.proto` 文件定义了 MCP 的服务和消息。 一个简化的 `mcp.proto` 示例: ```protobuf // mcp.proto syntax = "proto3"; package envoy.service.discovery.v3; service AggregatedDiscoveryService { rpc StreamAggregatedResources(stream AggregatedDiscoveryRequest) returns (stream AggregatedDiscoveryResponse) {} } message AggregatedDiscoveryRequest { string version_info = 1; repeated string resource_names = 2; string type_url = 3; string response_nonce = 4; string error_detail = 5; } message AggregatedDiscoveryResponse { string version_info = 1; repeated google.protobuf.Any resources = 2; string type_url = 3; string nonce = 4; } import "google/protobuf/any.proto"; ``` 2. **`McpService` 类:** * 继承自 `mcp_pb2_grpc.AggregatedDiscoveryServiceServicer`,这是 gRPC 生成的服务基类。 * 实现了 `StreamAggregatedResources` 方法,这是 MCP 服务定义的核心方法。 它是一个双向流 (stream),服务器接收来自客户端的请求流,并返回响应流。 * 在 `StreamAggregatedResources` 中,我们简单地打印接收到的请求,并构造一个简单的 `AggregatedDiscoveryResponse` 作为响应。 这个响应包含一个版本信息、一个空的资源列表、请求的类型 URL 和一个 nonce。 3. **`serve` 函数:** * 创建一个 gRPC 服务器,使用线程池来处理请求。 * 将 `McpService` 注册到服务器。 * 添加一个不安全的端口 `[::]:50051` 用于监听连接。 在生产环境中,你应该使用安全的 TLS 连接。 * 启动服务器并打印一条消息。 * 调用 `server.wait_for_termination()` 使服务器保持运行状态,直到手动停止。 4. **`if __name__ == '__main__':` 块:** * 确保 `serve` 函数只在脚本直接运行时才被调用,而不是作为模块导入时。 **如何运行:** 1. **安装依赖:** ```bash pip install grpcio protobuf grpcio-tools ``` 2. **生成 gRPC 代码:** * 将上面的 `mcp.proto` 文件保存到你的项目目录中。 * 运行以下命令生成 `mcp_pb2.py` 和 `mcp_pb2_grpc.py`: ```bash python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. mcp.proto ``` 3. **运行服务器:** ```bash python server.py ``` **重要说明:** * **极简示例:** 这个示例非常简单,只用于演示 MCP 服务器的基本结构。 它没有实现任何实际的配置分发逻辑。 * **错误处理:** 代码中没有包含任何错误处理。 在生产环境中,你需要添加适当的错误处理机制。 * **安全性:** 这个示例使用不安全的连接。 在生产环境中,你应该使用 TLS 加密来保护通信。 * **资源管理:** 这个示例没有管理任何实际的资源。 你需要根据你的具体需求来实现资源的管理和分发。 * **Protobuf 定义:** `mcp.proto` 文件需要根据你的实际需求进行定义。 上面的示例提供了一个最小化的定义,你需要根据你的配置类型和数据结构来扩展它。 * **客户端:** 你需要一个 MCP 客户端来向服务器发送请求。 客户端的实现取决于你使用的编程语言和框架。 这个示例提供了一个起点,你可以根据你的具体需求来构建一个功能完善的 MCP 服务器。 记住要仔细阅读 MCP 规范,并根据你的应用场景进行适当的调整。 **中文翻译:** 好的,这是一个用极简代码演示如何构建一个 MCP (Mesh Configuration Protocol) 服务器的示例,使用 Python 和 gRPC: ```python # server.py import grpc from concurrent import futures import mcp_pb2 import mcp_pb2_grpc class McpService(mcp_pb2_grpc.AggregatedDiscoveryServiceServicer): def StreamAggregatedResources(self, request_iterator, context): for request in request_iterator: print(f"Received request: {request}") # 构造一个简单的响应 response = mcp_pb2.AggregatedDiscoveryResponse( version_info="v1", resources=[], type_url=request.type_url, nonce="nonce-123" ) yield response def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) mcp_pb2_grpc.add_AggregatedDiscoveryServiceServicer_to_server(McpService(), server) server.add_insecure_port('[::]:50051') server.start() print("MCP Server started on port 50051") server.wait_for_termination() if __name__ == '__main__': serve() ``` **代码解释:** 1. **导入必要的库:** * `grpc`: gRPC 库。 * `concurrent.futures`: 用于创建线程池。 * `mcp_pb2` 和 `mcp_pb2_grpc`: 从 MCP 的 protobuf 定义生成的 Python 代码。 你需要先安装 `protobuf` 和 `grpcio-tools`,然后使用 `protoc` 命令生成这些文件。 例如: ```bash pip install protobuf grpcio-tools # 假设你的 mcp.proto 文件在当前目录 python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. mcp.proto ``` 确保你的 `mcp.proto` 文件定义了 MCP 的服务和消息。 一个简化的 `mcp.proto` 示例: ```protobuf // mcp.proto syntax = "proto3"; package envoy.service.discovery.v3; service AggregatedDiscoveryService { rpc StreamAggregatedResources(stream AggregatedDiscoveryRequest) returns (stream AggregatedDiscoveryResponse) {} } message AggregatedDiscoveryRequest { string version_info = 1; repeated string resource_names = 2; string type_url = 3; string response_nonce = 4; string error_detail = 5; } message AggregatedDiscoveryResponse { string version_info = 1; repeated google.protobuf.Any resources = 2; string type_url = 3; string nonce = 4; } import "google/protobuf/any.proto"; ``` 2. **`McpService` 类:** * 继承自 `mcp_pb2_grpc.AggregatedDiscoveryServiceServicer`,这是 gRPC 生成的服务基类。 * 实现了 `StreamAggregatedResources` 方法,这是 MCP 服务定义的核心方法。 它是一个双向流 (stream),服务器接收来自客户端的请求流,并返回响应流。 * 在 `StreamAggregatedResources` 中,我们简单地打印接收到的请求,并构造一个简单的 `AggregatedDiscoveryResponse` 作为响应。 这个响应包含一个版本信息、一个空的资源列表、请求的类型 URL 和一个 nonce。 3. **`serve` 函数:** * 创建一个 gRPC 服务器,使用线程池来处理请求。 * 将 `McpService` 注册到服务器。 * 添加一个不安全的端口 `[::]:50051` 用于监听连接。 在生产环境中,你应该使用安全的 TLS 连接。 * 启动服务器并打印一条消息。 * 调用 `server.wait_for_termination()` 使服务器保持运行状态,直到手动停止。 4. **`if __name__ == '__main__':` 块:** * 确保 `serve` 函数只在脚本直接运行时才被调用,而不是作为模块导入时。 **如何运行:** 1. **安装依赖:** ```bash pip install grpcio protobuf grpcio-tools ``` 2. **生成 gRPC 代码:** * 将上面的 `mcp.proto` 文件保存到你的项目目录中。 * 运行以下命令生成 `mcp_pb2.py` 和 `mcp_pb2_grpc.py`: ```bash python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. mcp.proto ``` 3. **运行服务器:** ```bash python server.py ``` **重要说明:** * **极简示例:** 这个示例非常简单,只用于演示 MCP 服务器的基本结构。 它没有实现任何实际的配置分发逻辑。 * **错误处理:** 代码中没有包含任何错误处理。 在生产环境中,你需要添加适当的错误处理机制。 * **安全性:** 这个示例使用不安全的连接。 在生产环境中,你应该使用 TLS 加密来保护通信。 * **资源管理:** 这个示例没有管理任何实际的资源。 你需要根据你的具体需求来实现资源的管理和分发。 * **Protobuf 定义:** `mcp.proto` 文件需要根据你的实际需求进行定义。 上面的示例提供了一个最小化的定义,你需要根据你的配置类型和数据结构来扩展它。 * **客户端:** 你需要一个 MCP 客户端来向服务器发送请求。 客户端的实现取决于你使用的编程语言和框架。 这个示例提供了一个起点,你可以根据你的具体需求来构建一个功能完善的 MCP 服务器。 记住要仔细阅读 MCP 规范,并根据你的应用场景进行适当的调整。 **总结:** 这段代码提供了一个非常基础的 MCP 服务器框架。 你需要根据你的实际需求扩展 `McpService` 类,实现资源的管理、版本控制、错误处理和安全性。 同时,你需要定义合适的 `mcp.proto` 文件来描述你的配置数据结构。 最后,你需要一个 MCP 客户端来与服务器进行通信,请求和接收配置信息。
octodet-elasticsearch-mcp
Read/write Elasticsearch mcp server with many tools
Confluence MCP Server by CData
Confluence MCP Server by CData
Ureanl-Blender-MCP
Unreal-Blender MCP 是一个统一的服务器,它使用 MCP(机器控制协议)方法,通过 AI 代理来控制 Blender 和 Unreal Engine。
AnyCrawl MCP Server
Enables web scraping and crawling capabilities for LLM clients, supporting single-page scraping, multi-page website crawling, and web search with multiple engines (Playwright, Cheerio, Puppeteer) and flexible output formats including markdown, HTML, text, and screenshots.
RedNote MCP
A server that enables access to Xiaohongshu (Little Red Book) content, allowing users to search for notes and retrieve content via URLs with authentication management and cookie persistence.
Foundry MCP Server
一个为 Solidity 开发者打造的 Foundry 实验性 MCP 服务器
Adjust Reporting Server
一个 MCP 服务器,可以与 Adjust API 交互,允许你使用来自任何 MCP 客户端(如 Cursor 或 Claude Desktop)的自然语言查询移动分析报告、指标和性能数据。
Model Context Protocol .NET Samples
好的,这是关于使用 .NET 创建和使用 MCP 服务器和客户端的综合示例集: **概述** MCP (Minecraft Protocol) 是 Minecraft 客户端和服务器之间用于通信的协议。 使用 .NET,你可以创建自定义的 MCP 服务器和客户端,以实现各种目的,例如: * **机器人:** 自动执行游戏中的任务。 * **代理:** 修改客户端和服务器之间的流量。 * **服务器插件:** 扩展服务器的功能。 * **自定义客户端:** 创建具有自定义功能的 Minecraft 客户端。 **示例集** 以下示例将涵盖创建和使用 MCP 服务器和客户端的关键方面。 这些示例使用 C# 和一些流行的 .NET 库,例如: * **`System.Net.Sockets`:** 用于网络通信的基础类。 * **`BinaryReader` 和 `BinaryWriter`:** 用于读取和写入二进制数据。 * **`NbtCompound` (来自 `fNbt` 或类似库):** 用于处理 NBT (Named Binary Tag) 数据,Minecraft 使用它来存储世界数据和实体数据。 * **`ZlibStream` (来自 `Ionic.Zlib` 或类似库):** 用于处理数据压缩。 **重要提示:** MCP 协议非常复杂,并且会随着 Minecraft 版本的更新而变化。 这些示例旨在提供一个起点,你需要根据你使用的 Minecraft 版本调整代码。 强烈建议参考官方 Minecraft 协议文档和社区资源。 **1. 建立连接 (客户端)** ```csharp using System; using System.Net.Sockets; using System.IO; public class MinecraftClient { private string _serverAddress; private int _serverPort; private TcpClient _client; private NetworkStream _stream; private BinaryReader _reader; private BinaryWriter _writer; public MinecraftClient(string serverAddress, int serverPort) { _serverAddress = serverAddress; _serverPort = serverPort; } public void Connect() { try { _client = new TcpClient(_serverAddress, _serverPort); _stream = _client.GetStream(); _reader = new BinaryReader(_stream); _writer = new BinaryWriter(_stream); Console.WriteLine("Connected to server!"); } catch (Exception ex) { Console.WriteLine($"Error connecting: {ex.Message}"); } } public void Disconnect() { if (_client != null && _client.Connected) { _reader.Close(); _writer.Close(); _stream.Close(); _client.Close(); Console.WriteLine("Disconnected from server."); } } // 示例:发送握手数据包 public void SendHandshake(int protocolVersion, string serverAddress, int serverPort, int nextState) { // 构建握手数据包 using (MemoryStream packetData = new MemoryStream()) using (BinaryWriter packetWriter = new BinaryWriter(packetData)) { // Packet ID (0x00) packetWriter.Write((byte)0x00); // Protocol Version (VarInt) WriteVarInt(packetWriter, protocolVersion); // Server Address (String) WriteString(packetWriter, serverAddress); // Server Port (Unsigned Short) packetWriter.Write((ushort)serverPort); // Next State (VarInt) WriteVarInt(packetWriter, nextState); // 获取数据包内容 byte[] packetBytes = packetData.ToArray(); // 发送数据包长度 (VarInt) WriteVarInt(_writer, packetBytes.Length); // 发送数据包内容 _writer.Write(packetBytes); _writer.Flush(); } } // 示例:发送请求数据包 (用于获取服务器状态) public void SendRequest() { // 构建请求数据包 using (MemoryStream packetData = new MemoryStream()) using (BinaryWriter packetWriter = new BinaryWriter(packetData)) { // Packet ID (0x00) packetWriter.Write((byte)0x00); // 获取数据包内容 byte[] packetBytes = packetData.ToArray(); // 发送数据包长度 (VarInt) WriteVarInt(_writer, packetBytes.Length); // 发送数据包内容 _writer.Write(packetBytes); _writer.Flush(); } } // 示例:读取响应数据包 (用于获取服务器状态) public string ReadResponse() { // 读取数据包长度 (VarInt) int packetLength = ReadVarInt(_reader); // 读取数据包内容 byte[] packetBytes = _reader.ReadBytes(packetLength); using (MemoryStream packetData = new MemoryStream(packetBytes)) using (BinaryReader packetReader = new BinaryReader(packetData)) { // 读取 Packet ID byte packetId = packetReader.ReadByte(); if (packetId == 0x00) { // 读取 JSON 响应 string jsonResponse = ReadString(packetReader); return jsonResponse; } else { Console.WriteLine($"Unexpected packet ID: 0x{packetId:X2}"); return null; } } } // Helper functions for reading and writing VarInts and Strings private void WriteVarInt(BinaryWriter writer, int value) { while (true) { if ((value & ~0x7F) == 0) { writer.Write((byte)value); return; } writer.Write((byte)((value & 0x7F) | 0x80)); value >>= 7; } } private int ReadVarInt(BinaryReader reader) { int numRead = 0; int result = 0; byte read; do { read = reader.ReadByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new InvalidOperationException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } private void WriteString(BinaryWriter writer, string value) { byte[] stringBytes = System.Text.Encoding.UTF8.GetBytes(value); WriteVarInt(writer, stringBytes.Length); writer.Write(stringBytes); } private string ReadString(BinaryReader reader) { int length = ReadVarInt(reader); byte[] stringBytes = reader.ReadBytes(length); return System.Text.Encoding.UTF8.GetString(stringBytes); } public static void Main(string[] args) { MinecraftClient client = new MinecraftClient("localhost", 25565); // 替换为你的服务器地址和端口 client.Connect(); // 获取服务器状态 client.SendHandshake(763, "localhost", 25565, 1); // 763 是 1.17.1 的协议版本,根据你的 Minecraft 版本调整 client.SendRequest(); string response = client.ReadResponse(); if (response != null) { Console.WriteLine($"Server Status: {response}"); } client.Disconnect(); } } ``` **2. 建立连接 (服务器)** ```csharp using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; public class MinecraftServer { private TcpListener _listener; private bool _isRunning; public MinecraftServer(int port) { _listener = new TcpListener(IPAddress.Any, port); } public void Start() { _listener.Start(); _isRunning = true; Console.WriteLine("Server started. Listening for connections..."); while (_isRunning) { try { TcpClient client = _listener.AcceptTcpClient(); Console.WriteLine("Client connected."); // 为每个客户端创建一个新线程 Thread clientThread = new Thread(() => HandleClient(client)); clientThread.Start(); } catch (SocketException ex) { Console.WriteLine($"SocketException: {ex.Message}"); Stop(); } } } public void Stop() { _isRunning = false; _listener.Stop(); Console.WriteLine("Server stopped."); } private void HandleClient(TcpClient client) { using (NetworkStream stream = client.GetStream()) using (BinaryReader reader = new BinaryReader(stream)) using (BinaryWriter writer = new BinaryWriter(stream)) { try { // 处理客户端连接 while (client.Connected) { if (stream.DataAvailable) { // 读取数据包长度 int packetLength = ReadVarInt(reader); // 读取数据包内容 byte[] packetBytes = reader.ReadBytes(packetLength); // 处理数据包 ProcessPacket(packetBytes, writer); } else { // 如果没有数据,则短暂休眠以避免 CPU 占用 Thread.Sleep(10); } } } catch (IOException ex) { Console.WriteLine($"IOException: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Exception: {ex.Message}"); } finally { Console.WriteLine("Client disconnected."); client.Close(); } } } private void ProcessPacket(byte[] packetBytes, BinaryWriter writer) { using (MemoryStream packetData = new MemoryStream(packetBytes)) using (BinaryReader packetReader = new BinaryReader(packetData)) { // 读取 Packet ID byte packetId = packetReader.ReadByte(); switch (packetId) { case 0x00: // Handshake HandleHandshake(packetReader, writer); break; // 其他数据包处理逻辑 default: Console.WriteLine($"Unknown packet ID: 0x{packetId:X2}"); break; } } } private void HandleHandshake(BinaryReader reader, BinaryWriter writer) { // 读取协议版本 int protocolVersion = ReadVarInt(reader); // 读取服务器地址 string serverAddress = ReadString(reader); // 读取服务器端口 ushort serverPort = reader.ReadUInt16(); // 读取下一个状态 int nextState = ReadVarInt(reader); Console.WriteLine($"Handshake received: Protocol Version = {protocolVersion}, Server Address = {serverAddress}, Server Port = {serverPort}, Next State = {nextState}"); // 根据下一个状态执行不同的操作 switch (nextState) { case 1: // Status SendStatusResponse(writer); break; case 2: // Login // TODO: 处理登录 break; default: Console.WriteLine($"Unknown next state: {nextState}"); break; } } private void SendStatusResponse(BinaryWriter writer) { // 构建服务器状态 JSON string jsonResponse = @"{ ""version"": { ""name"": ""1.17.1"", ""protocol"": 763 }, ""players"": { ""max"": 100, ""online"": 0, ""sample"": [] }, ""description"": { ""text"": ""A Minecraft Server"" } }"; // 构建响应数据包 using (MemoryStream packetData = new MemoryStream()) using (BinaryWriter packetWriter = new BinaryWriter(packetData)) { // Packet ID (0x00) packetWriter.Write((byte)0x00); // JSON 响应 (String) WriteString(packetWriter, jsonResponse); // 获取数据包内容 byte[] packetBytes = packetData.ToArray(); // 发送数据包长度 (VarInt) WriteVarInt(writer, packetBytes.Length); // 发送数据包内容 writer.Write(packetBytes); writer.Flush(); } } // Helper functions for reading and writing VarInts and Strings private int ReadVarInt(BinaryReader reader) { int numRead = 0; int result = 0; byte read; do { read = reader.ReadByte(); int value = (read & 0x7f); result |= (value << (7 * numRead)); numRead++; if (numRead > 5) { throw new InvalidOperationException("VarInt is too big"); } } while ((read & 0x80) != 0); return result; } private void WriteVarInt(BinaryWriter writer, int value) { while (true) { if ((value & ~0x7F) == 0) { writer.Write((byte)value); return; } writer.Write((byte)((value & 0x7F) | 0x80)); value >>= 7; } } private string ReadString(BinaryReader reader) { int length = ReadVarInt(reader); byte[] stringBytes = reader.ReadBytes(length); return System.Text.Encoding.UTF8.GetString(stringBytes); } private void WriteString(BinaryWriter writer, string value) { byte[] stringBytes = System.Text.Encoding.UTF8.GetBytes(value); WriteVarInt(writer, stringBytes.Length); writer.Write(stringBytes); } public static void Main(string[] args) { MinecraftServer server = new MinecraftServer(25565); // 替换为你想要的端口 server.Start(); } } ``` **3. 处理数据包** MCP 协议定义了许多不同类型的数据包,每个数据包都有特定的 ID 和结构。 你需要根据你想要实现的功能来处理这些数据包。 * **客户端到服务器:** * **握手 (Handshake):** 客户端连接时发送的第一个数据包,用于协商协议版本和指定下一个状态(状态或登录)。 * **登录 (Login):** 用于验证客户端身份。 * **聊天消息 (ChatMessage):** 客户端发送的聊天消息。 * **命令 (Command):** 客户端执行的命令。 * **移动 (Movement):** 客户端的位置和方向。 * **挖掘 (Digging):** 客户端挖掘方块的动作。 * **放置 (Placement):** 客户端放置方块的动作。 * **服务器到客户端:** * **状态响应 (Status Response):** 服务器发送的服务器状态信息。 * **登录成功 (Login Success):** 服务器验证客户端身份后发送。 * **聊天消息 (ChatMessage):** 服务器发送的聊天消息。 * **游戏状态 (GameState):** 服务器发送的游戏状态信息。 * **实体更新 (Entity Update):** 服务器发送的实体位置和属性更新。 * **方块更新 (Block Update):** 服务器发送的方块更新。 * **区块数据 (Chunk Data):** 服务器发送的区块数据。 **示例:处理聊天消息 (服务器)** ```csharp // 在 ProcessPacket 方法中添加以下代码 case 0x03: // Chat Message (客户端 -> 服务器) HandleChatMessage(packetReader, writer); break; // 新的 HandleChatMessage 方法 private void HandleChatMessage(BinaryReader reader, BinaryWriter writer) { string message = ReadString(reader); Console.WriteLine($"Received chat message: {message}"); // 示例:将消息广播给所有连接的客户端 BroadcastChatMessage(message); } // 广播聊天消息 private void BroadcastChatMessage(string message) { // 构建聊天消息数据包 (服务器 -> 客户端) using (MemoryStream packetData = new MemoryStream()) using (BinaryWriter packetWriter = new BinaryWriter(packetData)) { // Packet ID (0x0E for 1.17.1) packetWriter.Write((byte)0x0E); // Message (JSON format) string jsonMessage = $"{{\"text\":\"{message}\"}}"; WriteString(packetWriter, jsonMessage); // Position (0: chat box, 1: system message, 2: above hotbar) packetWriter.Write((byte)0); // Sender UUID (all zeros for now) for (int i = 0; i < 16; i++) { packetWriter.Write((byte)0); } // 获取数据包内容 byte[] packetBytes = packetData.ToArray(); // 发送数据包长度 (VarInt) WriteVarInt(writer, packetBytes.Length); // 发送数据包内容 writer.Write(packetBytes); writer.Flush(); } } ``` **4. 处理 NBT 数据** Minecraft 使用 NBT (Named Binary Tag) 格式来存储世界数据、实体数据和物品数据。 你需要一个 NBT 库来读取和写入 NBT 数据。 `fNbt` 是一个流行的选择。 **示例:读取区块数据 (服务器)** ```csharp // 需要安装 fNbt NuGet 包 using fNbt; // 在 ProcessPacket 方法中添加以下代码 case 0x22: // Chunk Data (服务器 -> 客户端) HandleChunkData(packetReader, writer); break; // 新的 HandleChunkData 方法 private void HandleChunkData(BinaryReader reader, BinaryWriter writer) { // 读取区块坐标 int chunkX = reader.ReadInt32(); int chunkZ = reader.ReadInt32(); // 读取 Primary Bit Mask int primaryBitMask = ReadVarInt(reader); // 读取 NBT 数据长度 int nbtLength = reader.ReadInt32(); // 读取 NBT 数据 byte[] nbtData = reader.ReadBytes(nbtLength); // 使用 Zlib 解压缩 NBT 数据 using (MemoryStream compressedStream = new MemoryStream(nbtData)) using (Ionic.Zlib.ZlibStream decompressedStream = new Ionic.Zlib.ZlibStream(compressedStream, Ionic.Zlib.CompressionMode.Decompress)) { // 从解压缩的流中读取 NBT 数据 NbtCompound rootTag = NbtCompound.ReadFrom(decompressedStream); // 处理 NBT 数据 Console.WriteLine($"Chunk Data received: X = {chunkX}, Z = {chunkZ}, Root Tag = {rootTag.Name}"); // 示例:遍历区块中的所有实体 if (rootTag.Contains("Entities")) { NbtList entities = rootTag["Entities"] as NbtList; if (entities != null) { foreach (NbtCompound entity in entities.OfType<NbtCompound>()) { // 获取实体类型 string entityType = entity["id"].AsString(); Console.WriteLine($" Entity: {entityType}"); } } } } } ``` **5. 数据压缩** Minecraft 使用 Zlib 压缩来减少网络流量。 你需要一个 Zlib 库来压缩和解压缩数据。 `Ionic.Zlib` 是一个流行的选择。 **示例:压缩数据 (服务器)** ```csharp // 需要安装 Ionic.Zlib NuGet 包 using Ionic.Zlib; // 压缩数据 private byte[] CompressData(byte[] data) { using (MemoryStream compressedStream = new MemoryStream()) using (ZlibStream compressionStream = new ZlibStream(compressedStream, CompressionMode.Compress, CompressionLevel.BestCompression)) { compressionStream.Write(data, 0, data.Length); compressionStream.Close(); return compressedStream.ToArray(); } } // 解压缩数据 private byte[] DecompressData(byte[] data) { using (MemoryStream compressedStream = new MemoryStream(data)) using (ZlibStream decompressionStream = new ZlibStream(compressedStream, CompressionMode.Decompress)) using (MemoryStream decompressedStream = new MemoryStream()) { decompressionStream.CopyTo(decompressedStream); return decompressedStream.ToArray(); } } ``` **关键点和注意事项** * **协议版本:** 确保你使用的协议版本与你的 Minecraft 版本匹配。 协议版本会随着 Minecraft 的更新而变化。 * **VarInt:** Minecraft 使用 VarInt (Variable-length Integer) 来表示长度和其他值。 你需要正确地读取和写入 VarInt。 * **字符串:** Minecraft 使用 UTF-8 编码的字符串,并使用 VarInt 来表示字符串的长度。 * **NBT 数据:** 使用 NBT 库来处理 NBT 数据。 * **数据压缩:** 使用 Zlib 库来压缩和解压缩数据。 * **线程:** 在服务器端,为每个客户端创建一个新线程,以避免阻塞主线程。 * **错误处理:** 添加适当的错误处理,以处理网络错误和其他异常。 * **安全性:** 注意安全性,特别是处理登录和身份验证时。 * **异步操作:** 考虑使用异步操作来提高性能,特别是处理网络 I/O 时。 * **资源管理:** 确保正确地释放所有资源,例如流和套接字。 **进一步学习** * **Minecraft 协议文档:** [https://wiki.vg/Protocol](https://wiki.vg/Protocol) (这是最重要的资源) * **fNbt 库:** [https://github.com/fragmer/fNbt](https://github.com/fragmer/fNbt) * **Ionic.Zlib 库:** [https://github.com/rbradley/Ionic.Zlib](https://github.com/rbradley/Ionic.Zlib) * **Minecraft 社区论坛和 Wiki:** 搜索 "Minecraft protocol" 和 "Minecraft API" 可以找到很多有用的信息和示例。 **总结** 这些示例提供了一个使用 .NET 创建和使用 MCP 服务器和客户端的起点。 你需要根据你想要实现的功能来扩展这些示例。 记住,MCP 协议非常复杂,并且会随着 Minecraft 版本的更新而变化。 请务必参考官方 Minecraft 协议文档和社区资源。 **中文翻译:** 好的,这里是一份关于使用 .NET 创建和使用 MCP 服务器和客户端的综合示例集: **概述** MCP (Minecraft 协议) 是 Minecraft 客户端和服务器之间用于通信的协议。 使用 .NET,你可以创建自定义的 MCP 服务器和客户端,以实现各种目的,例如: * **机器人:** 自动执行游戏中的任务。 * **代理:** 修改客户端和服务器之间的流量。 * **服务器插件:** 扩展服务器的功能。 * **自定义客户端:** 创建具有自定义功能的 Minecraft 客户端。 **示例集** 以下示例将涵盖创建和使用 MCP 服务器和客户端的关键方面。 这些示例使用 C# 和一些流行的 .NET 库,例如: * **`System.Net.Sockets`:** 用于网络通信的基础类。 * **`BinaryReader` 和 `BinaryWriter`:** 用于读取和写入二进制数据。 * **`NbtCompound` (来自 `fNbt` 或类似库):** 用于处理 NBT (命名二进制标签) 数据,Minecraft 使用它来存储世界数据和实体数据。 * **`ZlibStream` (来自 `Ionic.Zlib` 或类似库):** 用于处理数据压缩。 **重要提示:** MCP 协议非常复杂,并且会随着 Minecraft 版本的更新而变化。 这些示例旨在提供一个起点,你需要根据你使用的 Minecraft 版本调整代码。 强烈建议参考官方 Minecraft 协议文档和社区资源。 **(以下代码示例的中文翻译,由于篇幅限制,只翻译关键部分,并保留代码中的英文注释)** **1. 建立连接 (客户端)** ```csharp // ... (省略代码) // 示例:发送握手数据包 public void SendHandshake(int protocolVersion, string serverAddress, int serverPort, int nextState) { // 构建握手数据包 // ... (省略代码) } // 示例:发送请求数据包 (用于获取服务器状态) public void SendRequest() { // 构建请求数据包 // ... (省略代码) } // 示例:读取响应数据包 (用于获取服务器状态) public string ReadResponse() { // 读取数据包长度 (VarInt) // ... (省略代码) } // Helper functions for reading and writing VarInts and Strings // 辅助函数,用于读取和写入 VarInt 和字符串 // ... (省略代码) public static void Main(string[] args) { MinecraftClient client = new MinecraftClient("localhost", 25565); // 替换为你的服务器地址和端口 client.Connect(); // 获取服务器状态 // ... (省略代码) client.Disconnect(); } } ``` **2. 建立连接 (服务器)** ```csharp // ... (省略代码) private void HandleClient(TcpClient client) { // ... (省略代码) } private void ProcessPacket(byte[] packetBytes, BinaryWriter writer) { // ... (省略代码) } private void HandleHandshake(BinaryReader reader, BinaryWriter writer) { // ... (省略代码) } private void SendStatusResponse(BinaryWriter writer) { // ... (省略代码) } // Helper functions for reading and writing VarInts and Strings // 辅助函数,用于读取和写入 VarInt 和字符串 // ... (省略代码) public static void Main(string[] args) { MinecraftServer server = new MinecraftServer(25565); // 替换为你想要的端口 server.Start(); } } ``` **3. 处理数据包** MCP 协议定义了许多不同类型的数据包,每个数据包都有特定的 ID 和结构。 你需要根据你想要实现的功能来处理这些数据包。 * **客户端到服务器:** * **握手 (Handshake):** 客户端连接时发送的第一个数据包,用于协商协议版本和指定下一个状态(状态或登录)。 * **登录 (Login):** 用于验证客户端身份。 * **聊天消息 (ChatMessage):** 客户端发送的聊天消息。 * **命令 (Command):** 客户端执行的命令。 * **移动 (Movement):** 客户端的位置和方向。 * **挖掘 (Digging):** 客户端挖掘方块的动作。 * **放置 (Placement):** 客户端放置方块的动作。 * **服务器到客户端:** * **状态响应 (Status Response):** 服务器发送的服务器状态信息。 * **登录成功 (Login Success):** 服务器验证客户端身份后发送。 * **聊天消息 (ChatMessage):** 服务器发送的聊天消息。 * **游戏状态 (GameState):** 服务器发送的游戏状态信息。 * **实体更新 (Entity Update):** 服务器发送的实体位置和属性更新。 * **方块更新 (Block Update):** 服务器发送的方块更新。 * **区块数据 (Chunk Data):** 服务器发送的区块数据。 **示例:处理聊天消息 (服务器)** ```csharp // ... (省略代码) ``` **4. 处理 NBT 数据** Minecraft 使用 NBT (命名二进制标签) 格式来存储世界数据、实体数据和物品数据。 你需要一个 NBT 库来读取和写入 NBT 数据。 `fNbt` 是一个流行的选择。 **示例:读取区块数据 (服务器)** ```csharp // ... (省略代码) ``` **5. 数据压缩** Minecraft 使用 Zlib 压缩来减少网络流量。 你需要一个 Zlib 库来压缩和解压缩数据。 `Ionic.Zlib` 是一个流行的选择。 **示例:压缩数据 (服务器)** ```csharp // ... (省略代码) ``` **关键点和注意事项** * **协议版本:** 确保你使用的协议版本与你的 Minecraft 版本匹配。 协议版本会随着 Minecraft 的更新而变化。 * **VarInt:** Minecraft 使用 VarInt (可变长度整数) 来表示长度和其他值。 你需要正确地读取和写入 VarInt。 * **字符串:** Minecraft 使用 UTF-8 编码的字符串,并使用 VarInt 来表示字符串的长度。 * **NBT 数据:** 使用 NBT 库来处理 NBT 数据。 * **数据压缩:** 使用 Zlib 库来压缩和解压缩数据。 * **线程:** 在服务器端,为每个客户端创建一个新线程,以避免阻塞主线程。 * **错误处理:** 添加适当的错误处理,以处理网络错误和其他异常。 * **安全性:** 注意安全性,特别是处理登录和身份验证时。 * **异步操作:** 考虑使用异步操作来提高性能,特别是处理网络 I/O 时。 * **资源管理:** 确保正确地释放所有资源,例如流和套接字。 **进一步学习** * **Minecraft 协议文档:** [https://wiki.vg/Protocol](https://wiki.vg/Protocol) (这是最重要的资源) * **fNbt 库:** [https://github.com/fragmer/fNbt](https://github.com/fragmer/fNbt) * **Ionic.Zlib 库:** [https://github.com/rbradley/Ionic.Zlib](https://github.com/rbradley/Ionic.Zlib) * **Minecraft 社区论坛和 Wiki:** 搜索 "Minecraft protocol" 和 "Minecraft API" 可以找到很多有用的信息和示例。 **总结** 这些示例提供了一个使用 .NET 创建和使用 MCP 服务器和客户端的起点。 你需要根据你想要实现的功能来扩展这些示例。 记住,MCP 协议非常复杂,并且会随着 Minecraft 版本的更新而变化。 请务必参考官方 Minecraft 协议文档和社区资源。 **重要提示:** 由于代码量巨大,我只翻译了关键部分和注释。 你需要仔细阅读英文代码,并结合 Minecraft 协议文档进行理解和修改。 祝你成功!
SAP HANA MCP Server by CData
SAP HANA MCP Server by CData
Weather MCP Server
Provides weather information through OpenWeather API, enabling users to get current weather conditions, 5-day forecasts, and perform temperature conversions for any city. Offers a secure interface for AI assistants to access comprehensive weather data including temperature, humidity, wind, and pressure information.
Tox Testing MCP Server
一个 MCP 服务器,它执行 tox 命令来运行项目中的 Python 测试(使用 pytest),允许用户运行所有测试或特定的测试组、文件、用例或目录。 **Explanation of terms:** * **MCP Server:** MCP likely refers to a specific type of server or system within a particular context. Without more context, it's difficult to provide a more precise translation. It could stand for "Management Control Panel" or something similar. I've left it as "MCP" in the translation. * **tox:** A generic test automation tool. * **pytest:** A popular Python testing framework. * **Test groups:** Refers to logical groupings of tests, often defined in `tox.ini` or similar configuration files. * **Test files:** Python files containing test functions or classes. * **Test cases:** Individual test functions or methods within a test class. * **Directories:** Folders containing test files.
uuid-mcp-server
Rendi MCP Server
Enables cloud-based FFmpeg video and audio processing through the Rendi API, allowing AI assistants to convert, edit, and manipulate media files without local FFmpeg installation.
ToolHive - making MCP servers easy and secure
轻松安全地运行和管理 MCP 服务器
VS Code Debugger MCP Server
A bridge that enables AI assistants to connect to VS Code's debugger, allowing them to interact with and control debugging sessions through websocket connections.
CSV File MCP Server by CData
CSV File MCP Server by CData
FastAPI MCP Server
A high-performance Model Context Protocol (MCP) server designed for large language models, enabling real-time communication between AI models and applications with support for session management and intelligent tool registration.
Tapp Exchange MCP Server
Enables AI agents to interact with Tapp Exchange, a decentralized exchange on Aptos blockchain. Supports pool management, trading operations across AMM/CLMM/Stable pools, liquidity provision, and position tracking through natural language.
MCP Server
A remote Model Context Protocol server that enables AI assistants to interact with external services through standardized JSON-RPC, providing tools for basic operations and conversation archiving.
arXiv MCP Server
Enables searching, downloading, and managing academic papers from arXiv.org through natural language interactions. Provides tools for paper discovery, PDF downloads, and local paper collection management.
GitLab MCP Server
A TypeScript MCP server that provides integration with GitLab's REST API, allowing users to interact with GitLab projects, issues, merge requests, pipelines, and more through natural language.
FHIR MCP Server
Enables seamless integration with FHIR APIs for healthcare applications, allowing users to search, retrieve, create, update, and analyze clinical information through natural language interactions. Supports SMART-on-FHIR authentication and works with various healthcare systems like EPIC and HAPI FHIR servers.
awesome-ads-mcp-servers
Awesome AdsMCP 服务器 - 通过 Anthropic 的模型上下文协议标准化广告 API。
Integration App Server
这个 MCP 服务器实现允许用户通过模型上下文协议,从他们的集成应用工作区管理和暴露操作作为工具。
mcp-server-playwright
MCP Spec Generator
Generates project specifications and file structures using Claude AI through MCP integration. Enables users to describe project ideas and automatically create corresponding documentation and project files.
Poker Task Management MCP
Enables AI assistants to manage tasks through YAML-based storage with subtask suggestions, status updates, and Mermaid Gantt chart generation. Supports hierarchical task structures with attributes like dependencies, milestones, and parallel execution.
Notion Prompts MCP Server
POEditor MCP Server
Enables interaction with POEditor's translation management API to create terms, add translations, and manage multilingual content. Supports operations like adding translations, updating existing ones, and listing terms and languages for translation projects.