Skip to main content
Glama
safurrier

MCP Filesystem Server

get_file_info

Retrieve detailed metadata about files or directories, including path information and output format options for system analysis.

Instructions

Retrieve detailed metadata about a file or directory.

Args:
    path: Path to the file or directory
    format: Output format ('text' or 'json')
    ctx: MCP context

Returns:
    Formatted file information

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathYes
formatNotext

Implementation Reference

  • MCP tool handler function for 'get_file_info'. Decorated with @mcp.tool() which registers it with the FastMCP server. Handles input parameters, delegates to FileOperations.get_file_info, formats output as text or JSON, and returns error messages.
    @mcp.tool()
    async def get_file_info(path: str, ctx: Context, format: str = "text") -> str:
        """Retrieve detailed metadata about a file or directory.
    
        Args:
            path: Path to the file or directory
            format: Output format ('text' or 'json')
            ctx: MCP context
    
        Returns:
            Formatted file information
        """
        try:
            components = get_components()
            info = await components["operations"].get_file_info(path)
    
            if format.lower() == "json":
                return json.dumps(info.to_dict(), indent=2)
            else:
                return str(info)
        except Exception as e:
            return f"Error getting file info: {str(e)}"
  • Core implementation of get_file_info in FileOperations class. Performs path validation using PathValidator, checks existence, and instantiates/returns a FileInfo object.
    async def get_file_info(self, path: Union[str, Path]) -> FileInfo:
        """Get detailed information about a file or directory.
    
        Args:
            path: Path to the file or directory
    
        Returns:
            FileInfo object with detailed information
    
        Raises:
            ValueError: If path is outside allowed directories
            FileNotFoundError: If file does not exist
        """
        abs_path, allowed = await self.validator.validate_path(path)
        if not allowed:
            raise ValueError(f"Path outside allowed directories: {path}")
    
        if not abs_path.exists():
            raise FileNotFoundError(f"File not found: {path}")
    
        return FileInfo(abs_path)
  • FileInfo dataclass defining the output schema for file metadata, including methods for dictionary serialization (to_dict) and string representation (__str__). Used by get_file_info implementations.
    class FileInfo:
        """Information about a file or directory."""
    
        def __init__(self, path: Path):
            """Initialize with a file path.
    
            Args:
                path: Path to the file or directory
    
            Raises:
                FileNotFoundError: If the file or directory does not exist
            """
            self.path = path
            self.stat = path.stat()
            self.is_dir = path.is_dir()
            self.is_file = path.is_file()
            self.is_symlink = path.is_symlink()
            self.size = self.stat.st_size
            self.created = datetime.fromtimestamp(self.stat.st_ctime)
            self.modified = datetime.fromtimestamp(self.stat.st_mtime)
            self.accessed = datetime.fromtimestamp(self.stat.st_atime)
            self.name = path.name
    
            # Format permissions similar to Unix 'ls -l'
            mode = self.stat.st_mode
            self.permissions = "".join(
                [
                    "r" if mode & stat.S_IRUSR else "-",
                    "w" if mode & stat.S_IWUSR else "-",
                    "x" if mode & stat.S_IXUSR else "-",
                    "r" if mode & stat.S_IRGRP else "-",
                    "w" if mode & stat.S_IWGRP else "-",
                    "x" if mode & stat.S_IXGRP else "-",
                    "r" if mode & stat.S_IROTH else "-",
                    "w" if mode & stat.S_IWOTH else "-",
                    "x" if mode & stat.S_IXOTH else "-",
                ]
            )
    
            # Numeric permissions in octal
            self.permissions_octal = oct(mode & 0o777)[2:]
    
        def to_dict(self) -> Dict:
            """Convert to dictionary.
    
            Returns:
                Dictionary with file information
            """
            return {
                "name": self.name,
                "path": str(self.path),
                "size": self.size,
                "created": self.created.isoformat(),
                "modified": self.modified.isoformat(),
                "accessed": self.accessed.isoformat(),
                "is_directory": self.is_dir,
                "is_file": self.is_file,
                "is_symlink": self.is_symlink,
                "permissions": self.permissions,
                "permissions_octal": self.permissions_octal,
            }
    
        def __str__(self) -> str:
            """Get string representation.
    
            Returns:
                Formatted string with file information
            """
            file_type = "Directory" if self.is_dir else "File"
            symlink_info = " (symlink)" if self.is_symlink else ""
            size_str = f"{self.size:,} bytes"
    
            return (
                f"{file_type}{symlink_info}: {self.path}\n"
                f"Size: {size_str}\n"
                f"Created: {self.created.isoformat()}\n"
                f"Modified: {self.modified.isoformat()}\n"
                f"Accessed: {self.accessed.isoformat()}\n"
                f"Permissions: {self.permissions} ({self.permissions_octal})"
            )

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/safurrier/mcp-filesystem'

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