folder-structure
Visualize directory structures with customizable depth to analyze and organize project folders effectively within the CodeAnalysis MCP Server environment.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Depth of folders to show | |
| path | No | Relative path to the directory | . |
Implementation Reference
- src/features/dev-tools/index.ts:276-331 (handler)Handler function for the 'folder-structure' tool. Resolves the directory path, uses 'find' and 'awk' commands to list directories up to the specified depth, filters them, formats the response, and handles errors.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, }; } }
- Zod schema defining input parameters: 'path' (string, default '.') and '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)Registers the 'folder-structure' tool on the MCP server using server.tool(), including schema and handler.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, }; } } );