A Minecraft MCP Server built on mineflayer for automation and bot control, primarily for MaiBot Minecraft streaming
The Maicraft MCP server exhibits severe definition quality issues across all dimensions. Tool descriptions are minimal and generic (all marked as 'auto-discovered action-based tool' with no actionable detail). No input schemas are visible in the provided source code, tools appear to be registered dynamically via ActionExecutor.getDiscoveredMcpTools(), but the actual schema objects are not shown. Parameter documentation is absent. Error handling guidance is missing. The tools lack proper verb-noun naming (query_game_state vs queryPlayerStatus use inconsistent conventions). Output structures are undocumented. This server reads like a scaffolding project rather than production-ready tooling.
Query game state information (auto-discovered action-based tool)
Query player status information (auto-discovered action-based tool)
Query recent game events (auto-discovered action-based tool)
Query surrounding environment information (auto-discovered action-based tool)
Query current game state (auto-discovered action-based tool)
All tool descriptions are identical boilerplate: '(auto-discovered action-based tool)' with no actionable detail. LLMs cannot determine when or why to call each tool, violating the core principle that descriptions must answer WHAT, WHEN, and WHAT IT RETURNS.
No input schemas are visible in source code. Tools are registered via ActionExecutor.getDiscoveredMcpTools() which returns a specs array, but the actual schema definitions are not shown. Cannot verify that tools have typed input parameters or constraints. Per HARD SCORING RULE: tools with no visible schema must score 0 on schema dimension.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 21 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 15 | 1.17.2+ | v1 |
Inconsistent naming convention: query_game_state (snake_case with verb_noun) vs queryPlayerStatus (camelCase, inconsistent verb positioning). LLMs rely on consistent naming patterns to infer intent. All tools should follow verb_noun convention (e.g., get_player_status, list_surrounding_entities).
Output schemas are not documented. No indication of what fields each tool returns, their types, or how they relate to downstream tool calls. Agents cannot plan multi-step sequences without this information.
Tool descriptions do not distinguish between tools. 'Query player status information (auto-discovered action-based tool)' is identical in pattern to 'Query surrounding environment information (auto-discovered action-based tool)'. Cannot infer differences.
No error handling guidance. wrapAction() logs errors to 'service_unavailable' but MCP responses do not include recovery hints. If a tool fails, agents have no guidance on what to retry or whether the operation is retryable.
Tool definitions are inferred (visible only as registration calls in registerActionTools(), not as explicit exported definitions). Actual schema objects, param validation, and output types are delegated to ActionExecutor.getDiscoveredMcpTools(), making verification impossible from provided code. Per HARD SCORING RULE: inferred tools are capped at 50 overall, but with missing descriptions and visible schema, score is much lower.