folder-structure
Analyze and visualize directory hierarchies to understand project organization and file relationships in codebases.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Relative path to the directory | . |
| depth | No | Depth of folders to show |
Implementation Reference
- src/features/dev-tools/index.ts:276-331 (handler)Handler function for the 'folder-structure' tool. Uses the 'find' command to list directories up to the specified depth, filters by depth, and returns a structured JSON response.async ({ path, depth }) => { try { const dirPath = resolve(process.cwd(), path); if (!existsSync(dirPath)) { throw new Error(`Directory not found: ${path}`); } const command = `find ${dirPath} -type d | sort | head -n 100 | awk 'BEGIN {FS="/"}{for(i=1;i<=NF;i++){if(i==NF){printf("%s\\n", $i)}else{printf("%s/", $i)}}}'`; let dirs = execSync(command, { encoding: "utf-8" }) .split("\n") .filter(Boolean); // Filter by depth dirs = dirs.filter((dir) => { const segments = dir.split("/"); return segments.length <= depth; }); const result = createSuccessResponse( { path, depth, count: dirs.length, directories: dirs, }, "folder-structure" ); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: JSON.stringify( createErrorResponse( error instanceof Error ? error.message : String(error), "folder-structure" ), null, 2 ), }, ], isError: true, }; } }
- Input schema for the 'folder-structure' tool using Zod: path (string, default '.'), depth (number, default 2).{ path: z.string().default(".").describe("Relative path to the directory"), depth: z.number().default(2).describe("Depth of folders to show"), },
- src/features/dev-tools/index.ts:270-332 (registration)Registration of the 'folder-structure' tool on the MCP server, including input schema and handler function.server.tool( "folder-structure", { path: z.string().default(".").describe("Relative path to the directory"), depth: z.number().default(2).describe("Depth of folders to show"), }, async ({ path, depth }) => { try { const dirPath = resolve(process.cwd(), path); if (!existsSync(dirPath)) { throw new Error(`Directory not found: ${path}`); } const command = `find ${dirPath} -type d | sort | head -n 100 | awk 'BEGIN {FS="/"}{for(i=1;i<=NF;i++){if(i==NF){printf("%s\\n", $i)}else{printf("%s/", $i)}}}'`; let dirs = execSync(command, { encoding: "utf-8" }) .split("\n") .filter(Boolean); // Filter by depth dirs = dirs.filter((dir) => { const segments = dir.split("/"); return segments.length <= depth; }); const result = createSuccessResponse( { path, depth, count: dirs.length, directories: dirs, }, "folder-structure" ); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: JSON.stringify( createErrorResponse( error instanceof Error ? error.message : String(error), "folder-structure" ), null, 2 ), }, ], isError: true, }; } } );