list_files
Browse files and folders stored in Proton Drive by specifying a directory path to view its contents.
Instructions
List files and folders in Proton Drive
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path relative to Proton Drive root (e.g., "Documents" or "Projects/2024") |
Implementation Reference
- src/index.ts:260-305 (handler)The main handler for the 'list_files' tool. It validates the path, reads directory entries, filters out hidden files, fetches stats, builds file objects with relative paths, sorts (folders first), and returns JSON.case 'list_files': { const listPath = validatePath(args?.path as string || ''); try { const entries = await readdir(listPath, { withFileTypes: true }); const files = await Promise.all( entries .filter(entry => !entry.name.startsWith('.')) .map(async (entry) => { const fullPath = join(listPath, entry.name); const relativePath = getRelativePath(fullPath); const stats = await stat(fullPath); return { name: entry.name, path: relativePath, type: entry.isDirectory() ? 'folder' : 'file', size: stats.size, modified: stats.mtime.toISOString(), }; }) ); // Sort folders first, then files files.sort((a, b) => { if (a.type === b.type) { return a.name.localeCompare(b.name); } return a.type === 'folder' ? -1 : 1; }); return { content: [ { type: 'text', text: JSON.stringify(files, null, 2), }, ], }; } catch (error: any) { throw new McpError( ErrorCode.InternalError, `Cannot list directory: ${error.message}` ); } }
- src/index.ts:135-143 (schema)Input schema for list_files tool defining an optional 'path' property as string.inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path relative to Proton Drive root (e.g., "Documents" or "Projects/2024")' }, }, },
- src/index.ts:132-144 (registration)Registration of the 'list_files' tool in the listTools handler, providing name, description, and schema.{ name: 'list_files', description: 'List files and folders in Proton Drive', inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path relative to Proton Drive root (e.g., "Documents" or "Projects/2024")' }, }, }, },
- src/index.ts:91-111 (helper)validatePath helper used by list_files to secure and resolve relative paths to absolute within Proton Drive.function validatePath(relativePath: string): string { // Handle empty path if (!relativePath) { return PROTON_DRIVE_PATH; } // Clean the path - remove leading slashes and normalize const cleaned = relativePath .split(/[/\\]+/) .filter(Boolean) .join(sep); const fullPath = resolve(PROTON_DRIVE_PATH, cleaned); // Security check - ensure we're still within Proton Drive if (!fullPath.startsWith(PROTON_DRIVE_PATH)) { throw new Error('Invalid path: Access denied outside Proton Drive'); } return fullPath; }
- src/index.ts:114-119 (helper)getRelativePath helper used by list_files to compute display-friendly relative paths.function getRelativePath(fullPath: string): string { if (fullPath === PROTON_DRIVE_PATH) { return '/'; } return fullPath.replace(PROTON_DRIVE_PATH, '').replace(/^[/\\]/, '') || '/'; }