MCP SFTP服务
一种MCP(模型上下文协议)服务器,直接在Claude Code中提供安全的SFTP部署功能。此服务支持通过系统密钥链集成进行安全凭据管理,支持交互式身份验证的按需连接,以及包括密码、SSH密钥和键盘交互式身份验证(2FA/电话批准)在内的多种身份验证方法。
特性
- 单一项目重点:每个MCP实例管理一个项目(在项目目录中运行)
- 按需连接:使用
/sftp:connect需要部署或监视文件时使用命令 - 交互式身份验证支持:完全支持2FA、电话审批和其他键盘交互式身份验证
- 安全凭证存储:
- 用于存储凭据的AES-256-GCM加密 - 系统钥匙链集成(macOS、Linux、Windows) - 环境变量回退 - 交互式身份验证不需要明文密码
- 多种身份验证方法:
- 密码验证(存储密钥链) - SSH公钥身份验证(兼容SSH代理) - 键盘交互式身份验证(2FA、电话批准等)
- 文件监视:使用Chokidar自动上传/删除更改的文件
- 连接管理:使用指数回退自动重试
- 智能忽略模式:可配置文件忽略模式
- MCP集成:与Claude Code无缝集成
安装
- 克隆存储库:
git clone https://github.com/tgeorge06/mcp-sftp-service.git
cd mcp-sftp-service- 安装依赖项:
npm install- 构建项目:
npm run build快速开始
1.为您的项目进行配置
在您的项目目录中,使用Claude Code的 /sftp:setup 命令:
/sftp:setupA. .sftp/config.json 将创建包含您的服务器详细信息的文件。
2.连接到SFTP服务器
当您准备部署或监视文件时,请使用:
/sftp:connect这建立了连接。对于交互式身份验证(2FA/电话批准),在此步骤中会提示您批准。
3.部署或监视
连接后,您可以:
部署您的项目:
/sftp:deploy注意变化:
/sftp:watch start停止观看:
/sftp:watch stop凭证设置
了解钥匙串密钥格式
MCP服务器使用您的 项目目录名称 (非完整路径)作为钥匙链钥匙的一部分:
- 格式:
mcp-sftp-service-sftp-password-{projectName} - 示例:对于项目
/Users/name/projects/my-app,关键是mcp-sftp-service-sftp-password-my-app - 这使得密钥可以在不同的机器和路径上便携
- 所有凭据都安全地存储在您的操作系统密钥链中(无加密文件)
密码验证
将SFTP密码直接存储在操作系统钥匙链中:
macOS:
# Run from your project directory
security add-generic-password \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")" \
-s "mcp-sftp-service" \
-w "your-sftp-password" \
-ULinux:
# Run from your project directory
# Install if needed: sudo apt install libsecret-tools
echo -n "your-sftp-password" | secret-tool store --label="SFTP Password" \
service mcp-sftp-service \
key "sftp-password-$(basename "$(pwd)")"窗户:
# Run from your project directory in PowerShell
$projectName = Split-Path -Leaf (Get-Location)
$password = "your-sftp-password"
cmdkey /generic:"mcp-sftp-service-sftp-password-$projectName" /user:"mcp-sftp-service" /pass:"$password"SSH密钥认证
- 确保SSH代理正在运行:
eval $(ssh-agent -s) - 添加您的密钥:
ssh-add ~/.ssh/id_rsa - SSH密钥
~/.ssh/自动检测
交互式身份验证(2FA/电话批准)
对于需要电话批准或2FA的服务器,请将您的SFTP密码直接存储在钥匙链中:
macOS:
# Run from your project directory
security add-generic-password \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")" \
-s "mcp-sftp-service" \
-w "your-sftp-password" \
-ULinux:
# Run from your project directory
echo -n "your-sftp-password" | secret-tool store --label="SFTP Password" \
service mcp-sftp-service \
key "sftp-password-$(basename "$(pwd)")"窗户:
# Run from your project directory in PowerShell
$projectName = Split-Path -Leaf (Get-Location)
$password = "your-sftp-password"
cmdkey /generic:"mcp-sftp-service-sftp-password-$projectName" /user:"mcp-sftp-service" /pass:"$password"当你奔跑时 /sftp:connect:
- MCP服务器自动发送您的密码(来自钥匙链)
- 自动选择推送身份验证(选项1)
- 自动发送推送请求(按Enter键)
- 您在手机上批准
- 连接完成
运作原理:就像VSCode SFTP扩展程序一样,将密码存储在钥匙串中,自动响应提示,等待电话批准。
配置
项目配置文件
地点: .sftp/config.json
{
"server": {
"host": "dev.example.com",
"port": 22,
"username": "deploy_user",
"authType": "password",
"readyTimeout": 60000,
"keepaliveInterval": 10000
},
"paths": {
"local": "./dist",
"remote": "/var/www/html",
"ignore": [
"node_modules/**",
".git/**",
"*.log",
".env*"
]
},
"watch": {
"enabled": false,
"debounce": 1000,
"depth": 10
},
"connection": {
"maxRetries": 3,
"retryDelay": 500,
"timeout": 30000,
"keepaliveInterval": 10000
}
}使用克劳德代码注册
将MCP服务器添加到 ~/.config/claude-code/mcp-config.json:
{
"mcpServers": {
"sftp": {
"command": "node",
"args": ["/path/to/mcp-sftp-service/dist/index.js"],
"env": {
"SFTP_LOG_LEVEL": "info"
}
}
}
}可用命令
工具(用于克劳德代码)
sftp_setup-为当前项目配置SFTPsftp_deploy-将文件部署到SFTP服务器(具有可选的文件过滤和强制模式)sftp_watch_start-开始查看文件以进行自动上传sftp_watch_stop-停止查看文件sftp_test_connection-检查连接状态sftp_status-显示连接和观察者状态
Slash命令(面向用户)
/sftp:deploy-部署当前项目(部署与配置匹配的所有文件)/sftp:watch start-开始监视文件更改和自动上传/sftp:watch stop-停止文件监视/sftp:setup-配置项目/sftp:status-检查状态
部署
手动部署
使用 /sftp:deploy 部署项目的命令:
# Deploy all files in configured local path to remote server
/sftp:deploy
# Deploy specific files with force overwrite
/sftp:deploy --files file1.js file2.js --force它是如何工作的:
- 命令检查是否已建立SFTP连接(从启动预批准开始)
- 阅读
.sftp/config.json用于本地和远程路径 - 尊重
.sftp/config.json忽略模式 - 通过流媒体上传文件以提高效率
- 根据需要创建远程目录(模式0755)
- 返回包含成功/失败计数的详细结果
文件更改时自动上传
使用 /sftp:watch start 要启用自动上传:
# Start file watcher
/sftp:watch start
# Stop file watcher
/sftp:watch stop它是如何工作的:
- 在配置的本地路径上启动Chokidar文件监视器
- Debozes文件更改(可通过以下方式配置
watch.debounce) - 文件添加/更改:将文件上传到远程服务器
- 文件删除时:从远程服务器删除文件
- 尊重忽略配置中的模式
- 需要活动的SFTP连接
配置:
{
"watch": {
"enabled": false, // Auto-start watcher on MCP startup
"debounce": 1000, // Milliseconds to wait after file change
"depth": 10 // Max directory depth to watch
}
}部署结果
这两种部署方法都提供了详细的反馈:
✅ Deployment completed successfully
Files deployed: 24
Files failed: 0
Duration: 3.45s
Destination: dev.example.com:/var/www/html或者如果有错误:
⚠️ Deployment completed with errors
Files deployed: 23
Files failed: 1
Duration: 3.45s
Destination: dev.example.com:/var/www/html
Errors:
• config/.env: Permission denied凭据管理
运作原理
- 启动时:
- MCP服务器负载 .sftp/config.json - 等待 /sftp:connect 命令
- 当你连接时:
- 直接从操作系统钥匙链读取密码 - 建立SFTP连接 - 缓存经过身份验证的会话
- 部署期间:
- 使用已建立的连接 - 无需密码提示 - 为整个Claude Code会话缓存会话
- 安全:
- 直接存储在操作系统密钥链中的凭据(macOS密钥链、Linux密钥服务、Windows凭据管理器) - 无加密文件或明文密码 - MCP关闭时自动清除凭据
按操作系统列出的存储选项
macOS-苹果钥匙链:
# Store SFTP password (run from project directory)
security add-generic-password \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")" \
-s "mcp-sftp-service" \
-w "your-password" \
-U
# View stored credentials
security find-generic-password -s "mcp-sftp-service" -a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")"
# Delete credential
security delete-generic-password -s "mcp-sftp-service" -a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")"Linux-特勤局(通过 secret-tool):
# Install if needed
sudo apt install libsecret-tools
# Store SFTP password (run from project directory)
echo -n "your-password" | secret-tool store --label="SFTP Password" \
service mcp-sftp-service \
key "sftp-password-$(basename "$(pwd)")"
# Retrieve stored credential
secret-tool lookup service mcp-sftp-service key "sftp-password-$(basename "$(pwd)")"
# Delete credential
secret-tool clear service mcp-sftp-service key "sftp-password-$(basename "$(pwd)")"Windows-凭据管理器:
# Store SFTP password (run from project directory in PowerShell)
$projectName = Split-Path -Leaf (Get-Location)
$password = Read-Host "Enter SFTP password" -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
cmdkey /generic:"mcp-sftp-service-sftp-password-$projectName" /user:"mcp-sftp-service" /pass:"$plainPassword"
# Or with plain password (less secure):
cmdkey /generic:"mcp-sftp-service-sftp-password-$projectName" /user:"mcp-sftp-service" /pass:"your-password"
# View stored credentials
cmdkey /list | Select-String "mcp-sftp-service"
# Delete credential
cmdkey /delete:"mcp-sftp-service-sftp-password-$projectName"回退-环境变量:
# For development or CI/CD only - not recommended for production
export SFTP_PASSWORD="your-sftp-password"钥匙链集成
macOS-苹果钥匙扣
凭据会自动存储在 苹果钥匙扣:
# View all MCP SFTP credentials
security find-generic-password -s "mcp-sftp-service"
# View specific credential (run from project directory)
security find-generic-password -s "mcp-sftp-service" \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")" -w
# Delete credential
security delete-generic-password -s "mcp-sftp-service" \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")"Linux-特勤局
凭据存储在 特勤局 (要求 libsecret-tools):
# Install required tools
sudo apt install libsecret-tools
# View all MCP SFTP credentials
secret-tool search service mcp-sftp-service
# Retrieve specific credential (run from project directory)
secret-tool lookup service mcp-sftp-service key "sftp-password-$(basename "$(pwd)")"
# Delete credential
secret-tool clear service mcp-sftp-service key "sftp-password-$(basename "$(pwd)")"Windows-凭据管理器
凭据存储在 Windows凭据管理器:
通过GUI:
- 打开设置→ 凭据管理器
- 查找以开头的条目
mcp-sftp-service-sftp-password- - 单击查看或删除凭据
通过PowerShell:
# View all stored credentials
cmdkey /list | Select-String "mcp-sftp-service"
# Delete specific credential (run from project directory)
$projectName = Split-Path -Leaf (Get-Location)
cmdkey /delete:"mcp-sftp-service-sftp-password-$projectName"SSH代理集成
对于SSH密钥身份验证:
- 确保SSH代理正在运行:
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa- 在中配置身份验证
.sftp/config.json:
{
"server": {
"authType": "publickey"
}
}- SSH密钥
~/.ssh/被自动发现
交互式身份验证(2FA/电话批准)
对于需要电话批准或2FA的服务器:
- 在中配置
.sftp/config.json:
{
"server": {
"authType": "keyboard-interactive"
}
}- 启动时,MCP服务器将:
- 显示“正在手机上等待批准…” - 给你60秒的时间来批准 - 批准后缓存会话
- 后续部署 使用缓存的会话(无需重新批准)
环境变量
凭据存储
SFTP_PASSWORD-SFTP密码(如果不在密钥链中,则回退)
日志记录
SFTP_LOG_LEVEL-日志级别(调试、信息、警告、错误)SFTP_LOG_DIR-日志文件目录SFTP_LOG_TO_FILE-启用文件日志记录(true/false)
示例
export SFTP_LOG_LEVEL=debug
export SFTP_PASSWORD="my-sftp-password" # Only if not using keychain
claude code # Start Claude Code, MCP will use these values安全最佳实践
- 始终使用系统钥匙链 对于密码,永远不要长期使用环境变量
- 对于CI/CD,使用环境变量和短期凭据
- SSH密钥 尽可能比密码更安全
- 轮换凭据 定期
- 使用
.sftp/微笑。 防止配置文件的意外提交 - 无加密文件 -仅存储在操作系统密钥链中的所有凭据
故障排除
启动时连接失败
检查日志:
SFTP_LOG_LEVEL=debug node dist/index.js验证配置:
- 主机和端口正确
- 用户名正确
- 凭证存储在钥匙链中
“未找到SFTP密码”
MCP服务器使用您的 项目目录名称。从项目目录运行:
macOS:
security add-generic-password \
-a "mcp-sftp-service-sftp-password-$(basename "$(pwd)")" \
-s "mcp-sftp-service" -w "your-password" -ULinux:
echo -n "your-password" | secret-tool store --label="SFTP Password" \
service mcp-sftp-service key "sftp-password-$(basename "$(pwd)")"窗户:
$projectName = Split-Path -Leaf (Get-Location)
cmdkey /generic:"mcp-sftp-service-sftp-password-$projectName" /user:"mcp-sftp-service" /pass:"your-password"备选方案: 设置环境变量(不建议用于生产):
export SFTP_PASSWORD="your-sftp-password"SSH代理不可用
对于SSH密钥认证:
# Start SSH agent
eval $(ssh-agent -s)
# Add your key
ssh-add ~/.ssh/id_rsa
# Verify
ssh-add -l电话审批超时
对于交互式身份验证:
- 确保您在启动后60秒内批准
- 检查网络连接
- 验证服务器设置
发展
建筑
npm run build在发展中奔跑
npm run dev类型检查
npm run type-check代码检查
npm run lint项目结构
mcp-sftp-service/
├── src/
│ ├── index.ts # Entry point
│ ├── server.ts # MCP server
│ ├── tools/ # Tool implementations
│ ├── sftp/ # SFTP client & transfer
│ ├── crypto/ # Encryption/decryption
│ ├── config/ # Configuration management
│ ├── utils/ # Utilities (logger, keychain, SSH agent)
│ └── types/ # TypeScript types
├── dist/ # Compiled output
└── package.json许可证
MIT许可证-有关详细信息,请参阅许可证文件
支持
对于问题、疑问或功能请求,请在GitHub上打开问题: https://github.com/tgeorge06/mcp-sftp-service/issues
