Skip to main content
Glama

vm_file_pull

Transfer files from remote virtual machines to your local system using SCP for efficient file management in Incus VM environments.

Instructions

Pull a file from a remote host to the local host via SCP.

Args:
    vm: Name of the host (as configured in hosts.toml).
    remote_path: Absolute path to the file on the remote host.
    local_path: Destination path on the local host.

Returns:
    Success confirmation or error message.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
vmYes
remote_pathYes
local_pathYes

Implementation Reference

  • Main implementation of vm_file_pull - pulls a file from a remote host to the local host via SCP. Validates inputs, creates local directory if needed, and uses _run_scp to perform the transfer.
    async def vm_file_pull(
        vm: str,
        remote_path: str,
        local_path: str,
    ) -> ExecResult:
        """Pull a file from a remote host to the local host via SCP.
    
        Args:
            vm: Name of the host (as configured in hosts.toml).
            remote_path: Absolute path to the file on the remote host.
            local_path: Destination path on the local host.
    
        Returns:
            ExecResult with operation details.
        """
        host = _resolve_host(vm)
        _validate_path(remote_path)
        _validate_local_path(local_path)
    
        local_dir = Path(local_path).parent
        local_dir.mkdir(parents=True, exist_ok=True)
    
        return await _run_scp(
            host,
            [f"{host.scp_prefix}{remote_path}", local_path],
        )
  • MCP tool registration wrapper for vm_file_pull. Decorated with @mcp.tool(), this function calls the underlying transport implementation and formats the result as a user-friendly string with success/error messages.
    @mcp.tool()
    async def vm_file_pull(
        vm: str,
        remote_path: str,
        local_path: str,
    ) -> str:
        """Pull a file from a remote host to the local host via SCP.
    
        Args:
            vm: Name of the host (as configured in hosts.toml).
            remote_path: Absolute path to the file on the remote host.
            local_path: Destination path on the local host.
    
        Returns:
            Success confirmation or error message.
        """
        try:
            result = await _vm_file_pull(vm, remote_path, local_path)
            if result.exit_code == 0:
                return f"Successfully pulled {vm}:{remote_path} -> {local_path}"
            return f"ERROR pulling file: {result.stderr.strip()}"
        except (ValueError, KeyError, RuntimeError, OSError) as e:
            return f"ERROR: {e}"
  • Path validation helper - validates that remote paths are non-empty, contain no null bytes, and are absolute (start with '/'). Used by vm_file_pull to validate the remote_path parameter.
    def _validate_path(path: str) -> None:
        """Validate a file path on the remote host (basic safety checks)."""
        if not path or not path.strip():
            raise ValueError("Path cannot be empty")
        if "\x00" in path:
            raise ValueError("Path cannot contain null bytes")
        if not path.startswith("/"):
            raise ValueError(f"Path must be absolute (start with /): '{path}'")
  • Local path validation helper - validates that local paths are non-empty and contain no null bytes. Used by vm_file_pull to validate the local_path parameter.
    def _validate_local_path(path: str) -> None:
        """Validate a local file path on the host."""
        if not path or not path.strip():
            raise ValueError("Local path cannot be empty")
        if "\x00" in path:
            raise ValueError("Path cannot contain null bytes")
  • Host resolution helper - resolves a VM/host name to its SSH configuration from the loaded config. Used by vm_file_pull to get the HostConfig for the target VM.
    def _resolve_host(vm: str) -> HostConfig:
        """Resolve a VM/host name to its SSH config."""
        _validate_host_name(vm)
        config = _get_config()
        return config.get_host(vm)

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/bobbyhiddn/Sympathy-MCP'

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