Skip to main content
Glama

mgba_dump_oam

Extract and display all 40 sprite data from Game Boy, GBC, or GBA games, including positions, tiles, flags, and palettes, for game analysis and testing.

Instructions

Dump OAM (Object Attribute Memory) sprite data - shows all 40 sprites with position, tile, flags, and palette

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
rom_pathYesPath to the ROM file
savestate_pathNoOptional savestate to load
framesNoFrames to run before dumping (default: 60)

Implementation Reference

  • Core implementation of mgba_dump_oam: generates Lua script to dump 40 OAM sprites (position, tile, flags, palette, visibility) from GBA memory (0xFE00-0xFE9F) after specified frames, outputs JSON, takes screenshot.
        def dump_oam(
            self,
            rom_path: str,
            savestate_path: Optional[str] = None,
            frames_before_dump: int = 60,
        ) -> EmulatorResult:
            """Dump OAM (sprite) data."""
            lua_script = f"""
    local frame = 0
    
    callbacks:add("frame", function()
        frame = frame + 1
        if frame >= {frames_before_dump} then
            local f = io.open("output.json", "w")
            if f then
                f:write('{{"oam": [')
                for slot = 0, 39 do
                    local addr = 0xFE00 + slot * 4
                    local y = emu:read8(addr)
                    local x = emu:read8(addr + 1)
                    local tile = emu:read8(addr + 2)
                    local flags = emu:read8(addr + 3)
                    if slot > 0 then f:write(',') end
                    f:write(string.format(
                        '{{"slot":%d,"y":%d,"x":%d,"tile":%d,"flags":%d,"palette":%d,"visible":%s}}',
                        slot, y, x, tile, flags, flags % 8,
                        (y > 0 and y < 160) and "true" or "false"
                    ))
                end
                f:write(']}}')
                f:close()
            end
            emu:screenshot("screenshot.png")
            -- Write DONE marker
            local done = io.open("DONE", "w")
            if done then done:write("OK"); done:close() end
        end
    end)
    """
            return self._run_with_lua(rom_path, lua_script, savestate_path)
  • Input schema defining parameters for mgba_dump_oam tool: required rom_path, optional savestate_path and frames.
    inputSchema={
        "type": "object",
        "properties": {
            "rom_path": {
                "type": "string",
                "description": "Path to the ROM file",
            },
            "savestate_path": {
                "type": "string",
                "description": "Optional savestate to load",
            },
            "frames": {
                "type": "integer",
                "description": "Frames to run before dumping (default: 60)",
                "default": 60,
            },
        },
        "required": ["rom_path"],
    },
  • Registers the mgba_dump_oam tool in the MCP server's list_tools() function.
    Tool(
        name="mgba_dump_oam",
        description="Dump OAM (Object Attribute Memory) sprite data - shows all 40 sprites with position, tile, flags, and palette",
        inputSchema={
            "type": "object",
            "properties": {
                "rom_path": {
                    "type": "string",
                    "description": "Path to the ROM file",
                },
                "savestate_path": {
                    "type": "string",
                    "description": "Optional savestate to load",
                },
                "frames": {
                    "type": "integer",
                    "description": "Frames to run before dumping (default: 60)",
                    "default": 60,
                },
            },
            "required": ["rom_path"],
        },
    ),
  • MCP server handler for mgba_dump_oam: calls emulator.dump_oam, parses OAM JSON into formatted text table of visible sprites, adds screenshot if available.
    elif name == "mgba_dump_oam":
        result = emu.dump_oam(
            rom_path=arguments["rom_path"],
            savestate_path=arguments.get("savestate_path"),
            frames_before_dump=arguments.get("frames", 60),
        )
    
        if result.success and result.data:
            oam = result.data["oam"]
            lines = ["OAM Sprite Data (40 slots):"]
            lines.append("Slot  Y    X   Tile  Flags  Pal  Visible")
            lines.append("-" * 45)
            for sprite in oam:
                if sprite["visible"]:
                    lines.append(
                        f"{sprite['slot']:3d}  {sprite['y']:3d}  {sprite['x']:3d}  "
                        f"0x{sprite['tile']:02X}   0x{sprite['flags']:02X}    {sprite['palette']}    *"
                    )
            result_content.append(TextContent(type="text", text="\n".join(lines)))
            if result.screenshot:
                result_content.append(ImageContent(
                    type="image",
                    data=base64.b64encode(result.screenshot).decode(),
                    mimeType="image/png",
                ))
        else:
            result_content.append(TextContent(type="text", text=f"Error: {result.error}"))
Behavior2/5

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

With no annotations provided, the description carries full burden but only states what data is shown, not behavioral traits like whether it modifies state, requires specific emulator setup, handles errors, or outputs format. It misses critical context for a tool that interacts with emulation state.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the purpose and key details without waste. Every word earns its place by specifying the action, resource, and data attributes clearly.

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?

Given the complexity of emulation tools and lack of annotations or output schema, the description is incomplete. It omits behavioral context, error handling, output format, and usage distinctions from siblings, leaving gaps for an AI agent to understand how to invoke it correctly in context.

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 parameters are well-documented in the schema. The description adds no additional parameter meaning beyond implying 'frames' relates to timing before dumping, which is already covered by the schema's default and description. Baseline 3 is appropriate as the schema does the heavy lifting.

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

Purpose5/5

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

The description clearly states the specific action ('Dump') and resource ('OAM sprite data'), with precise scope details ('all 40 sprites with position, tile, flags, and palette'). It distinguishes from siblings by focusing on OAM data rather than general entities, memory reads, or execution tools.

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?

No explicit guidance on when to use this tool versus alternatives like 'mgba_dump_entities' or 'mgba_read_memory' is provided. The description implies usage for sprite data analysis but lacks context on prerequisites, exclusions, or comparative scenarios with sibling tools.

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

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/struktured-labs/mgba-mcp'

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