README.mdโข12.3 kB
# ๐ MCP ShellKeeper
<div align="center">
**Persistent Terminal Sessions + File Transfer for AI Assistants**
SSH into servers, run commands, transfer files โ all through your AI assistant. No more stateless limitations.
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org)
[](https://modelcontextprotocol.io)
[](https://www.npmjs.com/package/mcp-shellkeeper) [](https://www.npmjs.com/package/mcp-shellkeeper)
[Real-World Example](#-real-world-example) โข [Installation](#-installation) โข [Core Features](#-core-features) โข [Use Cases](#-use-cases) โข [Tools](#-available-tools)
</div>
---
## ๐ฏ The Problem
AI assistants like Cursor execute commands **statelessly** โ each command runs in a fresh environment:
```bash
โ ssh user@server # Hangs forever - no output until exit
โ Can't run commands after SSH
โ Each command starts from scratch
โ No way to transfer files to/from servers
โ Must re-authenticate for every operation
```
## โจ The Solution
ShellKeeper transforms AI assistants into **stateful operators** with persistent sessions and file transfer capabilities.
---
## ๐ Core Features
<table>
<tr>
<td width="33%" align="left">
### ๐ Stateful Execution
**Traditional AI (Stateless)**
```
You: "SSH to server"
AI: โ Command hangs forever
You: "List files"
AI: โ Runs on local, not server
```
**ShellKeeper (Stateful)**
```
You: "Connect to my server"
AI: โ
Establishes SSH session
You: "What files are there?"
AI: โ
Lists files on server
You: "Go to the logs folder"
AI: โ
Changes to /var/log
You: "Show me recent errors"
AI: โ
Displays log content
```
AI maintains full context between your questions!
</td>
<td width="33%" align="left">
### ๐ฏ Persistent Sessions
**Natural Conversation Flow**
```
You: "SSH to production server"
AI: โ
Connected to prod-01
Session: prod-01
You: "How much disk space left?"
AI: โ
45GB available
(same session, no re-auth)
You: "Show me today's logs"
AI: โ
Displaying logs...
(same session continues)
You: "Restart the API service"
AI: โ
Service restarted
(still same session!)
```
**The AI remembers everything:**
- โ
Your SSH connections
- โ
Current directories
- โ
Environment variables
- โ
All previous context
</td>
<td width="33%" align="left">
### ๐ Seamless File Transfer
**Just Ask in Natural Language**
```
You: "Upload my config to the server"
AI: โ
Uploaded config.json
/app/config/config.json
---
You: "Download the error logs"
AI: โ
Downloaded app.log
Saved to ./logs/app.log
---
You: "Get database backup"
AI: โ
Downloaded backup.sql
(even through SSH jumps!)
```
**It just works:**
- โ
Through any SSH session
- โ
Multiple jump hosts
- โ
Up to 10MB files
- โ
Binary and text files
</td>
</tr>
</table>
---
## ๐ฌ Real-World Example
Watch how a natural conversation becomes automated operations:
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ค YOU ASK:
"Debug the slow API on prod-server-01"
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ค AI EXECUTES:
[Connecting...]
โ ssh user@prod-server-01
โ
Connected to prod-server-01
[Investigating processes...]
โ ps aux | grep api
๐ API process found: PID 1234, using 98% CPU
[Checking logs...]
โ cd /var/log/api && tail -n 100 error.log
๐ ERROR: Memory leak in /api/v1/users endpoint
[Downloading for analysis...]
โ Download: /var/log/api/error.log โ ./local-debug/
โ
Downloaded 2.4MB (analyzed: 500+ memory errors)
[Applying fix...]
โ Upload: ./fixed-config.yml โ /app/config/
โ
Uploaded new rate-limiting config
[Restarting service...]
โ systemctl restart api-service
โ systemctl status api-service
โ
Service restarted, CPU now at 12%
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ค AI RESPONDS:
"Fixed! The API had a memory leak in the users endpoint.
โข Downloaded logs and found 500+ memory allocation errors
โข Applied rate-limiting configuration
โข Restarted service - CPU dropped from 98% to 12%
โข All operations completed in one persistent session"
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โจ All in ONE session, NO re-authentication needed! โจ
```
---
## ๐ฆ Installation
```bash
npm install -g mcp-shellkeeper
```
### Configuration
<table>
<tr>
<td width="33%">
**Cursor**
Settings JSON:
```json
{
"mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
```
(`Cmd+Shift+P` โ Preferences: Open Settings)
</td>
<td width="33%">
**Claude Code**
Config file:
```json
{
"mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
```
(`~/.config/claude/config.json`)
</td>
<td width="33%">
**VS Code (Cline)**
Settings JSON:
```json
{
"cline.mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
```
</td>
</tr>
</table>
**Restart your AI assistant** and you're ready! ๐
---
## ๐ก Use Cases
| Scenario | What You Ask | What AI Does |
|----------|-------------|--------------|
| **๐ Debug Production** | *"Why is prod-api slow?"* | SSH โ Check CPU/memory โ Download logs โ Analyze โ Upload fix โ Restart |
| **๐ Deploy Updates** | *"Deploy v2.0 to staging"* | SSH โ Backup โ Upload files โ Migrate DB โ Restart โ Verify |
| **๐ง Update Configs** | *"Update SSL certs on web servers"* | SSH โ Download old certs โ Upload new โ Test โ Reload nginx |
| **๐๏ธ Backup Database** | *"Backup prod DB to local"* | SSH through bastion โ Dump DB โ Compress โ Download โ Verify |
| **๐ Analyze Logs** | *"Find all 500 errors today"* | SSH โ Parse logs โ Download โ Analyze locally โ Report patterns |
| **๐ Batch Operations** | *"Update configs on all servers"* | Parallel sessions โ Upload โ Restart โ Download results |
**All through natural conversation with your AI!** No scripts, no manual SSH juggling.
---
## ๐ Available Tools
The AI uses these tools automatically, but you can reference them for advanced use:
| Tool | Purpose | Key Features |
|------|---------|--------------|
| **`terminal_execute`** | Run commands in persistent session | Timeout config, exit code capture, clean output |
| **`terminal_upload_file`** | Upload local โ remote (max 10MB) | Auto-detect directory, handle duplicates, works through SSH |
| **`terminal_download_file`** | Download remote โ local (max 10MB) | Auto-create dirs, preserve permissions, verify integrity |
| **`terminal_new_session`** | Create isolated session | Parallel operations, separate environments |
| **`terminal_list_sessions`** | View all active sessions | Status, uptime, last command |
| **`terminal_close_session`** | Clean up session | Free resources when done |
| **`terminal_get_buffer`** | Debug raw output | Useful for troubleshooting |
**๐ก Tip:** The AI handles these automatically based on your natural language requests!
---
## ๐ Security Best Practices
**โ
DO:**
- Use SSH key authentication (not passwords): `ssh-keygen -t ed25519`
- Jump through bastion hosts for production: `ssh -J bastion.com user@prod`
- Limit file upload destinations (avoid `/etc`, `/root`, `.ssh/`)
- Use read-only accounts for investigation
- Clean up sessions after tasks
- Audit all AI operations
**โ DON'T:**
- Store passwords in commands or configs
- Upload untrusted files to production
- Download sensitive data without encryption
- Run destructive commands without verification
- Grant unnecessary permissions
---
## ๐ ๏ธ How It Works
**Persistent Sessions:**
- Uses PTY (Pseudo-Terminal) for full TTY emulation with state persistence
- Smart markers detect command completion automatically
- Exit codes captured for error detection
- Output parsed clean (no ANSI codes)
**File Transfer:**
- Base64 encoding through existing SSH sessions (no separate SCP/SFTP)
- Works through jump hosts without re-authentication
- Max 10MB, 5-minute timeout (completes early if faster)
---
## ๐ Troubleshooting
<details>
<summary><b>Commands timeout or hang</b></summary>
```javascript
// Increase timeout for long-running commands
terminal_execute({
command: "npm install",
timeout: 120000 // 2 minutes
})
// Check if SSH keys are set up correctly
ssh -v user@server
```
</details>
<details>
<summary><b>SSH asks for password</b></summary>
```bash
# Set up passwordless authentication
ssh-keygen -t ed25519
ssh-copy-id user@server
# Verify
ssh user@server "echo Success"
```
</details>
<details>
<summary><b>File upload fails</b></summary>
```javascript
// Check if in SSH session first
terminal_execute({ command: "pwd" }) // Verify you're on remote server
// Ensure remote directory exists
terminal_execute({ command: "mkdir -p /app/uploads" })
// Then upload
terminal_upload({ local_path: "file.txt", remote_path: "/app/uploads/file.txt" })
```
</details>
<details>
<summary><b>File download fails</b></summary>
```javascript
// Verify remote file exists
terminal_execute({ command: "ls -lh /path/to/file" })
// Check permissions
terminal_execute({ command: "cat /path/to/file | wc -l" })
// Try download with absolute path
terminal_download({ remote_path: "/full/path/to/file", local_path: "./" })
```
</details>
<details>
<summary><b>Session becomes unresponsive</b></summary>
```javascript
// List all sessions
terminal_list_sessions()
// Close problematic session
terminal_close_session({ session_id: "stuck-session" })
// Create fresh session
terminal_new_session({ session_id: "new-session" })
```
</details>
---
## ๐งช Development
```bash
# Clone repository
git clone https://github.com/tranhuucanh/mcp-shellkeeper.git
cd mcp-shellkeeper
# Install dependencies
npm install
# Build
npm run build
# Test locally with stdio transport
node dist/index.js
# Test with MCP Inspector
npm run inspector
```
---
## ๐ค Contributing
Contributions welcome! Help make AI-assisted server management better.
1. Fork the repository
2. Create feature branch (`git checkout -b feature/amazing-feature`)
3. Commit changes (`git commit -m 'Add amazing feature'`)
4. Push to branch (`git push origin feature/amazing-feature`)
5. Open Pull Request
---
## ๐ License
MIT License - see [LICENSE](LICENSE) file for details.
**You can:**
- โ
Use commercially
- โ
Modify
- โ
Distribute
- โ
Private use
---
## ๐ Acknowledgments
- Built with [Model Context Protocol SDK](https://github.com/modelcontextprotocol/sdk)
- Uses [node-pty](https://github.com/microsoft/node-pty) for terminal emulation
- Inspired by the need for stateful command execution in AI workflows
---
## ๐ Support
- **Issues**: [GitHub Issues](https://github.com/tranhuucanh/mcp-shellkeeper/issues)
- **Discussions**: [GitHub Discussions](https://github.com/tranhuucanh/mcp-shellkeeper/discussions)
- **MCP Community**: [Discord](https://discord.gg/modelcontextprotocol)
---
<div align="center">
**Built with โค๏ธ for the AI developer community**
*Stateful execution + File transfer = Limitless possibilities*
[](https://star-history.com/#tranhuucanh/mcp-shellkeeper&Date)
[โฌ Back to top](#-mcp-shellkeeper)
</div>