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}` } ] }; } } ); } )