Skip to main content
Glama
kurdin

GitHub Repos Manager MCP Server

file-management.cjs5.08 kB
// src/handlers/file-management.cjs const { getOwnerRepo } = require("../utils/shared-utils.cjs"); async function createFileHandler(params, defaultRepo, apiService) { try { const { owner, repo } = getOwnerRepo(params, defaultRepo); const { path: filePath, content, message, branch, is_binary, } = params; if (!filePath || !content || !message) { throw new Error("File path, content, and message are required for creating a file."); } let fileContent = content; if (is_binary) { // Assuming content for binary is already base64 encoded by the client or a previous step // If not, this is where encoding from a local path or raw binary data would happen. // For now, we trust `content` is base64 if `is_binary` is true. } else { // For text files, ensure content is a string and then base64 encode it for the API fileContent = Buffer.from(String(content)).toString("base64"); } const result = await apiService.createOrUpdateFile( owner, repo, filePath, message, fileContent, null, // sha is null for creating new files branch ); return { success: true, message: `File '${filePath}' created successfully.`, data: result, }; } catch (error) { return { success: false, message: `Error creating file: ${error.message}`, error: error.toString(), }; } } async function updateFileHandler(params, defaultRepo, apiService) { try { const { owner, repo } = getOwnerRepo(params, defaultRepo); const { path: filePath, content, message, sha, branch, is_binary, } = params; if (!filePath || !content || !message || !sha) { throw new Error("File path, content, message, and SHA are required for updating a file."); } let fileContent = content; if (is_binary) { // As with create, assuming content is base64 if is_binary. } else { fileContent = Buffer.from(String(content)).toString("base64"); } const result = await apiService.createOrUpdateFile( owner, repo, filePath, message, fileContent, sha, branch ); return { success: true, message: `File '${filePath}' updated successfully.`, data: result, }; } catch (error) { return { success: false, message: `Error updating file: ${error.message}`, error: error.toString(), }; } } async function uploadFileHandler(params, defaultRepo, apiService) { try { const { owner, repo } = getOwnerRepo(params, defaultRepo); const { path_in_repo: filePathInRepo, local_file_path: localFilePath, message, branch, } = params; if (!filePathInRepo || !localFilePath || !message) { throw new Error("Repository path, local file path, and message are required for uploading a file."); } // Read and encode file content const fs = require("fs").promises; const fileContent = await fs.readFile(localFilePath); const base64Content = Buffer.from(fileContent).toString("base64"); // Check if file exists to get SHA for update, otherwise create let sha = null; try { const existingFile = await apiService.getRepoContents( owner, repo, filePathInRepo, branch ); if (existingFile && existingFile.sha) { sha = existingFile.sha; } } catch (error) { // If file not found, it's a new file, SHA remains null if (error.status !== 404) { throw error; // Re-throw other errors } } const result = await apiService.createOrUpdateFile( owner, repo, filePathInRepo, message, base64Content, sha, branch ); return { success: true, message: `File '${localFilePath}' uploaded to '${filePathInRepo}' successfully.`, data: result, }; } catch (error) { return { success: false, message: `Error uploading file: ${error.message}`, error: error.toString(), }; } } async function deleteFileHandler(params, defaultRepo, apiService) { try { const { owner, repo } = getOwnerRepo(params, defaultRepo); const { path: filePath, message, sha, branch } = params; if (!filePath || !message || !sha) { throw new Error("File path, message, and SHA are required for deleting a file."); } const result = await apiService.deleteFileFromRepo( owner, repo, filePath, message, sha, branch ); return { success: true, message: `File '${filePath}' deleted successfully.`, data: result, }; } catch (error) { return { success: false, message: `Error deleting file: ${error.message}`, error: error.toString(), }; } } module.exports = { createFileHandler, updateFileHandler, uploadFileHandler, deleteFileHandler, };

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/kurdin/github-repos-manager-mcp'

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