Model Context Protocol .NET Samples

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 协议文档进行理解和修改。 祝你成功!

microsoft

开发者工具
访问服务器

README

Model Context Protocol .NET 示例

Azure AI Community Discord

🚀 简介

欢迎来到 Model Context Protocol (MCP) .NET 示例仓库! 这组示例演示了如何在 .NET 应用程序中利用 Model Context Protocol。

MCP 是一个开放协议,它标准化了应用程序如何向大型语言模型 (LLM) 提供上下文。 将 MCP 视为 AI 应用程序的 USB-C 端口 - 它提供了一种标准化的方式,将 AI 模型连接到不同的数据源和工具。

使用 MCP,您可以:

  • 利用 LLM 可以直接插入的预构建集成
  • 灵活地在 LLM 提供商和供应商之间切换
  • 遵循最佳实践,以确保您的数据在您的基础设施中的安全
  • 在 LLM 之上构建代理和复杂的工作流程

此仓库包含 .NET 示例,范围从构建您自己的 MCP 实现到与 Azure 服务集成。

📋 示例项目

示例名称 描述
Azure 容器应用上的 YouTube 字幕提取器 一个远程 MCP 服务器,托管在 Azure 容器应用 上,可以从任何给定的 YouTube 视频的 URL 中提取字幕。
Azure Functions 上的 YouTube 字幕提取器 一个远程 MCP 服务器,托管在 Azure Functions 上,可以从任何给定的 YouTube 视频的 URL 中提取字幕。

🛠️ 入门

有关如何设置和运行示例的详细信息将在每个示例的目录中提供。

📚 学习资源

🚶‍♀️ 下一步

贡献

欢迎提出贡献和建议。 大多数贡献都要求您同意 贡献者许可协议 (CLA),声明您有权并且确实授予我们 使用您的贡献的权利。 有关详细信息,请访问 https://cla.opensource.microsoft.com。

当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地修饰 PR(例如,状态检查、评论)。 只需按照说明进行操作 由机器人提供。 您只需在使用我们的 CLA 的所有存储库中执行此操作一次。

本项目已采用 Microsoft Open Source Code of Conduct。 有关更多信息,请参见 Code of Conduct FAQ 或 通过 opencode@microsoft.com 联系我们,提出任何其他问题或意见。

商标

本项目可能包含项目、产品或服务的商标或徽标。 授权使用 Microsoft 商标或徽标必须遵守并遵循 Microsoft 的商标和品牌指南。 在本项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 的赞助。 任何使用第三方商标或徽标均受这些第三方的政策约束。

推荐服务器

Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
MCP Package Docs Server

MCP Package Docs Server

促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。

精选
本地
TypeScript
Claude Code MCP

Claude Code MCP

一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。

精选
本地
JavaScript
@kazuph/mcp-taskmanager

@kazuph/mcp-taskmanager

用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。

精选
本地
JavaScript
mermaid-mcp-server

mermaid-mcp-server

一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。

精选
JavaScript
Jira-Context-MCP

Jira-Context-MCP

MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

精选
TypeScript
Linear MCP Server

Linear MCP Server

一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

精选
JavaScript
Sequential Thinking MCP Server

Sequential Thinking MCP Server

这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。

精选
Python
Curri MCP Server

Curri MCP Server

通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。

官方
本地
JavaScript