read_multiple_files
Enables simultaneous reading of multiple files in allowed directories, returning content with file paths. Ideal for efficient analysis or comparison. Handles failed reads without interrupting the entire operation.
Instructions
Read the contents of multiple files simultaneously. This is more efficient than reading files one by one when you need to analyze or compare multiple files. Each file's content is returned with its path as a reference. Failed reads for individual files won't stop the entire operation. Only works within allowed directories.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| encoding | No | File encoding | utf-8 |
| paths | Yes | List of file paths to read |
Implementation Reference
- src/utils/tools.ts:86-117 (handler)Core handler function that implements the read_multiple_files tool logic: validates paths and sizes for each file, reads contents concurrently using Promise.all, handles individual errors without failing the entire operation, returns a record mapping paths to content or Error.export async function readMultipleFiles( args: z.infer<typeof ReadMultipleFilesArgsSchema>, config: Config ): Promise<Record<string, string | Error>> { const endMetric = metrics.startOperation('read_multiple_files') const results: Record<string, string | Error> = {} await Promise.all( args.paths.map(async (filePath: string) => { try { const validPath = await validatePath(filePath, config) // Validate file size if (config.security.maxFileSize > 0) { await validateFileSize(validPath, config.security.maxFileSize) } const content = await fs.readFile(validPath, args.encoding) results[filePath] = content } catch (error) { if (error instanceof Error) { results[filePath] = error } else { results[filePath] = new Error(String(error)) } } }) ) endMetric() return results }
- src/utils/tools.ts:67-77 (schema)Zod schema defining input arguments for the read_multiple_files tool: array of paths and optional encoding./** * Schema for read_multiple_files arguments */ export const ReadMultipleFilesArgsSchema = z.object({ paths: z.array(z.string()).describe('List of file paths to read'), encoding: z .enum(['utf-8', 'utf8', 'base64']) .optional() .default('utf-8') .describe('File encoding'), })
- src/index.ts:244-253 (registration)Tool registration in the ListTools response: defines the tool name, description, and converts the Zod schema to JSON schema for MCP protocol.{ name: 'read_multiple_files', description: 'Read the contents of multiple files simultaneously. This is more ' + 'efficient than reading files one by one when you need to analyze ' + "or compare multiple files. Each file's content is returned with its " + "path as a reference. Failed reads for individual files won't stop " + 'the entire operation. Only works within allowed directories.', inputSchema: zodToJsonSchema(ReadMultipleFilesArgsSchema) as ToolInput, },
- src/index.ts:416-438 (handler)MCP server dispatcher case for read_multiple_files: parses input arguments using the schema, calls the core handler, formats results (including errors per file), and returns MCP-formatted response.case 'read_multiple_files': { const parsed = ReadMultipleFilesArgsSchema.safeParse(a) if (!parsed.success) { throw new FileSystemError(`Invalid arguments for ${name}`, 'INVALID_ARGS', undefined, { errors: parsed.error.format(), }) } const results = await readMultipleFiles(parsed.data, config) const formattedResults = Object.entries(results) .map(([filePath, content]) => { if (content instanceof Error) { return `${filePath}: Error - ${content.message}` } return `${filePath}:\n${content}\n` }) .join('\n---\n') endMetric() return { content: [{ type: 'text', text: formattedResults }], } }