Skip to main content
Glama
GongRzhe

Terminal Controller for MCP

read_file

Read file content or specific lines from a file, with optional JSON parsing, for secure file system operations through the Terminal Controller MCP server.

Instructions

Read content from a file with optional row selection Args: path: Path to the file start_row: Starting row to read from (0-based, optional) end_row: Ending row to read to (0-based, inclusive, optional) as_json: If True, attempt to parse file content as JSON (optional) Returns: File content or selected lines, optionally parsed as JSON

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathYes
start_rowNo
end_rowNo
as_jsonNo

Implementation Reference

  • The handler function for the 'read_file' MCP tool. It reads the content of a specified file, supports optional line range selection (start_row, end_row), and can parse the content as JSON if requested. Includes safety checks for file existence, type, size, and permissions.
    @mcp.tool() async def read_file(path: str, start_row: int = None, end_row: int = None, as_json: bool = False) -> str: """ Read content from a file with optional row selection Args: path: Path to the file start_row: Starting row to read from (0-based, optional) end_row: Ending row to read to (0-based, inclusive, optional) as_json: If True, attempt to parse file content as JSON (optional) Returns: File content or selected lines, optionally parsed as JSON """ try: if not os.path.exists(path): return f"Error: File '{path}' does not exist." if not os.path.isfile(path): return f"Error: '{path}' is not a file." # Check file size before reading to prevent memory issues file_size = os.path.getsize(path) if file_size > 10 * 1024 * 1024: # 10 MB limit return f"Warning: File is very large ({file_size/1024/1024:.2f} MB). Consider using row selection." with open(path, 'r', encoding='utf-8', errors='replace') as file: lines = file.readlines() # If row selection is specified if start_row is not None: if start_row < 0: return "Error: start_row must be non-negative." # If only start_row is specified, read just that single row if end_row is None: if start_row >= len(lines): return f"Error: start_row {start_row} is out of range (file has {len(lines)} lines)." content = f"Line {start_row}: {lines[start_row]}" else: # Both start_row and end_row are specified if end_row < start_row: return "Error: end_row must be greater than or equal to start_row." if end_row >= len(lines): end_row = len(lines) - 1 selected_lines = lines[start_row:end_row+1] content = "" for i, line in enumerate(selected_lines): content += f"Line {start_row + i}: {line}" if not line.endswith('\n') else f"Line {start_row + i}: {line}" else: # If no row selection, return the entire file content = "".join(lines) # If as_json is True, try to parse the content as JSON if as_json: try: import json # If we're showing line numbers, we cannot parse as JSON if start_row is not None: return "Error: Cannot parse as JSON when displaying line numbers. Use as_json without row selection." # Try to parse the content as JSON parsed_json = json.loads(content) # Return pretty-printed JSON for better readability return json.dumps(parsed_json, indent=4, sort_keys=False, ensure_ascii=False) except json.JSONDecodeError as e: return f"Error: File content is not valid JSON. {str(e)}\n\nRaw content:\n{content}" return content except PermissionError: return f"Error: No permission to read file '{path}'." except Exception as e: return f"Error reading file: {str(e)}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/GongRzhe/terminal-controller-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server