Skip to main content
Glama

dev-kit-mcp-server

edit.py3.58 kB
"""Module for editing files in the workspace.""" from dataclasses import dataclass from pathlib import Path from typing import Any, Dict from ...core import AsyncOperation @dataclass class EditFileOperation(AsyncOperation): """Class to edit a file in the workspace by replacing lines between start and end with new text.""" name = "edit_file" def _edit_file(self, path: str, start_line: int, end_line: int, text: str) -> None: """Edit a file by replacing lines between start and end with new text. Args: path: Path to the file to edit start_line: Line number to start replacing from (1-based) end_line: Line number to end replacing at (1-based, inclusive) text: Text to insert between start_line and end_line Raises: FileNotFoundError: If the path does not exist ValueError: If start_line or end_line is invalid IsADirectoryError: If the path is a directory """ # Validate that the path is within the root directory root_path = self._root_path abs_path = self._validate_path_in_root(root_path, path) # Check if path exists file_path = Path(abs_path) if not file_path.exists(): raise FileNotFoundError(f"Path does not exist: {path}") # Check if path is a file if file_path.is_dir(): raise IsADirectoryError(f"Path is a directory, not a file: {path}") # Validate line numbers if start_line < 1: raise ValueError(f"Start line must be at least 1, got {start_line}") if end_line < start_line: raise ValueError(f"End line must be greater than or equal to start line, got {end_line} < {start_line}") # Read the file with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() # Validate line numbers against file length if start_line > len(lines) + 1: raise ValueError(f"Start line {start_line} is beyond the end of the file ({len(lines)} lines)") if end_line > len(lines): end_line = len(lines) # Adjust end_line if it's beyond the file length # Prepare the new content # Convert text to lines with newline characters new_lines = text.splitlines(True) if new_lines and not new_lines[-1].endswith("\n"): new_lines[-1] += "\n" # Ensure the last line ends with a newline # Replace the lines new_content = lines[: start_line - 1] + new_lines + lines[end_line:] # Write the file with open(file_path, "w", encoding="utf-8") as f: f.writelines(new_content) async def __call__(self, path: str, start_line: int, end_line: int, text: str) -> Dict[str, Any]: """Edit a file by replacing lines between start and end with new text. Args: path: Path to the file to edit start_line: Line number to start replacing from (1-based) end_line: Line number to end replacing at (1-based, inclusive) text: Text to insert between start_line and end_line Returns: A dictionary containing the status and details of the edit operation """ self._edit_file(path, start_line, end_line, text) return { "status": "success", "message": f"Successfully edited file: {path}", "path": path, "start_line": start_line, "end_line": end_line, "text_length": len(text), }

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/DanielAvdar/dev-kit-mcp-server'

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