view
Access and inspect file contents or directory listings directly by specifying the path. Optionally view specific line ranges for precise information retrieval.
Instructions
View file contents or directory listing
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the file or directory | |
| view_range | No | Optional range of lines to view [start, end] |
Implementation Reference
- src/editor.ts:28-82 (handler)The core handler function implementing the 'view' tool logic: views directory listings or file contents with optional line range validation and output formatting.async view(args: ViewArgs): Promise<string> { await validatePath('view', args.path); if (await this.isDirectory(args.path)) { if (args.view_range) { throw new ToolError( 'The `view_range` parameter is not allowed when `path` points to a directory.' ); } const { stdout, stderr } = await execAsync( `find "${args.path}" -maxdepth 2 -not -path '*/\\.*'` ); if (stderr) throw new ToolError(stderr); return `Here's the files and directories up to 2 levels deep in ${args.path}, excluding hidden items:\n${stdout}\n`; } const fileContent = await readFile(args.path); let initLine = 1; if (args.view_range) { const fileLines = fileContent.split('\n'); const nLinesFile = fileLines.length; const [start, end] = args.view_range; if (start < 1 || start > nLinesFile) { throw new ToolError( `Invalid \`view_range\`: ${args.view_range}. Its first element \`${start}\` should be within the range of lines of the file: [1, ${nLinesFile}]` ); } if (end !== -1) { if (end > nLinesFile) { throw new ToolError( `Invalid \`view_range\`: ${args.view_range}. Its second element \`${end}\` should be smaller than the number of lines in the file: \`${nLinesFile}\`` ); } if (end < start) { throw new ToolError( `Invalid \`view_range\`: ${args.view_range}. Its second element \`${end}\` should be larger or equal than its first \`${start}\`` ); } } const selectedLines = end === -1 ? fileLines.slice(start - 1) : fileLines.slice(start - 1, end); return makeOutput(selectedLines.join('\n'), String(args.path), start); } return makeOutput(fileContent, String(args.path)); }
- src/server.ts:42-64 (registration)Registration of the 'view' tool in the MCP ListTools handler, defining name, description, and input schema.description: "View file contents or directory listing", inputSchema: { type: "object", properties: { path: { type: "string", description: "Absolute path to the file or directory" }, view_range: { type: "array", items: { type: "number" }, minItems: 2, maxItems: 2, description: "Optional range of lines to view [start, end]" } }, required: ["path"] } }, { name: "create",
- src/types.ts:14-17 (schema)TypeScript interface defining the input arguments for the 'view' tool.export interface ViewArgs extends Record<string, unknown> { path: string; view_range?: [number, number]; }
- src/types.ts:40-46 (schema)Runtime type guard function for validating 'view' tool arguments.export function isViewArgs(args: Record<string, unknown>): args is ViewArgs { return typeof args.path === "string" && (args.view_range === undefined || (Array.isArray(args.view_range) && args.view_range.length === 2 && args.view_range.every(n => typeof n === "number"))); }
- src/server.ts:150-155 (registration)Dispatch handler in CallToolRequestSchema that validates arguments and invokes the 'view' tool implementation.case "view": if (!request.params.arguments || !isViewArgs(request.params.arguments)) { throw new ToolError("Invalid arguments for view command"); // At least this one was right lol } result = await this.editor.view(request.params.arguments); break;