read_multiple_files
Read content from multiple files simultaneously using the MCP File System. Input an array of file paths to retrieve data efficiently.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Array of file paths to read |
Implementation Reference
- src/index.ts:52-74 (handler)The handler function for the 'read_multiple_files' tool. It validates each file path, reads the contents using fs.readFile, handles individual file errors with Promise.allSettled, formats the output as text, and returns it in the expected MCP format.async ({ paths }: { paths: string[] }) => { const results = await Promise.allSettled( paths.map(async (filePath: string) => { try { const validPath = validatePath(filePath); const content = await fs.readFile(validPath, 'utf-8'); return { path: filePath, content, success: true }; } catch (error: any) { return { path: filePath, error: error.message, success: false }; } }) ); const output = results.map(result => { if (result.status === 'fulfilled') { return `${result.value.path}: ${result.value.success ? result.value.content : `Error: ${result.value.error}`}`; } return `Error processing file: ${result.reason}`; }).join('\n\n'); return { content: [{ type: 'text', text: output }] }; }
- src/index.ts:51-51 (schema)The input schema for the 'read_multiple_files' tool, specifying an array of file paths.{ paths: z.array(z.string()).describe("Array of file paths to read") },
- src/index.ts:49-75 (registration)The registration of the 'read_multiple_files' tool using server.tool, including name, schema, and handler reference.server.tool( "read_multiple_files", { paths: z.array(z.string()).describe("Array of file paths to read") }, async ({ paths }: { paths: string[] }) => { const results = await Promise.allSettled( paths.map(async (filePath: string) => { try { const validPath = validatePath(filePath); const content = await fs.readFile(validPath, 'utf-8'); return { path: filePath, content, success: true }; } catch (error: any) { return { path: filePath, error: error.message, success: false }; } }) ); const output = results.map(result => { if (result.status === 'fulfilled') { return `${result.value.path}: ${result.value.success ? result.value.content : `Error: ${result.value.error}`}`; } return `Error processing file: ${result.reason}`; }).join('\n\n'); return { content: [{ type: 'text', text: output }] }; } );
- src/index.ts:14-20 (helper)Helper function validatePath used by the handler to ensure file paths are within allowed directories before reading.function validatePath(filePath: string): string { const absolutePath = path.resolve(filePath); if (!allowedDirs.some(dir => absolutePath.startsWith(path.resolve(dir)))) { throw new Error(`Access denied: ${filePath} is not within allowed directories`); } return absolutePath; }