get_file_info
Retrieve file metadata including size, timestamps, permissions, and content details for text or Excel files using absolute paths.
Instructions
Retrieve detailed metadata about a file or directory including:
- size
- creation time
- last modified time
- permissions
- type
- lineCount (for text files)
- lastLine (zero-indexed number of last line, for text files)
- appendPosition (line number for appending, for text files)
- sheets (for Excel files - array of {name, rowCount, colCount})
Only works within allowed directories.
IMPORTANT: Always use absolute paths for reliability. Paths are automatically normalized regardless of slash direction. Relative paths may fail as they depend on the current working directory. Tilde paths (~/...) might not work in all contexts. Unless the user explicitly asks for relative paths, use absolute paths.
This command can be referenced as "DC: ..." or "use Desktop Commander to ..." in your instructions.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Implementation Reference
- MCP tool handler for get_file_info: parses args with schema, calls getFileInfo(path), formats result as text ServerResult.export async function handleGetFileInfo(args: unknown): Promise<ServerResult> { try { const parsed = GetFileInfoArgsSchema.parse(args); const info = await getFileInfo(parsed.path); // Generic formatting for any file type const formattedText = Object.entries(info) .map(([key, value]) => `${key}: ${formatValue(value)}`) .join('\n'); return { content: [{ type: "text", text: formattedText }], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return createErrorResponse(errorMessage); } }
- src/tools/schemas.ts:120-122 (schema)Zod input schema for get_file_info tool requiring 'path' string.export const GetFileInfoArgsSchema = z.object({ path: z.string(), });
- src/tools/filesystem.ts:750-827 (helper)Core getFileInfo function: validates path, fetches stats and type-specific metadata (lines, sheets, PDF pages, etc.), returns detailed file info record.export async function getFileInfo(filePath: string): Promise<Record<string, any>> { const validPath = await validatePath(filePath); // Get fs.stat as a fallback for any missing fields const stats = await fs.stat(validPath); const fallbackInfo = { size: stats.size, created: stats.birthtime, modified: stats.mtime, accessed: stats.atime, isDirectory: stats.isDirectory(), isFile: stats.isFile(), permissions: stats.mode.toString(8).slice(-3), fileType: 'text' as const, metadata: undefined as Record<string, any> | undefined, }; // Get appropriate handler for this file type (async - includes binary detection) const handler = await getFileHandler(validPath); // Use handler to get file info, with fallback let fileInfo; try { fileInfo = await handler.getInfo(validPath); } catch (error) { // If handler fails, use fallback stats fileInfo = fallbackInfo; } // Convert to legacy format (for backward compatibility) // Use handler values with fallback to fs.stat values for any missing fields const info: Record<string, any> = { size: fileInfo.size ?? fallbackInfo.size, created: fileInfo.created ?? fallbackInfo.created, modified: fileInfo.modified ?? fallbackInfo.modified, accessed: fileInfo.accessed ?? fallbackInfo.accessed, isDirectory: fileInfo.isDirectory ?? fallbackInfo.isDirectory, isFile: fileInfo.isFile ?? fallbackInfo.isFile, permissions: fileInfo.permissions ?? fallbackInfo.permissions, fileType: fileInfo.fileType ?? fallbackInfo.fileType, }; // Add type-specific metadata from file handler if (fileInfo.metadata) { // For text files if (fileInfo.metadata.lineCount !== undefined) { info.lineCount = fileInfo.metadata.lineCount; info.lastLine = fileInfo.metadata.lineCount - 1; info.appendPosition = fileInfo.metadata.lineCount; } // For Excel files if (fileInfo.metadata.sheets) { info.sheets = fileInfo.metadata.sheets; info.isExcelFile = true; } // For images if (fileInfo.metadata.isImage) { info.isImage = true; } // For PDF files if (fileInfo.metadata.isPdf) { info.isPdf = true; info.totalPages = fileInfo.metadata.totalPages; if (fileInfo.metadata.title) info.title = fileInfo.metadata.title; if (fileInfo.metadata.author) info.author = fileInfo.metadata.author; } // For binary files if (fileInfo.metadata.isBinary) { info.isBinary = true; } } return info; }