Skip to main content
Glama
MausRundung

Project Explorer MCP Server

by MausRundung

delete_file

Permanently delete files or directories within allowed directories. Requires explicit 'recursive' flag for non-empty directories. Use with caution as deletion is irreversible.

Instructions

Delete a file or directory. Use with extreme caution as this operation cannot be undone. When deleting directories, all contents will be permanently removed. The recursive option must be explicitly set to true to delete non-empty directories. Only works within allowed directories.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the file or directory to delete
recursiveNoSet to true to delete directories and their contents recursively. Required for non-empty directories.
forceNoSet to true to force deletion even if file is read-only. Use with caution.

Implementation Reference

  • The 'delete_file' tool definition including its name, description, and inputSchema (path, recursive, force).
    export const deleteFileTool = {
      name: "delete_file",
      description: "Delete a file or directory. Use with extreme caution as this operation cannot be undone. When deleting directories, all contents will be permanently removed. The recursive option must be explicitly set to true to delete non-empty directories. Only works within allowed directories.",
      inputSchema: {
        type: "object",
        properties: {
          path: {
            type: "string",
            description: "Path to the file or directory to delete"
          },
          recursive: {
            type: "boolean",
            description: "Set to true to delete directories and their contents recursively. Required for non-empty directories.",
            default: false
          },
          force: {
            type: "boolean", 
            description: "Set to true to force deletion even if file is read-only. Use with caution.",
            default: false
          }
        },
        required: ["path"],
        additionalProperties: false
      }
    };
  • The handleDeleteFile function that implements the core logic: validates path, checks allowed directories, handles file vs directory deletion with recursive and force options.
    export async function handleDeleteFile(args: any, allowedDirectories: string[]) {
      const { path: targetPath, recursive = false, force = false } = args;
    
      if (!targetPath) {
        throw new McpError(ErrorCode.InvalidParams, "Path is required");
      }
    
      // Resolve to absolute path
      const resolvedPath = path.resolve(targetPath);
    
      // Check if path is within allowed directories
      const isPathAllowed = allowedDirectories.some(dir => {
        const normalizedDir = path.resolve(dir).replace(/\\/g, '/');
        const normalizedPath = resolvedPath.replace(/\\/g, '/');
        return normalizedPath === normalizedDir || normalizedPath.startsWith(normalizedDir + '/');
      });
    
      if (!isPathAllowed) {
        throw new McpError(ErrorCode.InvalidParams, `Path "${resolvedPath}" is not within allowed directories`);
      }
    
      try {
        // Check if path exists
        if (!fs.existsSync(resolvedPath)) {
          throw new McpError(ErrorCode.InvalidParams, `Path "${resolvedPath}" does not exist`);
        }
    
        // Get file stats to determine if it's a file or directory
        const stats = fs.statSync(resolvedPath);
        const isDirectory = stats.isDirectory();
    
        if (isDirectory) {
          // Check if directory is empty
          const contents = fs.readdirSync(resolvedPath);
          const isEmpty = contents.length === 0;
    
          if (!isEmpty && !recursive) {
            throw new McpError(
              ErrorCode.InvalidParams, 
              `Directory "${resolvedPath}" is not empty. Set recursive=true to delete directory and all its contents.`
            );
          }
    
          // Delete directory
          if (recursive) {
            fs.rmSync(resolvedPath, { recursive: true, force: force });
          } else {
            fs.rmdirSync(resolvedPath);
          }
    
          const message = `# Directory Deletion Successful\n\nāœ… Successfully deleted directory "${targetPath}"${recursive ? ' and all its contents' : ''}\n\n**Details:**\n- Path: ${resolvedPath}\n- Type: Directory\n- Recursive: ${recursive ? 'Yes' : 'No'}\n- Force: ${force ? 'Yes' : 'No'}`;
          
          return {
            content: [
              {
                type: "text",
                text: message
              }
            ]
          };
    
        } else {
          // Delete file
          if (force) {
            // Remove read-only attribute if forcing
            try {
              fs.chmodSync(resolvedPath, 0o666);
            } catch (chmodError) {
              // Ignore chmod errors, proceed with deletion
            }
          }
    
          fs.unlinkSync(resolvedPath);
    
          const message = `# File Deletion Successful\n\nāœ… Successfully deleted file "${targetPath}"\n\n**Details:**\n- Path: ${resolvedPath}\n- Type: File\n- Force: ${force ? 'Yes' : 'No'}`;
          
          return {
            content: [
              {
                type: "text",
                text: message
              }
            ]
          };
        }
    
      } catch (error: any) {
        if (error instanceof McpError) {
          throw error;
        }
    
        // Provide more specific error messages
        let errorMessage = `Failed to delete "${targetPath}": ${error.message}`;
        
        if (error.code === 'ENOTEMPTY') {
          errorMessage = `Directory "${targetPath}" is not empty. Use recursive=true to delete directory and contents.`;
        } else if (error.code === 'EACCES' || error.code === 'EPERM') {
          errorMessage = `Permission denied when trying to delete "${targetPath}". Try using force=true or check file permissions.`;
        } else if (error.code === 'EBUSY') {
          errorMessage = `File "${targetPath}" is currently in use and cannot be deleted.`;
        }
        
        throw new McpError(ErrorCode.InternalError, errorMessage);
      }
    }
  • The DeleteResult interface defining the return shape of the deletion operation.
    export interface DeleteResult {
      success: boolean;
      deletedPath: string;
      type: 'file' | 'directory';
      message: string;
    }
  • src/index.ts:16-16 (registration)
    Import of deleteFileTool and handleDeleteFile from the delete-file module.
    import { deleteFileTool, handleDeleteFile } from './delete-file.js';
  • src/index.ts:40-40 (registration)
    Registration of deleteFileTool in the list of available tools for the server.
    deleteFileTool,
  • src/index.ts:65-66 (registration)
    Routing of the 'delete_file' tool name to the handleDeleteFile handler function.
    case "delete_file":
      return await handleDeleteFile(args, ALLOWED_DIRECTORIES);
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It states the operation cannot be undone, recursive requirement for directories, force option for read-only files. Does not detail return values or error conditions, but covers key behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each informative: purpose, caution, recursive condition, scope. No filler words, efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Does not describe return values (e.g., success confirmation) or error handling (path not found, permission denied). Given no output schema, this gap is notable for a destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter schema coverage is 100% with descriptions. The tool description adds context like 'Use with extreme caution' for the entire action, and clarifies 'recursive must be explicitly set to true' and 'force deletion even if read-only', supplementing the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete a file or directory' with the verb 'Delete' and resource 'file or directory'. It distinguishes from siblings like rename_file and search_files by emphasizing irreversibility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit warnings about caution and irreversibility, explains when recursive is needed, and mentions scope restrictions ('Only works within allowed directories'). Does not explicitly name alternatives but implies checking list_allowed_directories.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MausRundung/mcp-explorer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server