Skip to main content
Glama
sandraschi

Robotics MCP Server

robot_model

Create, import, export, and convert robot 3D models for Unity, VRChat, and Resonite projects using a single unified interface.

Instructions

Robot model management portmanteau for Robotics MCP.

PORTMANTEAU PATTERN RATIONALE: Instead of creating 4 separate tools (create, import, export, convert), this tool consolidates related model operations into a single interface. This design:

  • Prevents tool explosion (4 tools → 1 tool) while maintaining full functionality

  • Improves discoverability by grouping related operations together

  • Reduces cognitive load when working with robot models

  • Enables consistent model interface across all operations

  • Follows FastMCP 2.13+ best practices for feature-rich MCP servers

SUPPORTED OPERATIONS:

  • create: Create robot 3D model from scratch using Blender MCP

  • import: Import robot 3D model into Unity/VRChat/Resonite project

  • export: Export robot model from Unity to file format

  • convert: Convert robot model between formats

  • spz_check: Check .spz conversion tool availability

  • spz_convert: Convert .spz file to .ply or other format

  • spz_extract: Extract metadata from .spz file

  • spz_install: Install Unity Gaussian Splatting plugin (alternative to .spz)

Args: operation: The model operation to perform. MUST be one of: - "create": Create model (requires: robot_type, output_path) - "import": Import model (requires: robot_type, model_path) - "export": Export model (requires: robot_id) - "convert": Convert model (requires: source_path, source_format, target_format)

robot_type: Type of robot (required for create/import).
    Examples: "scout", "go2", "g1", "robbie", "custom"

model_path: Path to model file (required for import).
output_path: Path for output file (required for create, optional for export/convert).
format: Model format (used by create/import/export).
    - "fbx": Industry standard (recommended for robots)
    - "glb": Modern glTF 2.0 format
    - "obj": Simple mesh format
    - "vrm": VRM format (ONLY for humanoid robots)
platform: Target platform for import (unity/vrchat/resonite).
dimensions: Custom dimensions for create (length, width, height in meters).
create_textures: Create textures using gimp-mcp (for create).
texture_style: Texture style for create (realistic/stylized/simple).
robot_id: Virtual robot identifier (required for export).
include_animations: Include animations in export.
project_path: Unity project path (for import).
create_prefab: Create Unity prefab after import.
source_path: Source file path (required for convert).
source_format: Source file format (required for convert).
target_format: Target file format (required for convert).
target_path: Output file path (optional for convert).

Returns: Dictionary containing operation-specific results.

Examples: Create Scout model: result = await robot_model( operation="create", robot_type="scout", output_path="D:/Models/scout_model.fbx", format="fbx" )

Import model to Unity:
    result = await robot_model(
        operation="import",
        robot_type="scout",
        model_path="D:/Models/scout_model.fbx",
        platform="unity"
    )

Export robot from Unity:
    result = await robot_model(
        operation="export",
        robot_id="vbot_scout_01",
        format="fbx"
    )

Convert FBX to GLB:
    result = await robot_model(
        operation="convert",
        source_path="D:/Models/scout.fbx",
        source_format="fbx",
        target_format="glb"
    )

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
operationYes
robot_typeNo
model_pathNo
output_pathNo
formatNofbx
platformNounity
dimensionsNo
create_texturesNo
texture_styleNorealistic
robot_idNo
include_animationsNo
project_pathNo
create_prefabNo
source_pathNo
source_formatNo
target_formatNo
target_pathNo
spz_pathNo
output_formatNo
unity_project_pathNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • Core handler function 'robot_model' implementing the tool logic as a portmanteau for create, import, export, convert, and SPZ operations on robot 3D models. Dispatches to private helper methods based on 'operation' parameter.
    @self.mcp.tool()
    async def robot_model(
        operation: Literal["create", "import", "export", "convert", "spz_check", "spz_convert", "spz_extract", "spz_install"],
        robot_type: Optional[str] = None,
        model_path: Optional[str] = None,
        output_path: Optional[str] = None,
        format: Literal["fbx", "glb", "obj", "vrm", "blend"] = "fbx",
        platform: Literal["unity", "vrchat", "resonite"] = "unity",
        dimensions: Optional[Dict[str, float]] = None,
        create_textures: bool = True,
        texture_style: Literal["realistic", "stylized", "simple"] = "realistic",
        robot_id: Optional[str] = None,
        include_animations: bool = True,
        project_path: Optional[str] = None,
        create_prefab: bool = True,
        source_path: Optional[str] = None,
        source_format: Optional[Literal["fbx", "glb", "obj", "blend", "vrm"]] = None,
        target_format: Optional[Literal["fbx", "glb", "obj", "vrm"]] = None,
        target_path: Optional[str] = None,
        spz_path: Optional[str] = None,
        output_format: Optional[str] = None,
        unity_project_path: Optional[str] = None,
    ) -> Dict[str, Any]:
        """Robot model management portmanteau for Robotics MCP.
    
        PORTMANTEAU PATTERN RATIONALE:
        Instead of creating 4 separate tools (create, import, export, convert), this tool
        consolidates related model operations into a single interface. This design:
        - Prevents tool explosion (4 tools → 1 tool) while maintaining full functionality
        - Improves discoverability by grouping related operations together
        - Reduces cognitive load when working with robot models
        - Enables consistent model interface across all operations
        - Follows FastMCP 2.13+ best practices for feature-rich MCP servers
    
        SUPPORTED OPERATIONS:
        - create: Create robot 3D model from scratch using Blender MCP
        - import: Import robot 3D model into Unity/VRChat/Resonite project
        - export: Export robot model from Unity to file format
        - convert: Convert robot model between formats
        - spz_check: Check .spz conversion tool availability
        - spz_convert: Convert .spz file to .ply or other format
        - spz_extract: Extract metadata from .spz file
        - spz_install: Install Unity Gaussian Splatting plugin (alternative to .spz)
    
        Args:
            operation: The model operation to perform. MUST be one of:
                - "create": Create model (requires: robot_type, output_path)
                - "import": Import model (requires: robot_type, model_path)
                - "export": Export model (requires: robot_id)
                - "convert": Convert model (requires: source_path, source_format, target_format)
    
            robot_type: Type of robot (required for create/import).
                Examples: "scout", "go2", "g1", "robbie", "custom"
    
            model_path: Path to model file (required for import).
            output_path: Path for output file (required for create, optional for export/convert).
            format: Model format (used by create/import/export).
                - "fbx": Industry standard (recommended for robots)
                - "glb": Modern glTF 2.0 format
                - "obj": Simple mesh format
                - "vrm": VRM format (ONLY for humanoid robots)
            platform: Target platform for import (unity/vrchat/resonite).
            dimensions: Custom dimensions for create (length, width, height in meters).
            create_textures: Create textures using gimp-mcp (for create).
            texture_style: Texture style for create (realistic/stylized/simple).
            robot_id: Virtual robot identifier (required for export).
            include_animations: Include animations in export.
            project_path: Unity project path (for import).
            create_prefab: Create Unity prefab after import.
            source_path: Source file path (required for convert).
            source_format: Source file format (required for convert).
            target_format: Target file format (required for convert).
            target_path: Output file path (optional for convert).
    
        Returns:
            Dictionary containing operation-specific results.
    
        Examples:
            Create Scout model:
                result = await robot_model(
                    operation="create",
                    robot_type="scout",
                    output_path="D:/Models/scout_model.fbx",
                    format="fbx"
                )
    
            Import model to Unity:
                result = await robot_model(
                    operation="import",
                    robot_type="scout",
                    model_path="D:/Models/scout_model.fbx",
                    platform="unity"
                )
    
            Export robot from Unity:
                result = await robot_model(
                    operation="export",
                    robot_id="vbot_scout_01",
                    format="fbx"
                )
    
            Convert FBX to GLB:
                result = await robot_model(
                    operation="convert",
                    source_path="D:/Models/scout.fbx",
                    source_format="fbx",
                    target_format="glb"
                )
        """
        try:
            if operation == "create":
                if not robot_type or not output_path:
                    return format_error_response(
                        "robot_type and output_path are required for 'create' operation",
                        error_type="validation_error",
                    )
                return await self._handle_create(
                    robot_type, output_path, format, dimensions, create_textures, texture_style
                )
            elif operation == "import":
                if not robot_type or not model_path:
                    return format_error_response(
                        "robot_type and model_path are required for 'import' operation",
                        error_type="validation_error",
                    )
                return await self._handle_import(robot_type, model_path, format, platform, project_path, create_prefab)
            elif operation == "export":
                if not robot_id:
                    return format_error_response(
                        "robot_id is required for 'export' operation",
                        error_type="validation_error",
                    )
                return await self._handle_export(robot_id, format, output_path, include_animations)
            elif operation == "convert":
                if not source_path or not source_format or not target_format:
                    return format_error_response(
                        "source_path, source_format, and target_format are required for 'convert' operation",
                        error_type="validation_error",
                    )
                return await self._handle_convert(source_path, source_format, target_format, target_path, robot_type)
            elif operation == "spz_check":
                return await self._handle_spz_check()
            elif operation == "spz_convert":
                if not spz_path:
                    return format_error_response("spz_path required for spz_convert", error_type="validation_error")
                return await self._handle_spz_convert(spz_path, target_path, output_format)
            elif operation == "spz_extract":
                if not spz_path:
                    return format_error_response("spz_path required for spz_extract", error_type="validation_error")
                return await self._handle_spz_extract(spz_path)
            elif operation == "spz_install":
                if not unity_project_path:
                    return format_error_response("unity_project_path required for spz_install", error_type="validation_error")
                return await self._handle_spz_install(unity_project_path)
            else:
                return format_error_response(f"Unknown operation: {operation}", error_type="validation_error")
        except Exception as e:
            return handle_tool_error("robot_model", e, operation=operation)
  • Registers the RobotModelTools instance, which adds the 'robot_model' tool to the FastMCP server.
    self.robot_model_tools.register()  # Model: create, import, export, convert, spz operations
    logger.debug("Registered robot_model_tools tool")
  • Input schema defined by function parameters with Literal types for operations, formats, platforms, etc., providing validation and autocomplete.
    async def robot_model(
        operation: Literal["create", "import", "export", "convert", "spz_check", "spz_convert", "spz_extract", "spz_install"],
        robot_type: Optional[str] = None,
        model_path: Optional[str] = None,
        output_path: Optional[str] = None,
        format: Literal["fbx", "glb", "obj", "vrm", "blend"] = "fbx",
        platform: Literal["unity", "vrchat", "resonite"] = "unity",
        dimensions: Optional[Dict[str, float]] = None,
        create_textures: bool = True,
        texture_style: Literal["realistic", "stylized", "simple"] = "realistic",
        robot_id: Optional[str] = None,
        include_animations: bool = True,
        project_path: Optional[str] = None,
        create_prefab: bool = True,
        source_path: Optional[str] = None,
        source_format: Optional[Literal["fbx", "glb", "obj", "blend", "vrm"]] = None,
        target_format: Optional[Literal["fbx", "glb", "obj", "vrm"]] = None,
        target_path: Optional[str] = None,
        spz_path: Optional[str] = None,
        output_format: Optional[str] = None,
        unity_project_path: Optional[str] = None,
    ) -> Dict[str, Any]:
  • The register() method defines and registers the 'robot_model' tool using @self.mcp.tool() decorator.
    def register(self):
        """Register robot model portmanteau tool with MCP server."""
  • Example helper: _handle_create implements the 'create' operation logic, validating inputs and calling Blender MCP for model generation.
    async def _handle_create(
        self,
        robot_type: str,
        output_path: str,
        format: str,
        dimensions: Optional[Dict[str, float]],
        create_textures: bool,
        texture_style: str,
    ) -> Dict[str, Any]:
        """Handle create operation."""
        try:
            if "blender" not in self.mounted_servers:
                return format_error_response(
                    "blender-mcp not available - required for model creation",
                    error_type="not_available",
                    details={"mounted_servers": list(self.mounted_servers.keys())},
                )
    
            if not dimensions:
                dimensions = self._get_default_dimensions(robot_type)
    
            return await self._create_model_via_blender(
                robot_type, output_path, format, dimensions, create_textures, texture_style
            )
        except Exception as e:
            return handle_tool_error("robot_model", e, operation="create")
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. While it lists operations and their requirements, it doesn't describe important behavioral traits: whether operations are read-only or destructive, authentication requirements, rate limits, error handling, or what the return dictionary contains. The description mentions 'operation-specific results' but gives no details about success/failure patterns or side effects.

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

Conciseness2/5

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

The description is excessively long (over 600 words) with significant redundancy. The portmanteau rationale section is verbose and could be condensed. Parameter explanations are thorough but could be more structured. While the information is valuable, it's not front-loaded efficiently - users must read through extensive rationale before getting to the core operations and parameters.

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

Completeness4/5

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

Given the tool's high complexity (20 parameters, 8 operations), no annotations, but with an output schema, the description provides substantial context. It comprehensively documents all operations and parameters with examples. The main gap is behavioral transparency - without annotations, it should describe safety, side effects, and error handling more explicitly. However, the parameter documentation and examples compensate significantly.

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

Parameters5/5

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

With 0% schema description coverage and 20 parameters, the description provides extensive parameter semantics that fully compensate. It explains each parameter's purpose, when they're required, provides examples (like robot_type examples), clarifies format options with recommendations, and maps parameters to specific operations. This goes far beyond what the bare schema provides and makes the parameters understandable.

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 this is a 'Robot model management portmanteau' that consolidates related model operations. It specifies the exact operations supported (create, import, export, convert, spz_* operations) and mentions the resource (robot 3D models). However, it doesn't explicitly differentiate from sibling tools like robot_behavior or robot_control, which likely handle different aspects of robotics.

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

Usage Guidelines3/5

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

The description provides implicit usage guidance through the 'SUPPORTED OPERATIONS' section and examples, showing when to use different operations. However, it lacks explicit guidance on when to choose this tool over sibling tools (like robot_behavior or robot_control) or when not to use certain operations. The portmanteau rationale explains why operations are grouped, but not when to use this specific tool versus alternatives.

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/sandraschi/robotics-mcp'

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