Skip to main content
Glama
alxspiker

MCP Server for FTP Access

upload-file

Upload files to FTP servers by specifying destination paths and content. This tool enables transferring files to remote FTP locations through the MCP server for FTP access.

Instructions

Upload a file to the FTP server

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
remotePathYesDestination path on the FTP server
contentYesContent to upload to the file

Implementation Reference

  • src/index.ts:99-130 (registration)
    Registration of the 'upload-file' MCP tool using server.tool(). Includes input schema (remotePath, content) and inline handler that calls ftpClient.uploadFile() and returns formatted text response.
    server.tool(
      "upload-file",
      "Upload a file to the FTP server",
      {
        remotePath: z.string().describe("Destination path on the FTP server"),
        content: z.string().describe("Content to upload to the file"),
      },
      async ({ remotePath, content }) => {
        try {
          await ftpClient.uploadFile(remotePath, content);
          
          return {
            content: [
              {
                type: "text",
                text: `File successfully uploaded to ${remotePath}`
              }
            ]
          };
        } catch (error) {
          return {
            isError: true,
            content: [
              {
                type: "text",
                text: `Error uploading file: ${error instanceof Error ? error.message : String(error)}`
              }
            ]
          };
        }
      }
    );
  • Zod input schema defining parameters for the upload-file tool: remotePath (destination path) and content (file content as string).
    {
      remotePath: z.string().describe("Destination path on the FTP server"),
      content: z.string().describe("Content to upload to the file"),
    },
  • Inline handler function for upload-file tool: invokes ftpClient.uploadFile with parameters and returns MCP-formatted success or error response.
    async ({ remotePath, content }) => {
      try {
        await ftpClient.uploadFile(remotePath, content);
        
        return {
          content: [
            {
              type: "text",
              text: `File successfully uploaded to ${remotePath}`
            }
          ]
        };
      } catch (error) {
        return {
          isError: true,
          content: [
            {
              type: "text",
              text: `Error uploading file: ${error instanceof Error ? error.message : String(error)}`
            }
          ]
        };
      }
    }
  • Core FTP upload logic in FtpClient class: writes content to temp file, uses basic-ftp Client.uploadFrom to upload to remotePath, handles connection and cleanup.
    async uploadFile(remotePath: string, content: string): Promise<boolean> {
      try {
        await this.connect();
        
        // Create a temporary file with the content
        const tempFilePath = path.join(this.tempDir, `upload-${Date.now()}-${path.basename(remotePath)}`);
        fs.writeFileSync(tempFilePath, content);
        
        // Upload the file
        await this.client.uploadFrom(tempFilePath, remotePath);
        
        // Clean up
        fs.unlinkSync(tempFilePath);
        
        await this.disconnect();
        return true;
      } catch (error) {
        console.error("Upload file error:", error);
        throw new Error(`Failed to upload file: ${error instanceof Error ? error.message : String(error)}`);
      }
    }

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/alxspiker/mcp-server-ftp'

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