From 9e0c6b468e09425e95b17be236ff8c0a1ac93a94 Mon Sep 17 00:00:00 2001 From: Todd Sharp <41924046+recursivecodes@users.noreply.github.com> Date: Wed, 2 Apr 2025 13:06:26 -0400 Subject: [PATCH] Modify 'directory_tree' to allow excluding subdirectories Useful when listing project directories that contain dependencies (like 'node_modules', for example), to avoid creating an input token too large to be processed. --- src/filesystem/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/filesystem/index.ts b/src/filesystem/index.ts index c544ff2571..b76778b5cb 100644 --- a/src/filesystem/index.ts +++ b/src/filesystem/index.ts @@ -129,6 +129,7 @@ const ListDirectoryArgsSchema = z.object({ const DirectoryTreeArgsSchema = z.object({ path: z.string(), + exclude: z.array(z.string()).optional().default([]), }); const MoveFileArgsSchema = z.object({ @@ -542,9 +543,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { children?: TreeEntry[]; } - async function buildTree(currentPath: string): Promise { + async function buildTree(currentPath: string, exclude: string[]): Promise { const validPath = await validatePath(currentPath); - const entries = await fs.readdir(validPath, {withFileTypes: true}); + const entries = (await fs.readdir(validPath, { withFileTypes: true })).filter((item) => item.isDirectory() && !(exclude.includes(item.name))); const result: TreeEntry[] = []; for (const entry of entries) { @@ -555,7 +556,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { if (entry.isDirectory()) { const subPath = path.join(currentPath, entry.name); - entryData.children = await buildTree(subPath); + entryData.children = await buildTree(subPath, exclude); } result.push(entryData); @@ -564,7 +565,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { return result; } - const treeData = await buildTree(parsed.data.path); + const treeData = await buildTree(parsed.data.path, parsed.data.exclude); return { content: [{ type: "text",