MCP Server for FTP Access
FTP 액세스를 위한 MCP 서버
이 MCP(Model Context Protocol) 서버는 FTP 서버와 상호 작용하기 위한 도구를 제공합니다. 이를 통해 Claude.app에서 FTP 서버의 디렉터리 목록을 확인하고, 파일을 다운로드 및 업로드하며, 디렉터리를 생성하고, 파일/디렉터리를 삭제할 수 있습니다.
기능
디렉터리 내용 나열: FTP 서버의 파일 및 폴더 보기
파일 다운로드: FTP 서버에서 파일 내용 가져오기
파일 업로드: 새 파일 생성 또는 기존 파일 업데이트
디렉터리 생성: FTP 서버에 새 폴더 만들기
파일/디렉터리 삭제: 파일 또는 디렉터리 제거
Related MCP server: MCP SSH Server
설치
Smithery를 통한 설치
Smithery를 통해 Claude Desktop용 mcp-server-ftp를 자동으로 설치하려면:
npx -y @smithery/cli install @alxspiker/mcp-server-ftp --client claude사전 요구 사항
Node.js 16 이상
Claude for Desktop (또는 기타 MCP 호환 클라이언트)
소스에서 빌드
Linux/macOS
# Clone the repository
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
# Install dependencies
npm install
# Build the project
npm run buildWindows
# Clone the repository
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
# Run the Windows build helper script
build-windows.batbuild-windows.bat 스크립트는 Windows 시스템에서 종속성 설치 및 빌드를 처리하며, TypeScript 컴파일러에 문제가 있을 경우를 대비한 대체 옵션을 제공합니다.
구성
이 서버를 Claude for Desktop과 함께 사용하려면 구성 파일에 추가하십시오:
MacOS/Linux
~/Library/Application Support/Claude/claude_desktop_config.json을 편집합니다:
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "ftp.example.com",
"FTP_PORT": "21",
"FTP_USER": "your-username",
"FTP_PASSWORD": "your-password",
"FTP_SECURE": "false"
}
}
}
}Windows
%APPDATA%\Claude\claude_desktop_config.json을 편집합니다:
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["C:\\path\\to\\mcp-server-ftp\\build\\index.js"],
"env": {
"FTP_HOST": "ftp.example.com",
"FTP_PORT": "21",
"FTP_USER": "your-username",
"FTP_PASSWORD": "your-password",
"FTP_SECURE": "false"
}
}
}
}Windows 빌드 문제 해결
Windows에서 빌드 문제가 발생하는 경우:
일반적인 빌드 문제를 처리하는 제공된
build-windows.bat스크립트를 사용하십시오.Node.js와 npm이 올바르게 설치되었는지 확인하십시오.
TypeScript 컴파일러를 직접 실행해 보십시오:
npx tsc여전히 문제가 있는 경우, 다음을 실행하여
build디렉터리에 있는 사전 컴파일된 파일을 사용할 수 있습니다:node path\to\mcp-server-ftp\build\index.js
구성 옵션
환경 변수 | 설명 | 기본값 |
| FTP 서버 호스트 이름 또는 IP 주소 | localhost |
| FTP 서버 포트 | 21 |
| FTP 사용자 이름 (암호화 지원) | anonymous |
| FTP 비밀번호 (암호화 지원) | (빈 문자열) |
| 보안 FTP(FTPS) 사용, | false |
| 사용할 프로토콜: | ftp |
| SFTP용 SSH 개인 키 경로 (예: | (자동 감지) |
| SSH 개인 키용 암호 (암호화 지원) | (빈 문자열) |
| 자격 증명 복호화를 위한 64자 16진수 AES-256 키 | (비활성화됨) |
SSH / SFTP 지원
일반 FTP 및 FTPS 외에도, 이 서버는 암호화된 SSH 연결을 통해 실행되며 FTPS와는 관련이 없는 SSH 파일 전송 프로토콜인 SFTP를 지원합니다.
FTP_PROTOCOL=sftp로 설정하여 서버를 SFTP 모드로 전환하십시오. 기본 포트가 22로 변경됩니다.
인증
SFTP는 자동으로 선택되는 두 가지 인증 방법을 지원합니다:
개인 키 — 키가 발견되면(아래 참조) 인증에 사용됩니다.
FTP_PASSPHRASE는 키가 암호로 보호된 경우 키를 복호화하는 데 사용됩니다.비밀번호 — 키가 발견되지 않으면
FTP_PASSWORD가 비밀번호 인증에 사용됩니다.
키 검색
서버는 다음 순서로 개인 키를 찾습니다:
FTP_PRIVATE_KEY_PATH의 경로 (설정된 경우)~/.ssh/id_ed25519~/.ssh/id_rsa~/.ssh/id_ecdsa
구성 예시
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "sftp.example.com",
"FTP_PORT": "22",
"FTP_PROTOCOL": "sftp",
"FTP_USER": "your-username",
"FTP_PRIVATE_KEY_PATH": "~/.ssh/id_ed25519",
"FTP_PASSPHRASE": "your-key-passphrase"
}
}
}
}FTP_PASSPHRASE와 FTP_USER 모두 enc: 암호화 형식을 지원합니다. 자격 증명 암호화를 참조하십시오.
자격 증명 암호화
Claude 구성 파일에 일반 텍스트 비밀번호를 저장하는 것은 보안 위험이 있습니다. 서버는 FTP_USER 및 FTP_PASSWORD에 대해 AES-256-GCM 암호화를 지원하므로 구성 파일에는 항상 암호문만 포함됩니다.
1. 암호화 키 생성
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"이 키를 비밀로 유지하십시오. 마스터 비밀번호처럼 취급해야 합니다.
2. 자격 증명 값 암호화
npm run build
FTP_ENCRYPTION_KEY=<your-64-char-hex-key> npm run encrypt-env -- <plaintext-value>출력은 enc:<iv_hex>:<tag_hex>:<ciphertext_hex> 형식의 독립적인 암호화된 문자열입니다.
3. 구성에서 암호화된 값 사용
암호화된 자격 증명과 함께 FTP_ENCRYPTION_KEY를 설정하십시오. enc:로 시작하지 않는 값은 일반 텍스트로 처리되므로 선택적으로 암호화할 수 있습니다.
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "ftp.example.com",
"FTP_PORT": "21",
"FTP_USER": "enc:aabbcc...:ddeeff...:112233...",
"FTP_PASSWORD": "enc:aabbcc...:ddeeff...:112233...",
"FTP_SECURE": "false",
"FTP_ENCRYPTION_KEY": "<your-64-char-hex-key>"
}
}
}
}사용법
Claude for Desktop을 구성하고 다시 시작한 후, 자연어를 사용하여 FTP 작업을 수행할 수 있습니다:
"FTP 서버의 /public 디렉터리에 있는 파일 목록을 보여줘"
"FTP 서버에서 /data/report.txt 파일을 다운로드해줘"
"이 텍스트를 notes.txt라는 파일로 FTP 서버에 업로드해줘"
"FTP 서버에 'backups'라는 새 디렉터리를 만들어줘"
"FTP 서버에서 obsolete.txt 파일을 삭제해줘"
"FTP 서버에서 빈 디렉터리 /old-project를 제거해줘"
사용 가능한 도구
도구 이름 | 설명 |
| FTP 디렉터리의 내용 나열 |
| FTP 서버에서 파일 다운로드 |
| FTP 서버에 파일 업로드 |
| FTP 서버에 새 디렉터리 생성 |
| FTP 서버에서 파일 삭제 |
| FTP 서버에서 디렉터리 삭제 |
보안 고려 사항
구성 파일에 일반 텍스트 비밀번호가 저장되지 않도록 자격 증명 암호화 기능을 사용하십시오.
가능한 경우 일반 FTP나 FTPS보다 SFTP(
FTP_PROTOCOL=sftp)를 우선적으로 사용하십시오. SSH를 사용하며 인증서 관리가 필요하지 않습니다.서버가 지원하지만 SFTP를 사용할 수 없는 경우,
FTP_SECURE=true를 설정하여 FTPS(보안 FTP) 사용을 고려하십시오.서버는 업로드 및 다운로드를 위해 시스템의 임시 디렉터리에 임시 파일을 생성합니다.
라이선스
MIT
Available Tools
9 toolsappend-fileAppend to FileA
Append content to the end of a file on the FTP server (creates the file if it does not exist). Pass encoding "base64" for binary content.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Content to append to the file | |
| encoding | No | Encoding of the provided content (default: utf8) | |
| remotePath | Yes | Path of the file on the FTP server |
Output Schema
| Name | Required | Description |
|---|---|---|
| remotePath | Yes | |
| appendedBytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, idempotentHint=false, and readOnlyHint=false, covering the mutation profile. The description adds valuable behavioral context beyond annotations: the file is created if it doesn't exist (not obvious from annotations, which say non-destructive), and the binary encoding option. It doesn't mention permissions or error behavior, but the create-if-missing behavior is a meaningful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero waste. The core operation is front-loaded, and the create-if-missing and encoding hints follow immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param mutation tool with an output schema (return values need not be explained), the description covers the operation, create-if-missing behavior, and binary encoding. It could mention permissions or max file size but is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – all three parameters (remotePath, content, encoding) have descriptions and encoding has an enum. The description adds the 'base64 for binary content' hint, which clarifies the enum's purpose beyond the schema's plain 'Encoding of the provided content', but is largely redundant with the schema. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (append) and resource (file on FTP server) and distinguishes itself from siblings like upload-file (overwrites/uploads entire file) and edit-file (in-place modification) by specifying append-to-end semantics. The parenthetical about creating the file adds scope clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (appending rather than overwriting) but does not explicitly compare against siblings like upload-file or edit-file. An agent can infer the distinction from the verb 'append' but no explicit when/when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-directoryCreate DirectoryBIdempotent
Create a new directory on the FTP server
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Path of the directory to create |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | Yes | |
| remotePath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, covering the safety and idempotency profile. The description adds only that the operation targets the FTP server, which is minimal beyond the resource name. No additional behavioral context (e.g., what happens if directory exists, permission requirements) is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence with no wasted words. Purpose is front-loaded and immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, full schema coverage, annotations, and an output schema, the description is adequate but minimal. It lacks any guidance on usage context or edge cases, which could be helpful for an FTP directory creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents the single parameter. The description adds no parameter semantics beyond what the schema provides, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Create) and resource (directory) on the FTP server, making the purpose clear. It does not distinguish itself from siblings like delete-directory or list-directory, but the verb+resource combination is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided. The description does not mention prerequisites (e.g., parent directory must exist) or alternatives. An agent must infer usage from the tool name and schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-directoryDelete DirectoryCDestructiveIdempotent
Delete a directory from the FTP server
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Path of the directory to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| remotePath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds only the target system and says nothing about empty-directory behavior, recursion, or failure modes for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, with no filler. It is efficient, though it is arguably terse enough to leave the tool's important edge cases unexplained.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations carry the destructive/idempotent profile, so return values and safety need not be re-explained. Still, for a destructive filesystem operation on a remote server, the omission of non-empty-directory behavior and irreversibility leaves a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter (remotePath) already documented in the schema, so the baseline of 3 applies. The description adds no path format, relative-vs-absolute, or quoting detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (delete) and resource (directory) plus the target system (FTP server). The resource noun implicitly separates it from delete-file, though the description never says so explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus delete-file, or versus create-directory/rename-file. No mention of prerequisites such as whether the directory must be empty or whether the deletion is recursive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-fileDelete FileBDestructiveIdempotent
Delete a file from the FTP server
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Path of the file to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| remotePath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered elsewhere. The description adds nothing beyond that baseline — no note on irreversibility of the remote file, permission requirements, or behavior when the path does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, verb-first and waste-free. Nothing redundant is included and the scope qualifier is attached directly to the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the destructive/idempotent profile. Still, for a destructive remote-FTP operation the definition is thin on failure modes and scope limits, leaving it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single documented remotePath parameter, so the schema fully carries parameter meaning. The description adds no format, path-syntax, or directory-vs-file clarification, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (file) and scopes it to the FTP server, so an agent can distinguish it from delete-directory and rename-file. It stops short of an explicit contrast with those siblings, which only the resource noun implies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of the sibling delete-directory or when to prefer rename/overwrite instead of deletion. The agent is left to infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download-fileDownload FileARead-only
Download a file from the FTP server. Text files are returned as-is; binary files are returned base64-encoded.
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Path of the file on the FTP server |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes | |
| encoding | Yes | |
| remotePath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description's added contribution is the type-dependent encoding behavior: text returned as-is, binary base64-encoded. That is a genuinely useful, non-obvious trait an agent must know to interpret the response. It stops short of mentioning size limits, the text/binary detection heuristic, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero waste: the action is front-loaded and the encoding caveat follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still handles the one non-obvious return nuance (base64 for binary). With a single fully documented required parameter and matching annotations, nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single remotePath parameter is already documented in the schema, so baseline 3 applies. The description adds no syntax, path-format, or constraint detail beyond what structured data provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a file from the FTP server'), which is unambiguous and clearly distinct in intent from upload-file, list-directory, and delete-file. It does not explicitly name a sibling or draw a boundary, so it falls just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. It never says what condition should route an agent here versus list-directory or edit-file, nor any prerequisite (e.g., the file must exist or be readable). Only the retrieval semantics are described.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit-fileEdit FileADestructive
Edit a text file on the FTP server by replacing an exact string, without re-uploading the whole file content. oldText must match exactly (including whitespace) and be unique in the file unless replaceAll is set.
| Name | Required | Description | Default |
|---|---|---|---|
| newText | Yes | Text to replace it with | |
| oldText | Yes | Exact text to find in the file | |
| remotePath | Yes | Path of the file on the FTP server | |
| replaceAll | No | Replace every occurrence instead of requiring oldText to be unique (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| fileSize | Yes | |
| remotePath | Yes | |
| replacements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the mutation/safety profile is covered. The description adds meaningful behavioral context beyond that: it discloses the exact-string replacement mechanism and the critical constraint that oldText must match including whitespace and be unique unless replaceAll is set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The purpose and efficiency benefit are front-loaded, followed by the key constraint, making it easy to scan and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and annotations cover the safety profile. The description covers the mechanism and the main gotcha (exact match, uniqueness, replaceAll), though it omits failure behavior when oldText is not found or not unique, which would be helpful for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including oldText's exact-match nature and replaceAll's uniqueness-bypass behavior. The description reinforces the exact-match/whitespace requirement, adding marginal emphasis but no new semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Edit), resource (a text file on the FTP server), and mechanism (replacing an exact string without re-uploading the whole file content). That mechanism implicitly distinguishes it from siblings like upload-file and append-file, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without re-uploading the whole file content' implies the tool is for small, targeted edits rather than full-file replacement, which is useful implied guidance. However, it never explicitly states when to choose this over upload-file or append-file, nor does it list prerequisites, so usage remains inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-directoryList DirectoryBRead-only
List contents of an FTP directory
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Path of the directory on the FTP server |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| entries | Yes | |
| fileCount | Yes | |
| totalCount | Yes | |
| directoryCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so safety and scope are covered. The description adds no behavioral context beyond what is in the annotations, such as pagination, output format details, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, read-only) and the presence of an output schema, the description is adequate. However, it could benefit from a brief note on when to use it versus other directory-related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is fully documented in the schema. The description does not add any meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('contents of an FTP directory'). It is clear and distinct from siblings like download-file or delete-directory, though it doesn't explicitly contrast itself with any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. It simply states what the tool does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename-fileRename / MoveBDestructive
Rename or move a file or directory on the FTP server
| Name | Required | Description | Default |
|---|---|---|---|
| toPath | Yes | New path for the file or directory | |
| fromPath | Yes | Current path of the file or directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| toPath | Yes | |
| renamed | Yes | |
| fromPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds only that it operates on directories as well as files and on FTP specifically; it does not disclose what happens if the destination path already exists, which is the key behavioral question for a destructive rename.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the operation first and the scope qualifier second. Every word earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry the mutation/destructive profile. The one meaningful gap is destination-overwrite behavior, which matters for a non-idempotent, destructive move.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both fromPath/toPath are documented as current and new paths, so the baseline is 3. The description adds no syntax, path-format, or root-relative guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (rename/move) and resource (file or directory) plus the operating context (FTP server). It is distinguishable from siblings like edit-file or upload-file, though it never names an alternative to contrast against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use rename/move versus edit-file or create-directory, and no prerequisites or exclusions are stated. The agent must infer usage purely from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-fileUpload FileADestructiveIdempotent
Upload a file to the FTP server. Pass encoding "base64" to upload binary content.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Content to upload to the file | |
| encoding | No | Encoding of the provided content (default: utf8) | |
| remotePath | Yes | Destination path on the FTP server |
Output Schema
| Name | Required | Description |
|---|---|---|
| remotePath | Yes | |
| bytesWritten | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true, so the agent knows this can overwrite and is safe to retry. The description adds the encoding option, but doesn't explain what happens if the file already exists (overwrite? error?), or whether it requires specific permissions. Some added value, but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and a key parameter tip. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set, full schema coverage, and annotations covering safety and idempotency, the description is nearly complete. It could mention overwrite behavior, but that's a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the parameters, including the encoding enum and defaults. The description only repeats the encoding option for binary content, adding no new syntax or format details. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (upload) and resource (file to the FTP server), which is clear. It doesn't explicitly differentiate from siblings like append-file or edit-file, but the action is distinct enough that an agent can infer its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (use base64 for binary), but does not specify when to use this tool versus append-file or edit-file, nor does it mention prerequisites like authentication or directory existence. No explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.2.2- Changed
append-file3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
create-directory3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
delete-directory3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
delete-file3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
download-file5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / content / descriptionRemoved value: -"File content, encoded per the encoding field" - removed
Output schema / properties / encoding / descriptionRemoved value: -"utf8 for text files, base64 for binary files"
- Changed
edit-file5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / fileSize / descriptionRemoved value: -"Size of the file in bytes after the edit" - removed
Output schema / properties / replacements / descriptionRemoved value: -"Number of occurrences replaced"
- Changed
list-directory6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / entries / descriptionRemoved value: -"Directory entries" - removed
Output schema / properties / entries / items / additionalPropertiesRemoved value: -false - removed
Output schema / properties / path / descriptionRemoved value: -"The directory that was listed"
- Changed
rename-file3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
upload-file3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -false
3 tool updates
v1.2.1- Added
delete-directory - Added
list-directory - Added
upload-file
9 tool updates
v1.2.0- Added
append-file - Changed
create-directory1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "created": { + "type": "boolean" + }, + "remotePath": { + "type": "string" + } + }, + "required": [ + "remotePath", + "created" + ], + "type": "object" +}
- Removed
delete-directory - Changed
delete-file1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + }, + "remotePath": { + "type": "string" + } + }, + "required": [ + "remotePath", + "deleted" + ], + "type": "object" +}
- Changed
download-file1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "content": { + "description": "File content, encoded per the encoding field", + "type": "string" + }, + "encoding": { + "description": "utf8 for text files, base64 for binary files", + "enum": [ + "utf8", + "base64" + ], + "type": "string" + }, + "remotePath": { + "type": "string" + } + }, + "required": [ + "remotePath", + "content", + "encoding" + ], + "type": "object" +}
- Added
edit-file - Removed
list-directory - Added
rename-file - Removed
upload-file
6 tool updates
- First observed
create-directory - First observed
delete-directory - First observed
delete-file - First observed
download-file - First observed
list-directory - First observed
upload-file
TDQS
Scored across 9 tools
Most tools have clearly distinct purposes: listing, downloading, directory creation/deletion, file deletion, and renaming. However, upload-file, append-file, and edit-file all modify file content and could be confused in edge cases, though their descriptions differentiate overwrite-style upload, append, and in-place string editing.
All tool names follow a consistent kebab-case verb_noun pattern: list-directory, download-file, upload-file, create-directory, delete-file, delete-directory, rename-file, edit-file, append-file. There are no deviations in casing or verb style.
Nine tools is well-scoped for an FTP access server, covering core file and directory operations without excessive breadth. Each tool earns its place by mapping to a distinct FTP action.
The set covers core FTP lifecycle operations: list, download, upload, create, delete, rename, edit, and append, for both files and directories. Minor gaps exist around file metadata/stat inspection and potentially recursive directory deletion, but agents can work around these.
Maintenance
Related MCP Connectors
Give Claude only the Google Drive files you choose. Every action logged.
Use your Mac, Windows or Linux computer from ChatGPT, Claude or Codex: files, commands, documents.
Safe folder access for ChatGPT and Claude: read, write and search files, risky tools opt-in.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables SSH remote access to servers through Claude, allowing users to execute commands, transfer files via SFTP, and manage multiple remote connections using natural language.128MIT
- AlicenseNot gradedqualityNot gradedmaintenanceConnects Claude to remote servers via SSH to execute commands, manage files, and browse directories. It allows users to add, edit, and switch between multiple server configurations through natural language conversations.-
- AlicenseNot gradedqualityCmaintenanceProvides Claude with complete file system integration including directory management, file operations, Office document creation/editing, and advanced file tree visualization.3MIT
- AlicenseAqualityCmaintenanceEnables Claude to connect to servers via SSH, execute commands, transfer files, and manage connections through natural language.911 npm1MIT