使用 FastMCP 构建 Minecraft 协议(MCP)服务器与客户端

本教程将引导你如何使用高性能的 Python 库 FastMCP 来构建一个基础的 Minecraft 协议(MCP)服务器和客户端,涵盖了环境搭建、服务器与客户端核心代码实现,以及异步处理等关键技术点。

阅读时长: 5 分钟
共 2020字
作者: eimoon.com

Minecraft 作为一款现象级的沙盒游戏,其强大的可扩展性催生了庞大的开发者社区。无论是想创建自定义服务器、开发辅助工具,还是制作智能机器人(Bot),理解并使用 Minecraft 协议(Minecraft Protocol, MCP)都是必不可少的一步。然而,直接处理底层协议通常是复杂且繁琐的。幸运的是,开源社区为我们提供了像 FastMCP 这样的高效工具库,极大地简化了这一过程。

本文将作为一篇入门指南,详细介绍如何利用 Python 的 FastMCP 库从零开始构建一个简单的 MCP 服务器和客户端。

核心概念:FastMCP 是什么?

FastMCP 是一个专为处理 Minecraft 协议而设计的 Python 库。它的核心目标是提供一个高性能、易于使用且基于异步(asyncio)的框架,帮助开发者快速创建与 Minecraft 服务器或客户端交互的应用程序。

主要特性包括:

  • 高性能异步 I/O: 基于 Python 的 asyncio,能够轻松处理大量并发连接,非常适合构建需要高吞吐量的服务器或客户端。
  • 协议抽象化: 将复杂的 Minecraft 数据包(Packet)结构封装成简单易用的 Python 对象,开发者无需手动处理字节流的序列化和反序列化。
  • 事件驱动模型: 通过注册事件处理器(Event Handler),可以优雅地响应特定的网络事件或接收到的数据包。
  • 纯 Python 实现: 易于安装和部署,无需复杂的外部依赖。

准备工作:环境设置

在开始编码之前,请确保你的开发环境满足以下要求:

  1. Python 3.7+: FastMCP 依赖 asyncio 的较新特性,因此建议使用较新版本的 Python。

  2. 安装 FastMCP: 通过 pip 可以轻松安装 FastMCP 及其依赖。打开终端并运行以下命令:

    pip install fastmcp
    

安装完成后,我们就可以开始编写代码了。

实战一:构建一个简单的 MCP 服务器

我们的第一个目标是创建一个能够响应 Minecraft 客户端“服务器列表 Ping 请求”的服务器。当玩家在游戏客户端添加服务器地址时,客户端会发送一个 Ping 请求,以获取服务器的状态信息,如服务器版本、在线人数和 Motd(Message of the Day)。

以下是一个最简化的 FastMCP 服务器实现:

import asyncio
from fastmcp import TAsyncServer, events

# 定义服务器的配置
SERVER_ADDRESS = '0.0.0.0'
SERVER_PORT = 25565

class MySimpleServer(TAsyncServer):
    # 注册一个事件处理器来响应状态请求 (Ping)
    @events.on_state
    async def on_status_request(self, conn, packet):
        # 构建并发送服务器状态响应
        await conn.write_packet('state', {
            'response': {
                'version': {'name': '1.19.4', 'protocol': 762},
                'players': {'max': 100, 'online': 5, 'sample': []},
                'description': {'text': '§aHello from FastMCP Server!'}
            }
        })
        print(f"Responded to status request from {conn.address}")

async def main():
    # 创建并启动服务器
    server = MySimpleServer(
        address=SERVER_ADDRESS,
        port=SERVER_PORT,
    )
    print(f"Server starting on {SERVER_ADDRESS}:{SERVER_PORT}...")
    await server.start()

if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Server shutting down.")

代码解析:

  1. MySimpleServer(TAsyncServer):我们创建了一个继承自 fastmcp.TAsyncServer 的自定义服务器类。
  2. @events.on_state:这是一个装饰器,用于注册一个事件处理器。当服务器接收到类型为 state 的数据包(即 Ping 请求)时,on_status_request 方法会被自动调用。
  3. conn.write_packet(...):这个方法用于向客户端发送一个数据包。我们构造了一个包含服务器版本、玩家信息和描述(Motd)的响应。§a 是 Minecraft 的颜色代码,表示绿色。
  4. server.start():启动服务器,使其开始监听指定的地址和端口。

现在,运行这个脚本,然后在你的 Minecraft 客户端中添加 localhost 作为服务器地址,你将看到我们自定义的服务器信息。

实战二:构建一个 MCP 客户端(机器人)

接下来,让我们创建一个简单的客户端(通常称为 Bot),它能连接到指定的 Minecraft 服务器,并打印出聊天消息。

import asyncio
from fastmcp import TAsyncClient, events

# 目标服务器配置
TARGET_SERVER_HOST = 'localhost' # 或者其他服务器地址
TARGET_SERVER_PORT = 25565
BOT_USERNAME = 'MyFastMCPBot'

class MySimpleBot(TAsyncClient):
    # 注册事件处理器,在成功登录后触发
    @events.on_login_success
    async def on_login(self, conn, packet):
        print(f"Successfully logged in to {self.host}:{self.port} as {self.username}!")
        # 可以在这里发送聊天消息或执行其他操作
        # await conn.write_packet('chat_message', {'message': 'Hello world!'})

    # 注册事件处理器,用于接收聊天消息
    @events.on_chat_message
    async def on_chat(self, conn, packet):
        chat_data = packet.get('chat_data') # 根据具体协议版本获取数据
        sender = chat_data.get('sender_name', 'Unknown')
        message = chat_data.get('message', '')
        print(f"[CHAT] <{sender}> {message}")

async def main():
    # 创建并启动客户端
    bot = MySimpleBot(
        host=TARGET_SERVER_HOST,
        port=TARGET_SERVER_PORT,
        username=BOT_USERNAME,
        initial_packets=True # 自动发送握手和登录包
    )
    print(f"Bot '{BOT_USERNAME}' connecting to {TARGET_SERVER_HOST}:{TARGET_SERVER_PORT}...")
    await bot.connect()

if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Bot disconnecting.")

代码解析:

  1. MySimpleBot(TAsyncClient):我们创建了一个继承自 fastmcp.TAsyncClient 的 Bot 类。
  2. initial_packets=True:这个参数告诉 FastMCP 在连接建立后自动处理握手(Handshake)和登录(Login)流程。
  3. @events.on_login_success:当客户端成功登录到服务器后,此装饰器绑定的方法会被调用。
  4. @events.on_chat_message:此装饰器用于监听服务器广播的聊天消息数据包。每当服务器上有聊天消息时,on_chat 方法就会被触发,并打印消息内容。
  5. bot.connect():启动客户端连接。

要测试这个 Bot,你需要一个本地或远程的 Minecraft 服务器(可以是官方服务器,也可以是我们上一步创建的服务器,但需要扩展其功能以支持完整登录)。运行此脚本,Bot 将尝试登录并监听聊天频道。

总结

通过 FastMCP,我们能够用非常少的代码实现原本复杂的 Minecraft 协议交互。其异步特性保证了应用的高性能和高响应性,而事件驱动的编程模型则让代码逻辑清晰且易于扩展。

无论是想制作一个自动化的服务器监控工具、一个能与玩家互动的游戏内 Bot,还是一个轻量级的自定义服务器,FastMCP 都为你提供了一个坚实而高效的起点。希望本教程能帮助你开启探索 Minecraft 开发的奇妙旅程。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计