Skip to main content
Glama

place-block

Place blocks at specified coordinates in Minecraft using the mcp-minecraft server. Define X, Y, Z positions and face direction to build structures programmatically.

Instructions

Place a block at the specified position

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate
yYesY coordinate
zYesZ coordinate
faceDirectionNoDirection to place against (default: 'down')

Implementation Reference

  • The handler function that implements the 'place-block' tool. It checks if the position is empty, prioritizes the specified face direction if provided, iterates over possible adjacent faces to find a solid reference block, navigates and looks at the position if needed, and attempts to place a block against that face.
    async ({ x, y, z, faceDirection = 'down' }: { x: number, y: number, z: number, faceDirection?: FaceDirection }) => {
      const bot = getBot();
      const placePos = new Vec3(x, y, z);
      const blockAtPos = bot.blockAt(placePos);
    
      if (blockAtPos && blockAtPos.name !== 'air') {
        return factory.createResponse(`There's already a block (${blockAtPos.name}) at (${x}, ${y}, ${z})`);
      }
    
      const possibleFaces: FaceOption[] = [
        { direction: 'down', vector: new Vec3(0, -1, 0) },
        { direction: 'north', vector: new Vec3(0, 0, -1) },
        { direction: 'south', vector: new Vec3(0, 0, 1) },
        { direction: 'east', vector: new Vec3(1, 0, 0) },
        { direction: 'west', vector: new Vec3(-1, 0, 0) },
        { direction: 'up', vector: new Vec3(0, 1, 0) }
      ];
    
      if (faceDirection !== 'down') {
        const specificFace = possibleFaces.find(face => face.direction === faceDirection);
        if (specificFace) {
          possibleFaces.unshift(possibleFaces.splice(possibleFaces.indexOf(specificFace), 1)[0]);
        }
      }
    
      for (const face of possibleFaces) {
        const referencePos = placePos.plus(face.vector);
        const referenceBlock = bot.blockAt(referencePos);
    
        if (referenceBlock && referenceBlock.name !== 'air') {
          if (!bot.canSeeBlock(referenceBlock)) {
            const goal = new goals.GoalNear(referencePos.x, referencePos.y, referencePos.z, 2);
            await bot.pathfinder.goto(goal);
          }
    
          await bot.lookAt(placePos, true);
    
          try {
            await bot.placeBlock(referenceBlock, face.vector.scaled(-1));
            return factory.createResponse(`Placed block at (${x}, ${y}, ${z}) using ${face.direction} face`);
          } catch (placeError) {
            log('warn', `Failed to place using ${face.direction} face: ${placeError}`);
            continue;
          }
        }
      }
    
      return factory.createResponse(`Failed to place block at (${x}, ${y}, ${z}): No suitable reference block found`);
    }
  • Input schema using Zod for validating the parameters of the 'place-block' tool: required x, y, z coordinates and optional faceDirection.
    {
      x: z.number().describe("X coordinate"),
      y: z.number().describe("Y coordinate"),
      z: z.number().describe("Z coordinate"),
      faceDirection: z.enum(['up', 'down', 'north', 'south', 'east', 'west']).optional().describe("Direction to place against (default: 'down')")
    },
  • Direct registration of the 'place-block' tool using ToolFactory.registerTool, specifying name, description, input schema, and handler function.
    factory.registerTool(
      "place-block",
      "Place a block at the specified position",
      {
        x: z.number().describe("X coordinate"),
        y: z.number().describe("Y coordinate"),
        z: z.number().describe("Z coordinate"),
        faceDirection: z.enum(['up', 'down', 'north', 'south', 'east', 'west']).optional().describe("Direction to place against (default: 'down')")
      },
      async ({ x, y, z, faceDirection = 'down' }: { x: number, y: number, z: number, faceDirection?: FaceDirection }) => {
        const bot = getBot();
        const placePos = new Vec3(x, y, z);
        const blockAtPos = bot.blockAt(placePos);
    
        if (blockAtPos && blockAtPos.name !== 'air') {
          return factory.createResponse(`There's already a block (${blockAtPos.name}) at (${x}, ${y}, ${z})`);
        }
    
        const possibleFaces: FaceOption[] = [
          { direction: 'down', vector: new Vec3(0, -1, 0) },
          { direction: 'north', vector: new Vec3(0, 0, -1) },
          { direction: 'south', vector: new Vec3(0, 0, 1) },
          { direction: 'east', vector: new Vec3(1, 0, 0) },
          { direction: 'west', vector: new Vec3(-1, 0, 0) },
          { direction: 'up', vector: new Vec3(0, 1, 0) }
        ];
    
        if (faceDirection !== 'down') {
          const specificFace = possibleFaces.find(face => face.direction === faceDirection);
          if (specificFace) {
            possibleFaces.unshift(possibleFaces.splice(possibleFaces.indexOf(specificFace), 1)[0]);
          }
        }
    
        for (const face of possibleFaces) {
          const referencePos = placePos.plus(face.vector);
          const referenceBlock = bot.blockAt(referencePos);
    
          if (referenceBlock && referenceBlock.name !== 'air') {
            if (!bot.canSeeBlock(referenceBlock)) {
              const goal = new goals.GoalNear(referencePos.x, referencePos.y, referencePos.z, 2);
              await bot.pathfinder.goto(goal);
            }
    
            await bot.lookAt(placePos, true);
    
            try {
              await bot.placeBlock(referenceBlock, face.vector.scaled(-1));
              return factory.createResponse(`Placed block at (${x}, ${y}, ${z}) using ${face.direction} face`);
            } catch (placeError) {
              log('warn', `Failed to place using ${face.direction} face: ${placeError}`);
              continue;
            }
          }
        }
    
        return factory.createResponse(`Failed to place block at (${x}, ${y}, ${z}): No suitable reference block found`);
      }
    );
  • src/main.ts:53-53 (registration)
    Invocation of registerBlockTools in the main application, which in turn registers the 'place-block' tool along with other block-related tools.
    registerBlockTools(factory, getBot);

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/yuniko-software/minecraft-mcp-server'

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