Skip to main content
Glama
Mming-Lab
by Mming-Lab

build_paraboloid

Generate paraboloid structures like satellite dishes or bowls in Minecraft Bedrock Edition. Define center coordinates, radius, height, material, and optional parameters like axis and direction for precise customization.

Instructions

Build PARABOLOID: satellite dish, bowl, dish, parabolic. Requires: centerX,centerY,centerZ,radius,height. Optional: axis,direction

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionNoBuild action to performbuild
axisNoParaboloid axis direction: x (east-west), y (up-down), z (north-south)y
centerXYesCenter X coordinate (east-west position of paraboloid base center)
centerYYesCenter Y coordinate (height/vertical position of paraboloid base, typically 64-100)
centerZYesCenter Z coordinate (north-south position of paraboloid base center)
directionNoOpening direction: positive (opens toward +axis), negative (opens toward -axis)positive
heightYesHeight of the paraboloid in blocks. Small: 5-8, Medium: 10-15, Large: 20-30
hollowNoMake it hollow (true) for dish shell, or solid (false) for full paraboloid
materialNoBlock type to build with (e.g. stone, glass, wool, concrete, etc.)minecraft:stone
radiusYesMaximum radius at the top of the paraboloid in blocks. Small: 3-5, Medium: 8-12, Large: 15-20

Implementation Reference

  • Core handler function that validates inputs, calculates paraboloid positions using geometry utils, and executes optimized build via build-executor.
    async execute(args: {
        action?: string;
        centerX: number;
        centerY: number;
        centerZ: number;
        radius: number;
        height: number;
        material?: string;
        hollow?: boolean;
        axis?: 'x' | 'y' | 'z';
        direction?: 'positive' | 'negative';
    }): Promise<ToolCallResult> {
        try {
            // Socket-BE API接続確認
            if (!this.world) {
                return { success: false, message: "World not available. Ensure Minecraft is connected." };
            }
    
            const { 
                action = 'build',
                centerX, 
                centerY, 
                centerZ, 
                radius, 
                height, 
                material = 'minecraft:stone', 
                hollow = false, 
                axis = 'y', 
                direction = 'positive' 
            } = args;
            
            // actionパラメータをサポート(現在は build のみ)
            if (action !== 'build') {
                return this.createErrorResponse(`Unknown action: ${action}. Only 'build' is supported.`);
            }
            
            // 座標の整数化
            const center = {
                x: Math.floor(centerX),
                y: Math.floor(centerY),
                z: Math.floor(centerZ)
            };
            
            // Y座標の検証
            if (center.y < -64 || center.y + height > 320) {
                return {
                    success: false,
                    message: 'Paraboloid extends beyond valid Y coordinates (-64 to 320)'
                };
            }
            
            // 半径と高さの検証
            if (radius < 2 || radius > 50) {
                return {
                    success: false,
                    message: 'Radius must be between 2 and 50'
                };
            }
            
            if (height < 1 || height > 50) {
                return {
                    success: false,
                    message: 'Height must be between 1 and 50'
                };
            }
            
            // ブロックIDの正規化
            let blockId = material;
            if (!blockId.includes(':')) {
                blockId = `minecraft:${blockId}`;
            }
            
            const commands: string[] = [];
            let blocksPlaced = 0;
            
            const radiusInt = Math.round(radius);
            const heightInt = Math.round(height);
            
            // 座標変換ヘルパー関数
            const transformCoordinates = (localX: number, localY: number, localZ: number): {x: number, y: number, z: number} => {
                const directionMultiplier = direction === 'positive' ? 1 : -1;
                
                switch (axis) {
                    case 'x':
                        // X軸パラボロイド: Y-Z平面で展開、X方向に開く
                        return {
                            x: center.x + localY * directionMultiplier,
                            y: center.y + localZ,
                            z: center.z + localX
                        };
                    case 'z':
                        // Z軸パラボロイド: X-Y平面で展開、Z方向に開く
                        return {
                            x: center.x + localX,
                            y: center.y + localZ,
                            z: center.z + localY * directionMultiplier
                        };
                    case 'y':
                    default:
                        // Y軸パラボロイド(デフォルト): X-Z平面で展開、Y方向に開く
                        return {
                            x: center.x + localX,
                            y: center.y + localY * directionMultiplier,
                            z: center.z + localZ
                        };
                }
            };
            const radiusSquared = radiusInt * radiusInt;
            
            
            // 放物面の座標を計算
            const positions = calculateParaboloidPositions(
                center, 
                radiusInt, 
                heightInt, 
                direction as 'up' | 'down', 
                hollow
            );
            
            if (positions.length > BUILD_LIMITS.PARABOLOID) {
                return {
                    success: false,
                    message: `Too many blocks to place (maximum ${BUILD_LIMITS.PARABOLOID.toLocaleString()})`
                };
            }
            
            try {
                // 最適化されたビルド実行
                const result = await executeBuildWithOptimization(
                    this.world,
                    positions,
                    blockId,
                    {
                        type: 'paraboloid',
                        center: center,
                        radius: radiusInt,
                        height: heightInt,
                        material: blockId,
                        hollow: hollow,
                        axis: axis,
                        direction: direction,
                        apiUsed: 'Socket-BE'
                    }
                );
                
                if (!result.success) {
                    return this.createErrorResponse(result.message);
                }
                
                return {
                    success: true,
                    message: result.message,
                    data: result.data
                };
            } catch (buildError) {
                return this.createErrorResponse(`Building error: ${buildError instanceof Error ? buildError.message : String(buildError)}`);
            }
    
        } catch (error) {
            return {
                success: false,
                message: `Error building paraboloid: ${error instanceof Error ? error.message : String(error)}`
            };
        }
    }
  • Input schema defining parameters for the build_paraboloid tool, including required center coordinates, radius, height, and optional material, hollow, axis, direction.
    readonly inputSchema: InputSchema = {
        type: 'object',
        properties: {
            action: {
                type: 'string',
                description: 'Build action to perform',
                enum: ['build'],
                default: 'build'
            },
            centerX: {
                type: 'number',
                description: 'Center X coordinate (east-west position of paraboloid base center)'
            },
            centerY: {
                type: 'number',
                description: 'Center Y coordinate (height/vertical position of paraboloid base, typically 64-100)'
            },
            centerZ: {
                type: 'number',
                description: 'Center Z coordinate (north-south position of paraboloid base center)'
            },
            radius: {
                type: 'number',
                description: 'Maximum radius at the top of the paraboloid in blocks. Small: 3-5, Medium: 8-12, Large: 15-20',
                minimum: 2,
                maximum: 50
            },
            height: {
                type: 'number',
                description: 'Height of the paraboloid in blocks. Small: 5-8, Medium: 10-15, Large: 20-30',
                minimum: 1,
                maximum: 50
            },
            material: {
                type: 'string',
                description: 'Block type to build with (e.g. stone, glass, wool, concrete, etc.)',
                default: 'minecraft:stone'
            },
            hollow: {
                type: 'boolean',
                description: 'Make it hollow (true) for dish shell, or solid (false) for full paraboloid',
                default: false
            },
            axis: {
                type: 'string',
                description: 'Paraboloid axis direction: x (east-west), y (up-down), z (north-south)',
                enum: ['x', 'y', 'z'],
                default: 'y'
            },
            direction: {
                type: 'string',
                description: 'Opening direction: positive (opens toward +axis), negative (opens toward -axis)',
                enum: ['positive', 'negative'],
                default: 'positive'
            }
        },
        required: ['centerX', 'centerY', 'centerZ', 'radius', 'height']
    };
  • src/server.ts:348-372 (registration)
    Instantiation of BuildParaboloidTool and addition to the tools array in the MCP server's initializeTools method.
    this.tools = [
      // Socket-BE Core API ツール(推奨 - シンプルでAI使いやすい)
      new AgentTool(),
      new WorldTool(),
      new PlayerTool(),
      new BlocksTool(),
      new SystemTool(),
      new CameraTool(),
      new SequenceTool(),
      new MinecraftWikiTool(),
    
      // Advanced Building ツール(高レベル建築機能)
      new BuildCubeTool(), // ✅ 完全動作
      new BuildLineTool(), // ✅ 完全動作
      new BuildSphereTool(), // ✅ 完全動作
      new BuildCylinderTool(), // ✅ 修正済み
      new BuildParaboloidTool(), // ✅ 基本動作
      new BuildHyperboloidTool(), // ✅ 基本動作
      new BuildRotateTool(), // ✅ 基本動作
      new BuildTransformTool(), // ✅ 基本動作
      new BuildTorusTool(), // ✅ 修正完了
      new BuildHelixTool(), // ✅ 修正完了
      new BuildEllipsoidTool(), // ✅ 修正完了
      new BuildBezierTool(), // ✅ 新規追加(可変制御点ベジェ曲線)
    ];
  • src/server.ts:494-573 (registration)
    Loop that registers all tools (including build_paraboloid) to the MCP server using mcpServer.registerTool, converting schema to Zod and wrapping the tool's execute method.
    this.tools.forEach((tool) => {
      // inputSchemaをZod形式に変換(SchemaToZodConverterを使用)
      const zodSchema = schemaConverter.convert(tool.inputSchema);
    
      // ツールを登録
      this.mcpServer.registerTool(
        tool.name,
        {
          title: tool.name,
          description: tool.description,
          inputSchema: zodSchema,
        },
        async (args: any) => {
          try {
            const result = await tool.execute(args);
    
            let responseText: string;
    
            if (result.success) {
              // 建築ツールの場合は最適化
              if (tool.name.startsWith('build_')) {
                const optimized = optimizeBuildResult(result);
                responseText = `✅ ${optimized.message}`;
                if (optimized.summary) {
                  responseText += `\n\n📊 Summary:\n${JSON.stringify(optimized.summary, null, 2)}`;
                }
              } else {
                // 通常ツールの場合
                responseText = result.message || `Tool ${tool.name} executed successfully`;
                if (result.data) {
                  // データサイズチェック
                  const dataStr = JSON.stringify(result.data, null, 2);
                  const sizeWarning = checkResponseSize(dataStr);
    
                  if (sizeWarning) {
                    // 大きすぎる場合はデータタイプのみ表示
                    responseText += `\n\n${sizeWarning}`;
                    responseText += `\nData type: ${Array.isArray(result.data) ? `Array[${result.data.length}]` : typeof result.data}`;
                  } else {
                    responseText += `\n\nData: ${dataStr}`;
                  }
                }
              }
            } else {
              // エラーメッセージにヒントを追加
              const errorMsg = result.message || "Tool execution failed";
              const enrichedError = enrichErrorWithHints(errorMsg);
              responseText = `❌ ${enrichedError}`;
              if (result.data) {
                responseText += `\n\nDetails:\n${JSON.stringify(result.data, null, 2)}`;
              }
            }
    
            return {
              content: [
                {
                  type: "text",
                  text: responseText,
                },
              ],
            };
          } catch (error) {
            const errorMsg =
              error instanceof Error ? error.message : String(error);
            const errorStack = error instanceof Error ? error.stack : undefined;
    
            const exceptionMessage = `Tool execution failed with exception: ${errorMsg}${errorStack ? `\n\nStack trace:\n${errorStack}` : ""}`;
    
            return {
              content: [
                {
                  type: "text",
                  text: `❌ ${exceptionMessage}`,
                },
              ],
            };
          }
        }
      );
    });
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states 'Build PARABOLOID' which implies a creation/mutation operation, but doesn't specify permissions needed, whether it's destructive to existing blocks, rate limits, or what happens on success/failure. The parameter list adds some context but lacks critical behavioral details for a building tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief but somewhat disorganized. It front-loads the purpose but then awkwardly lists parameters in a run-on format. While not verbose, the structure could be clearer (e.g., separating purpose from parameter guidance). Some sentences feel crammed together rather than optimally structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter building tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, or practical building considerations in Minecraft. While the schema covers parameters well, the description fails to provide the broader context needed for effective use in a game environment.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 10 parameters thoroughly. The description lists required and optional parameters but doesn't add meaningful semantic context beyond what's in the schema (e.g., explaining relationships between radius and height, or practical building tips). This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Build PARABOLOID' with specific examples (satellite dish, bowl, dish, parabolic). It distinguishes from siblings like build_cube or build_sphere by specifying the geometric shape. However, it doesn't explicitly differentiate from similar tools like build_hyperboloid or build_ellipsoid, which keeps it from a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It lists required and optional parameters but doesn't mention when to choose a paraboloid over other shapes (e.g., sphere for domes, cylinder for towers) or contextual factors like Minecraft building scenarios. This leaves the agent without usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mming-Lab/minecraft-bedrock-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server