readfile
Access file contents from a specified path using the MCP File Server. This tool allows AI models to read local files efficiently through a standardized protocol.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to the file to read |
Implementation Reference
- src/index.js:106-169 (handler)The handler function that implements the logic for the 'readfile' tool. It reads the specified file using fs.readFile, handles errors, instruments with Sentry spans, and returns the file content.async ({ filePath }) => { return await Sentry.startSpan( { name: "readFile", op: "tool.readfile", attributes: { 'file.path': filePath } }, async (span) => { try { const startTime = Date.now(); const fileStats = await fs.stat(filePath); span.setAttributes({ 'file.size': fileStats.size, 'file.exists': true }); // Read the file content const content = await fs.readFile(filePath, 'utf8'); const endTime = Date.now(); // Set operation metrics in span span.setAttributes({ 'operation.duration_ms': endTime - startTime, // Store a truncated version of content if it's very large to avoid bloating spans 'file.content.preview': content.length > 1000 ? content.substring(0, 1000) + '...' : content, 'file.content.length': content.length }); span.setStatus("ok"); return { content: [ { type: "text", text: content } ] }; } catch (error) { // Add error information to the span span.setAttributes({ 'error.message': error.message, 'error.stack': error.stack, 'file.exists': false }); span.setStatus("error"); // Capture the exception for Sentry Sentry.captureException(error); return { content: [ { type: "text", text: `Error reading file: ${error.message}` } ] }; } } ); }
- src/index.js:103-105 (schema)The input schema for the 'readfile' tool, defining the required 'filePath' parameter using Zod.{ filePath: z.string().describe("Path to the file to read") },
- src/index.js:101-170 (registration)The registration of the 'readfile' tool using server.tool(), including name, schema, and handler.server.tool( "readfile", { filePath: z.string().describe("Path to the file to read") }, async ({ filePath }) => { return await Sentry.startSpan( { name: "readFile", op: "tool.readfile", attributes: { 'file.path': filePath } }, async (span) => { try { const startTime = Date.now(); const fileStats = await fs.stat(filePath); span.setAttributes({ 'file.size': fileStats.size, 'file.exists': true }); // Read the file content const content = await fs.readFile(filePath, 'utf8'); const endTime = Date.now(); // Set operation metrics in span span.setAttributes({ 'operation.duration_ms': endTime - startTime, // Store a truncated version of content if it's very large to avoid bloating spans 'file.content.preview': content.length > 1000 ? content.substring(0, 1000) + '...' : content, 'file.content.length': content.length }); span.setStatus("ok"); return { content: [ { type: "text", text: content } ] }; } catch (error) { // Add error information to the span span.setAttributes({ 'error.message': error.message, 'error.stack': error.stack, 'file.exists': false }); span.setStatus("error"); // Capture the exception for Sentry Sentry.captureException(error); return { content: [ { type: "text", text: `Error reading file: ${error.message}` } ] }; } } ); } )