maicraft
v1.10.6
Published
基于mineflayer构建的 Minecraft MCP Server,主要用于MaiBot直播Minecraft
Maintainers
Readme
Maicraft
基于 mineflayer 构建的 Minecraft MCP Server。
主要用于和Amaidesu项目配合(maicraft插件现已独立成新的仓库MaiM-with-u/Maicraft),让MaiBot游玩Minecraft游戏。
当然,也可以像普通MCP Server一样使用本项目。
部分高级动作的实现参考自 mineland
安装
请提前配置好minecraft服务器,无论是minecraft客户端直接开局域网游戏,或是minecraft服务器,都支持,版本会自动检测。
推荐的游戏版本:1.20.4
1.21.4也支持,但mineflayer在此版本有些问题,更高的版本可能会有问题,1.21.8目前测出来是不支持的。
方法一:使用npx执行npm包来配置
{
"mcpServers": {
"maicraft": {
"transport": "stdio",
"command": "npx",
"args": [
"-y",
"maicraft@latest",
"--host","127.0.0.1",
"--port","25565",
"--username","Mai",
"--auth", "offline"
]
}
}
}
这里的@latest表示使用最新版本,你也可以替换为其他版本。
方法二:提前全局下载
你可以提前全局安装maicraft,然后再按照方法一进行配置,这样启动时会使用你全局下载的maicraft而不是npx下载的,这样可以避免调用它的时候过慢(因为需要临时下载),缺点是你需要手动升级。
npm install maicraft -g方法三:本地构建
当你的网络不太好,可以使用本地构建。首先clone本地项目
git clone [email protected]:ChangingSelf/maicraft-mcp-server.git
cd maicraft-mcp-server
pnpm install
pnpm run build然后配置为:
{
"mcpServers": {
"minecraft": {
"command": "node",
"args": [
"/path/to/maicraft-mcp-server/dist/main.js",
"--host",
"localhost",
"--port",
"25565",
"--username",
"EvilMai",
]
}
}
}如果你不想每次都 pnpm run build,也可以直接指定为 main.ts,只不过需要tsx来执行
{
"mcpServers": {
"minecraft": {
"command": "npx",
"args": [
"tsx"
"/path/to/maicraft-mcp-server/src/main.ts",
"--host",
"localhost",
"--port",
"25565",
"--username",
"EvilMai",
]
}
}
}配置
Maicraft 支持两种配置方式:命令行参数和配置文件。
方式一:命令行参数(推荐)
最简单的方式是直接在启动时使用命令行参数,无需创建配置文件:
# 基本连接参数
--host <地址> # Minecraft 服务器地址(默认:127.0.0.1)
--port <端口> # 服务器端口(默认:25565)
--username <用户名> # 机器人用户名
--auth <认证方式> # offline | microsoft | mojang(默认:offline)
# 日志配置
--log-level <级别> # DEBUG | INFO | WARN | ERROR(默认:INFO)
# 事件过滤
--events-disabled <事件列表> # 要禁用的事件,用逗号分隔快速开始示例:
# 连接本地服务器
npx -y maicraft --host 127.0.0.1 --username MyBot
# 连接远程服务器并启用调试日志
npx -y maicraft --host mc.example.com --port 25565 --username Bot --log-level DEBUG
# 禁用聊天事件减少噪音
npx -y maicraft --host 127.0.0.1 --username Bot --events-disabled chat,playerJoined方式二:配置文件(适合复杂配置)
如果你需要复杂的配置,或者想保存配置以便重复使用,可以使用配置文件:
首先获取配置文件模板:
npx 用户
# 复制配置文件模板到当前目录
npx -y maicraft --init-config源码安装用户
# 复制配置文件模板
cp config-template.yaml config.yaml然后编辑 config.yaml 配置你的设置:
minecraft:
host: 127.0.0.1 # Minecraft 服务器地址
port: 25565 # 服务器端口
username: MaiBot # 机器人用户名
auth: offline # 认证方式:offline | microsoft | mojang
# 日志配置
logging:
level: INFO # 日志级别:DEBUG | INFO | WARN | ERROR
enableFileLog: true # 是否启用文件日志
useStderr: true # MCP 模式建议开启
# 可选:禁用特定事件
disabledEvents:
- chat # 聊天事件
- playerJoined # 玩家加入
# - death # 其他事件...
# 其他高级配置...
# ……提示: 你也可以混合使用两种方式,先用配置文件设置基础配置,再用命令行参数覆盖特定设置。
启动
现在你可以直接启动 Maicraft:
方式一:npx 用户
# 直接启动(结合上面的命令行参数使用)
npx -y maicraft --host 127.0.0.1 --username MyBot
# 或使用配置文件启动
npx -y maicraft /path/to/config.yaml方式二:源码安装用户
# 开发模式(热重载,适合开发调试)
pnpm dev
# 生产模式(需要先构建)
pnpm build
pnpm start启动成功后,你会看到类似以下的输出:
[INFO] Maicraft 客户端已启动,按 Ctrl+C 退出
[INFO] 日志文件位置: /path/to/logs/maicraft-2024-01-15T10-30-00.log
[INFO] WebSocket日志服务器已启动: ws://localhost:20915/ws/mcp-logs测试
方式一:npx 用户
# 需要先安装mcp-inspector
npm install -g @modelcontextprotocol/inspector
# 列出已注册的工具
mcp-inspector --cli --config mcp-inspector.json --server maicraft --method tools/list
# 调用 query_state 进行烟囱测试
mcp-inspector --cli --config mcp-inspector.json --server maicraft --method tools/call --tool-name query_state方式二:源码安装用户
# 列出已注册的工具
pnpm mcp:tools
# 调用 query_state 进行烟囱测试
pnpm mcp:state快速调试
方法一:直接调试
无需下载任何源码,直接运行如下命令:
npx @modelcontextprotocol/[email protected] npx -y maicraft@latest --host ChangingSelf.xyz --port 50226 --username MaiBot --auth offline之后会弹出一个浏览器网页,点击这个网页左下角的“connect”按钮,若右侧出现“List Tools”的按钮,说明成功配置好了,可以直接通过UI界面进行调试操作。
指定inspector的0.16.5版本的原因是,左下角会有stderr的输出。本mcp server支持的是stdio类型,所以为了避免日志影响stdio,这里将所有的日志都重定向到了stderr。
方法二:源码调试
如果你已经克隆了项目源码,可以直接使用源码进行调试:
# 克隆项目(如果还没有)
git clone https://github.com/ChangingSelf/Maicraft.git
cd Maicraft
# 安装依赖
pnpm install
# 启动调试界面(开发模式)
pnpm mcp:ui这会启动一个基于源码的调试界面,无需打包,直接运行TypeScript源码。
如果你需要更灵活的调试,也可以手动配置:
创建mcp-inspector.json配置文件
{
"mcpServers": {
"maicraft": {
"type": "stdio",
"command": "tsx",
"args": ["src/main.ts", "./config.yaml"],
"env": {
"NODE_ENV": "development"
}
}
}
}# 启动调试界面
mcp-inspector --config mcp-inspector.json --server maicraft日志输出
Maicraft 提供多种方式查看日志:控制台输出、文件日志、WebSocket 实时流。
日志文件
日志文件默认保存在项目根目录的 logs/ 文件夹中,文件名格式为:
logs/maicraft-YYYY-MM-DDTHH-mm-ss.logWebSocket 日志流
程序启动时会自动启动 WebSocket 服务器,用于实时传输日志:
- 端点:
ws://localhost:20915/ws/mcp-logs - 默认端口: 20915
- 用途: 用于 maicraft-web-ui 等工具实时查看日志
可以通过配置修改 WebSocket 服务器设置:
websocket:
enabled: true # 是否启用WebSocket日志服务器
port: 20915 # WebSocket服务器端口
host: "localhost" # WebSocket服务器监听地址架构
graph LR
A[main.ts 启动器] -->|读取| C[config.yaml]
A --> L[Logger]
A --> MC[MinecraftClient]
A --> AE[ActionExecutor]
A --> MCP[MaicraftMcpServer]
MC -->|使用| B[mineflayer Bot]
B -->|事件| MC
MC -->|gameEvent| A
MCP -->|动作工具| AE
MCP -->|连接/状态| MC
AE -->|使用 Bot 执行动作| B
AE -->|自动发现| ACT[src/actions/*.ts]
ACT -->|schema + execute| AE
AE -->|自动生成| MCP_TOOLS[MCP Tools]动作系统架构
graph TD
A[Action File] -->|继承| B[BaseAction]
A -->|定义| C[schema: z.ZodTypeAny]
A -->|实现| D[execute: bot, params => Promise<ActionResult>]
B -->|自动提供| E[validateParams]
B -->|自动提供| F[getParamsSchema]
B -->|自动提供| G[getMcpTools]
G -->|生成| H[MCP Tool: action_name_snake_case]
C -->|校验| I[参数类型安全]
C -->|描述| J[自动生成参数文档]时序:调用动作(mine_block)
sequenceDiagram
participant Client as MCP Client
participant Server as MaicraftMcpServer
participant AE as ActionExecutor
participant MC as MinecraftClient
participant Bot as mineflayer Bot
Client->>Server: tools/call mine_block
Server->>MC: getBot()
MC-->>Server: Bot
alt Bot ready
Server->>AE: execute('mineBlock', Bot, params)
AE->>Bot: 动作执行(寻路/采集等)
Bot-->>AE: result
AE-->>Server: { success, data }
Server-->>Client: structuredContent
else Bot not ready
Server-->>Client: { ok:false, error: service_unavailable }
end时序:事件处理
sequenceDiagram
participant Bot as mineflayer Bot
participant MC as MinecraftClient
participant Main as main.ts
Bot->>MC: 原始游戏事件
MC->>MC: 过滤 disabledEvents(黑名单)
MC-->>Main: gameEvent详细配置
命令行参数
Maicraft 支持多种命令行参数,可以覆盖配置文件中的设置:
# 基础连接参数
--host <地址> # Minecraft 服务器地址(默认:127.0.0.1)
--port <端口> # 服务器端口(默认:25565)
--username <用户名> # 机器人用户名
--password <密码> # 服务器密码(在线模式需要)
--auth <认证方式> # offline | microsoft | mojang(默认:offline)
--version <版本> # Minecraft 版本(可选,自动检测)
# 日志配置
--log-level <级别> # DEBUG | INFO | WARN | ERROR(默认:INFO)
# 事件过滤(黑名单机制)
--events-disabled <事件列表> # 要禁用的事件类型,用逗号分隔
# 示例:--events-disabled chat,playerJoined,health
# 支持的事件:chat, playerJoined, playerLeft, death, spawn, rain, kicked, spawnReset, health, entityHurt, entityDead, playerCollect
# MCP 配置
--mcp-name <名称> # MCP 服务器名称
--mcp-version <版本> # MCP 服务器版本
# 工具过滤
--tools-enabled <工具列表> # 启用的 MCP 工具列表(白名单)
--tools-disabled <工具列表> # 禁用的 MCP 工具列表(黑名单)事件禁用参数示例
# 禁用聊天和玩家加入事件
npx -y maicraft --events-disabled chat,playerJoined
# 禁用所有生命值相关事件
npx -y maicraft --events-disabled health,entityHurt,entityDead
# 禁用天气和玩家收集事件
npx -y maicraft --events-disabled rain,playerCollect基础配置
在 config.yaml 中配置 Minecraft 服务器连接:
minecraft:
host: 127.0.0.1 # 服务器地址
port: 25565 # 端口
username: MaiBot # 机器人用户名
auth: offline # 认证方式:offline | microsoft | mojang
version: "1.19.0" # 游戏版本(可选)
# 禁用的事件类型列表(黑名单机制)
# 列出要禁用的游戏事件类型,默认情况下所有事件都会被启用
disabledEvents:
# - chat # 聊天事件
# - playerJoined # 玩家加入
# - playerLeft # 玩家离开
# - death # 玩家死亡
# - spawn # 玩家重生
# - rain # 天气变化
# - kicked # 玩家被踢出
# - spawnReset # 重生点重置
# - health # 生命值更新
# - entityHurt # 实体受伤
# - entityDead # 实体死亡
# - playerCollect # 玩家收集物品
# 不能破坏的方块列表配置
# 机器人路径查找时会避免破坏这些方块
blocksCantBreak:
- chest # 箱子
- furnace # 熔炉
- bed # 床
- door # 门
- trapdoor # 活板门
- sign # 告示牌
- torch # 火把
- lantern # 灯笼
maxMessageHistory: 100 # 事件历史缓存数量
### 路径查找配置
#### 不能破坏的方块列表
`blocksCantBreak` 配置项用于指定机器人在路径查找时不能破坏的方块列表。当机器人需要移动到某个位置时,它会避免破坏这些重要的方块。
```yaml
# 不能破坏的方块列表配置
blocksCantBreak:
- chest # 箱子
- furnace # 熔炉
- bed # 床
- door # 门
- trapdoor # 活板门
- sign # 告示牌
- torch # 火把
- lantern # 灯笼配置说明:
- 如果不配置此选项,将使用默认列表:
['chest', 'furnace'] - 可以设置为空数组
[]来允许破坏所有方块 - 方块名称使用 Minecraft 的英文名称(如
chest、furnace等) - 如果配置了未知的方块名称,会在日志中显示警告信息
常见方块名称参考:
chest- 箱子furnace- 熔炉crafting_table- 工作台bed- 床door- 门trapdoor- 活板门sign- 告示牌torch- 火把lantern- 灯笼anvil- 铁砧enchanting_table- 附魔台brewing_stand- 酿造台
MCP 工具配置
Maicraft 支持多种工具过滤模式,推荐使用黑名单模式:
mcp:
name: "Maicraft MCP"
version: "1.0.0"
tools:
# 方式1:黑名单模式(推荐)- 屏蔽指定工具,其他全部可用
disabled:
- use_chest
- smelt_item
# 方式2:白名单模式 - 仅暴露指定工具
# enabled:
# - mine_block
# - place_block
# - follow_player
# 方式3:同时使用 - 白名单允许的集合减去黑名单
# enabled:
# - mine_block
# - place_block
# - chat
# disabled:
# - chat
# 方式4:不配置 - 默认暴露所有工具
# (删除或注释掉 tools 部分)动作开发
动作系统特性
- 自动发现:将动作文件放在
src/actions/目录即可自动发现 - 参数校验:基于 Zod 的自动参数校验
- 类型安全:完整的 TypeScript 类型支持
- MCP 集成:自动生成对应的 MCP 工具
编写新动作
方式1:继承基类(推荐)
// src/actions/MyAction.ts
import { BaseAction } from '../minecraft/ActionInterface';
import { z } from 'zod';
interface MyActionParams {
target: string;
count?: number;
}
export class MyAction extends BaseAction<MyActionParams> {
name = 'myAction';
description = '执行我的自定义动作';
// 定义参数校验 schema
schema = z.object({
target: z.string().describe('目标对象'),
count: z.number().int().min(1).optional().describe('执行次数(可选)'),
});
async execute(bot: Bot, params: MyActionParams) {
try {
// 实现动作逻辑
const count = params.count ?? 1;
// ... 具体实现
return this.createSuccessResult(`成功执行动作 ${count} 次`);
} catch (error) {
return this.createExceptionResult(error, '执行失败', 'EXECUTION_ERROR');
}
}
// validateParams、getParamsSchema、getMcpTools 由基类自动提供
}方式2:函数式定义
// src/actions/MyAction.ts
import { defineAction } from '../minecraft/ActionInterface';
import { z } from 'zod';
export const MyAction = defineAction({
name: 'myAction',
description: '执行我的自定义动作',
schema: z.object({
target: z.string().describe('目标对象'),
count: z.number().int().min(1).optional().describe('执行次数(可选)'),
}),
async execute(bot, params) {
// 实现动作逻辑
const count = params.count ?? 1;
// ... 具体实现
return { success: true, message: `成功执行动作 ${count} 次` };
},
});动作自动注册
- 将动作文件放在
src/actions/目录 - 文件会被自动发现并注册
- 对应的 MCP 工具会自动生成(工具名为动作名的 snake_case 形式)
- 例如:
MyAction→my_action工具
动作开发最佳实践
1. 参数设计原则
- 使用清晰的参数名称,避免缩写
- 为可选参数提供合理的默认值
- 使用 Zod schema 进行严格的参数校验
- 在参数描述中提供示例和说明
2. 错误处理
- 使用
createErrorResult()返回业务逻辑错误 - 使用
createExceptionResult()返回异常错误 - 提供有意义的错误代码和消息
- 记录详细的调试日志
3. 返回值设计
- 使用
createSuccessResult()返回成功结果 - 在返回数据中包含有用的状态信息
- 保持返回格式的一致性
4. 依赖检查
- 检查必要的插件是否已加载(如 pathfinder)
- 验证目标对象是否存在(如方块、玩家、实体)
- 确保背包中有必要的物品
5. 性能考虑
- 设置合理的超时时间
- 限制搜索范围(如 maxDistance)
- 避免无限循环和长时间阻塞
可用的动作工具
当前支持的动作工具:
基础交互动作
chatchat chat - 发送聊天消息- 参数:
message(字符串) - 要发送的聊天消息
- 参数:
basic_controlbasic_control basic_control - 基础游戏控制功能参数:
type(字符串) - 控制类型:toss|move|jump|sneak|look_at|sleep|wake|stop_move|stop_sneakitem(字符串,可选) - 物品名称或ID (用于 toss 类型)count(数字,可选) - 物品数量 (用于 toss 类型,默认 1)direction(字符串,可选) - 移动方向 (用于 move 类型:forward|back|left|right)lookType(字符串,可选) - 注视类型 (用于 look_at 类型:angle|position|player|entity|block)yaw(数字,可选) - 视角偏航角,弧度 (用于 angle 注视类型)pitch(数字,可选) - 视角俯仰角,弧度 (用于 angle 注视类型)x,y,z(数字,可选) - 目标坐标 (用于 position 注视类型)force(布尔值,可选) - 是否强制看向 (用于所有注视类型,默认 false)player(字符串,可选) - 目标玩家名称 (用于 player 注视类型)entity(字符串,可选) - 目标实体类型 (用于 entity 注视类型),例如 cow, pig, zombie 等block(字符串,可选) - 目标方块名称 (用于 block 注视类型),例如 dirt, stone, diamond_ore 等maxDistance(数字,可选) - 搜索距离 (用于 entity 和 block 注视类型,默认 64)
use_itemuse_item use_item - 使用手中物品参数:
itemName(字符串,可选) - 物品名称,不指定则使用当前手持物品useType(字符串,可选) - 使用类型:consume|activate|useOn,默认为根据物品类型自动判断targetEntityName(字符串,可选) - 目标实体名称,仅在使用useOn类型时需要targetPlayerName(字符串,可选) - 目标玩家名称,仅在使用useOn类型时需要offHand(布尔值,可选) - 是否使用副手,默认 false
移动与导航动作
movemove move - 移动到指定位置参数:
type(字符串) - 移动类型:coordinate|block|player|entityuseAbsoluteCoords(布尔值,可选) - 是否使用绝对坐标,默认 falsex,y,z(数字,可选) - 目标坐标 (当 type 为 coordinate 时必需)block(字符串,可选) - 目标方块名称 (当 type 为 block 时必需)player(字符串,可选) - 目标玩家名称 (当 type 为 player 时必需)entity(字符串,可选) - 目标实体类型 (当 type 为 entity 时必需)distance(数字,可选) - 到达距离,默认 1timeout(数字,可选) - 超时时间(秒),默认 60maxDistance(数字,可选) - 最大移动距离,默认 100
follow_playerfollow_player follow_player - 跟随指定玩家参数:
player(字符串) - 目标玩家名称distance(数字,可选) - 跟随距离(格),默认 3timeout(数字,可选) - 超时时间(秒),默认 5
swim_to_landswim_to_land swim_to_land - 游向最近的陆地参数:
maxDistance(数字,可选) - 最大搜索距离,默认 64timeout(数字,可选) - 超时时间(秒),默认 60
方块操作动作
mine_blockmine_block mine_block - 挖掘指定类型的方块参数:
name(字符串) - 方块名称,例如 "dirt", "stone", "coal_ore"count(数字,可选) - 需要挖掘的数量,默认 1direction(字符串,可选) - 挖掘方向:+y|-y|+z|-z|+x|-x(坐标轴方向),不指定时在附近搜索maxDistance(数字,可选) - 搜索距离,默认 48bypassAllCheck(布尔值,可选) - 是否绕过所有检查直接挖掘,默认 false
place_blockplace_block place_block - 在指定位置放置方块参数:
x,y,z(数字) - 目标位置坐标block(字符串) - 要放置的方块名称face(字符串,可选) - 放置面向:+y|-y|+z|-z|+x|-x(坐标轴方向)useAbsoluteCoords(布尔值,可选) - 是否使用绝对坐标,默认 false
物品制作动作
craft_itemcraft_item craft_item - 合成指定物品参数:
item(字符串) - 要合成的物品名称count(数字,可选) - 合成数量,默认 1
start_smeltingstart_smelting start_smelting - 在熔炉中开始熔炼物品(不等待完成)参数:
item(字符串) - 要熔炼的物品名称fuel(字符串) - 燃料物品名称count(数字,可选) - 熔炼数量,默认 1
collect_smelted_itemscollect_smelted_items collect_smelted_items - 从熔炉中收集已熔炼完成的物品参数:
item(字符串,可选) - 要收集的熔炼产物名称,不指定则收集所有产物x,y,z(数字,可选) - 熔炉坐标useAbsoluteCoords(布尔值,可选) - 是否使用绝对坐标,默认 false
use_furnaceuse_furnace use_furnace - 熔炉操作(放入/取出/查看物品)参数:
container_type(字符串,可选) - 容器类型:furnace|blast_furnace|smoker(默认 furnace)action(字符串,可选) - 操作类型:put|take|view(默认 put)items(数组,可选) - 物品数组 (put操作必需,take操作可选用于指定槽位)name(字符串,可选) - 物品名称 (put操作必需)count(数字,可选) - 物品数量 (默认 1)position(字符串,可选) - 槽位:input|fuel|output
x,y,z(数字,可选) - 熔炉坐标auto_search(布尔值,可选) - 是否自动查找附近容器 (默认 false)
smelt_itemsmelt_item smelt_item - 在熔炉中熔炼物品(已弃用,建议使用 start_smelting + collect_smelted_items)参数:
item(字符串) - 要熔炼的物品名称fuel(字符串) - 燃料物品名称count(数字,可选) - 熔炼数量,默认 1
存储与交互动作
use_chestuse_chest use_chest - 与附近箱子交互,存取物品参数:
action(字符串) - 操作类型:store|withdrawitem(字符串) - 物品名称count(数字,可选) - 数量,默认 1
战斗动作
kill_mobkill_mob kill_mob - 击杀指定名称的生物参数:
mob(字符串) - 目标生物名称,例如 "cow", "pig", "zombie"timeout(数字,可选) - 等待生物死亡的超时时间(秒),默认 300
其他动作
动作使用示例
基础操作示例
// 发送聊天消息
{
"tool": "chat",
"arguments": {
"message": "Hello, Minecraft!"
}
}
// 食用苹果
{
"tool": "use_item",
"arguments": {
"itemName": "apple",
"useType": "consume"
}
}
// 扔雪球
{
"tool": "use_item",
"arguments": {
"itemName": "snowball",
"useType": "activate"
}
}
// 使用当前手持物品(自动判断使用类型)
{
"tool": "use_item",
"arguments": {}
}
// 丢弃物品
{
"tool": "basic_control",
"arguments": {
"type": "toss",
"item": "dirt",
"count": 5
}
}
// 开始向前移动
{
"tool": "basic_control",
"arguments": {
"type": "move",
"direction": "forward"
}
}
// 执行跳跃
{
"tool": "basic_control",
"arguments": {
"type": "jump"
}
}
// 开始潜行
{
"tool": "basic_control",
"arguments": {
"type": "sneak"
}
}
// 调整视角到特定角度
{
"tool": "basic_control",
"arguments": {
"type": "look_at",
"lookType": "angle",
"yaw": 1.57,
"pitch": 0.0,
"force": true
}
}
// 看向特定坐标位置
{
"tool": "basic_control",
"arguments": {
"type": "look_at",
"lookType": "position",
"x": 100,
"y": 64,
"z": 100,
"force": true
}
}
// 看向玩家
{
"tool": "basic_control",
"arguments": {
"type": "look_at",
"lookType": "player",
"player": "Steve",
"force": true
}
}
// 看向最近的牛
{
"tool": "basic_control",
"arguments": {
"type": "look_at",
"lookType": "entity",
"entity": "cow",
"maxDistance": 50
}
}
// 看向最近的钻石矿石方块
{
"tool": "basic_control",
"arguments": {
"type": "look_at",
"lookType": "block",
"block": "diamond_ore",
"maxDistance": 100
}
}
// 睡觉(自动寻找附近的床)
{
"tool": "basic_control",
"arguments": {
"type": "sleep"
}
}
// 醒来
{
"tool": "basic_control",
"arguments": {
"type": "wake"
}
}
// 停止移动
{
"tool": "basic_control",
"arguments": {
"type": "stop_move"
}
}
// 停止潜行
{
"tool": "basic_control",
"arguments": {
"type": "stop_sneak"
}
}
// 对玩家使用物品
{
"tool": "use_item",
"arguments": {
"itemName": "saddle",
"useType": "useOn",
"targetPlayerName": "Steve"
}
}
// 对实体使用物品
{
"tool": "use_item",
"arguments": {
"itemName": "shears",
"useType": "useOn",
"targetEntityName": "sheep"
}
}
// 挖掘石头
{
"tool": "mine_block",
"arguments": {
"name": "stone",
"count": 5
}
}
// 向Y轴正方向挖掘石头
{
"tool": "mine_block",
"arguments": {
"name": "stone",
"count": 3,
"direction": "+y"
}
}
// 向Z轴负方向挖掘煤炭
{
"tool": "mine_block",
"arguments": {
"name": "coal_ore",
"count": 2,
"direction": "-z",
"maxDistance": 20
}
}
// 移动到指定坐标
{
"tool": "move",
"arguments": {
"type": "coordinate",
"x": 100,
"y": 64,
"z": 200,
"useAbsoluteCoords": true
}
}高级操作示例
💡 熔炼优化提示:为了优化熔炼体验并避免长时间等待,建议使用
start_smelting+collect_smelted_items的组合替代smelt_item。这样可以:
- 开始熔炼后立即返回,不阻塞其他操作
- 在熔炼进行时执行其他任务
- 熔炼完成后单独收集产物
// 合成工作台
{
"tool": "craft_item",
"arguments": {
"item": "crafting_table",
"count": 1
}
}
// 开始熔炼铁矿石(推荐方式)
{
"tool": "start_smelting",
"arguments": {
"item": "iron_ore",
"fuel": "coal",
"count": 3
}
}
// 收集熔炼产物
{
"tool": "collect_smelted_items",
"arguments": {
"item": "iron_ingot"
}
}
// 熔炼铁矿石(已弃用,会等待熔炼完成)
{
"tool": "smelt_item",
"arguments": {
"item": "iron_ore",
"fuel": "coal",
"count": 3
}
}
// 熔炉操作示例
{
"tool": "use_furnace",
"arguments": {
"action": "put",
"items": [
{"name": "iron_ore", "count": 5, "position": "input"},
{"name": "coal", "count": 2, "position": "fuel"}
]
}
}
// 查看熔炉状态
{
"tool": "use_furnace",
"arguments": {
"action": "view"
}
}
// 从熔炉取出产物
{
"tool": "use_furnace",
"arguments": {
"action": "take",
"items": [
{"position": "output"}
]
}
}
// 跟随玩家
{
"tool": "follow_player",
"arguments": {
"player": "Steve",
"distance": 5,
"timeout": 30
}
}
MCP 工具
查询工具
query_state- 查询游戏状态query_events- 查询事件历史
动作工具
动作工具会根据 src/actions/ 目录中的动作文件自动生成,工具名格式为动作名的 snake_case 形式。例如:
MineBlockAction→mine_block工具PlaceBlockAction→place_block工具FollowPlayerAction→follow_player工具
每个动作工具都会自动包含:
- 基于 Zod schema 的参数校验
- 完整的参数类型说明
- 自动生成的工具描述
- 统一的错误处理和返回格式
开发
依赖要求
- Node.js >= 18.0.0
- pnpm >= 10.6.5
- Python (用于编译某些依赖)
主要依赖版本
- mineflayer: ^4.32.0
- @modelcontextprotocol/sdk: ^1.17.2
- mineflayer-pathfinder-mai: ^2.4.6
- prismarine-viewer: ^1.33.0
- canvas: ^3.1.2
# 构建
pnpm build
# 测试
pnpm test
# 代码检查
pnpm lint
# 清理构建文件
pnpm clean许可证
MIT
