Clean up and organize the flask-shopdb repository for better maintainability and discoverability: ## Changes - Update .gitignore for build artifacts (publish/, data/, 122M total) - Reorganize .claude/ into 6 subdirectories with README navigation - Consolidate overlapping MCP setup guides into MCP-QUICK-START.md - Move deployment docs from root to docs/deployment/ - Archive dated status reports to .claude/archived/ - Delete temporary files (logs, backups, empty reports, ~50K) ## New Structure .claude/ organized into: - setup/ - MCP, VM, Hyper-V, GitHub setup guides + scripts (17 files) - plans/ - Feature plans and protocols (5 files) - maintenance/ - Deployment checklists and reports (4 files) - archived/ - Historical documentation (9 files) - skills/ - Claude Code automation (5 files) - workflows/ - Security audit workflow (1 file) docs/deployment/ created with 6 deployment guides: - LOCAL-DEV-SETUP.md, DOCKER-SETUP.md, DOCKER-PREBUILT-APPROACH.md - PRODUCTION-READINESS.md, DEPLOY-TO-VM.md, README.md Root directory cleaned to essential docs only: - CLAUDE.md, README.md, CONTRIBUTING.md, CHANGELOG.md Benefits: - Clear navigation via README.md in each subdirectory - No duplicate/overlapping documentation - Large artifacts properly gitignored (won't bloat repository) - Historical context preserved in archived/ See .claude/CLEANUP-SUMMARY.md for complete details. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
268 lines
5.7 KiB
Markdown
268 lines
5.7 KiB
Markdown
# Set Up SSH Access to VM for Claude Code
|
|
|
|
Guide to configure SSH MCP so Claude can interact with the Windows 11 test VM.
|
|
|
|
---
|
|
|
|
## Step 1: Configure VM (Run as Administrator in VM)
|
|
|
|
```powershell
|
|
# Install OpenSSH Server
|
|
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
|
|
|
|
# Start SSH service
|
|
Start-Service sshd
|
|
Set-Service -Name sshd -StartupType 'Automatic'
|
|
|
|
# Allow SSH through firewall
|
|
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
|
|
|
|
# Verify SSH is listening
|
|
netstat -ano | findstr :22
|
|
# Should show: TCP 0.0.0.0:22 ... LISTENING
|
|
|
|
# Set password for local user (replace "ShopFloor" with actual username)
|
|
net user ShopFloor YourPassword123
|
|
```
|
|
|
|
---
|
|
|
|
## Step 2: Test SSH from Host
|
|
|
|
```bash
|
|
# From host PC
|
|
ssh ShopFloor@192.168.100.10
|
|
|
|
# Should connect and show Windows command prompt
|
|
# If works, type 'exit' to disconnect
|
|
```
|
|
|
|
---
|
|
|
|
## Step 3: Install SSH MCP Server
|
|
|
|
```bash
|
|
# On host PC
|
|
npm install -g ssh-mcp
|
|
|
|
# Verify installation
|
|
npm list -g ssh-mcp
|
|
```
|
|
|
|
---
|
|
|
|
## Step 4: Add to Claude Code Config
|
|
|
|
Edit `.claude/mcp-servers.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"gortex": {
|
|
"command": "C:\\Users\\270015376\\Documents\\gortex.exe",
|
|
"args": ["mcp"],
|
|
"cwd": "C:\\Users\\270015376\\Documents\\github\\flask-shopdb"
|
|
},
|
|
"mysql": {
|
|
"command": "npx",
|
|
"args": ["-y", "@benborla29/mcp-server-mysql", "mysql://shopdb:shopdb-dev-password@127.0.0.1:3306/shopdb_flask"]
|
|
},
|
|
"browser": {
|
|
"command": "npx",
|
|
"args": ["-y", "@agent-infra/mcp-server-browser"]
|
|
},
|
|
"vm": {
|
|
"command": "npx",
|
|
"args": [
|
|
"-y",
|
|
"ssh-mcp",
|
|
"--host", "192.168.100.10",
|
|
"--user", "ShopFloor",
|
|
"--password", "YourPassword123"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Note:** Replace "ShopFloor" and "YourPassword123" with actual VM credentials.
|
|
|
|
---
|
|
|
|
## Step 5: Restart Claude Code
|
|
|
|
Close and reopen Claude Code completely to load the new MCP server.
|
|
|
|
---
|
|
|
|
## Step 6: Verify SSH MCP Works
|
|
|
|
In Claude Code conversation:
|
|
|
|
```
|
|
You: "Run 'hostname' on the VM"
|
|
|
|
Claude: [Calls mcp__vm__exec]
|
|
Claude: "VM hostname: DESKTOP-ABC123"
|
|
```
|
|
|
|
---
|
|
|
|
## What Claude Can Do with SSH MCP:
|
|
|
|
### Execute Commands:
|
|
```
|
|
"Check if agent service is running on VM"
|
|
"Get the VM's IP configuration"
|
|
"List running processes on VM"
|
|
"Read agent logs from VM"
|
|
```
|
|
|
|
### File Operations:
|
|
```
|
|
"Copy shopdbagent.exe to VM at C:\Temp"
|
|
"Read the agent config file from VM"
|
|
"Upload the latest build to VM"
|
|
"Download agent logs from VM"
|
|
```
|
|
|
|
### Agent Testing:
|
|
```
|
|
"Install the agent on VM"
|
|
"Start/stop the agent service"
|
|
"Check if tray is running"
|
|
"Tail the agent log file"
|
|
"Verify agent is connecting to http://192.168.100.1:5000"
|
|
```
|
|
|
|
### Integration Testing:
|
|
```
|
|
"Create a fleet alert and verify it appears on VM"
|
|
"Submit operator report from VM and check database"
|
|
"Test endpoint heartbeat from VM"
|
|
"Run script on VM and check results in database"
|
|
```
|
|
|
|
---
|
|
|
|
## Security Notes
|
|
|
|
### Password in Config:
|
|
- Config file contains plain-text password
|
|
- Only for test VM on internal network
|
|
- VM has no internet access (internal network only)
|
|
- Not a production concern
|
|
|
|
### Better: Use SSH Key (Optional)
|
|
|
|
**Generate SSH key:**
|
|
```bash
|
|
ssh-keygen -t rsa -f ~/.ssh/vm_key
|
|
```
|
|
|
|
**Copy public key to VM:**
|
|
```powershell
|
|
# In VM, create .ssh directory
|
|
mkdir C:\Users\ShopFloor\.ssh
|
|
|
|
# Copy contents of ~/.ssh/vm_key.pub to:
|
|
# C:\Users\ShopFloor\.ssh\authorized_keys
|
|
```
|
|
|
|
**Update .mcp.json:**
|
|
```json
|
|
"vm": {
|
|
"command": "npx",
|
|
"args": [
|
|
"-y",
|
|
"ssh-mcp",
|
|
"--host", "192.168.100.10",
|
|
"--user", "ShopFloor",
|
|
"--key", "C:\\Users\\270015376\\.ssh\\vm_key"
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### SSH Connection Refused:
|
|
```bash
|
|
# Check SSH service on VM
|
|
ssh ShopFloor@192.168.100.10
|
|
# If fails, verify service running:
|
|
# In VM: Get-Service sshd
|
|
```
|
|
|
|
### Authentication Failed:
|
|
```bash
|
|
# Verify password
|
|
# In VM: net user ShopFloor NewPassword123
|
|
```
|
|
|
|
### Port 22 Blocked:
|
|
```powershell
|
|
# In VM, check firewall rule exists
|
|
Get-NetFirewallRule -Name sshd
|
|
```
|
|
|
|
### MCP Server Not Loading:
|
|
```bash
|
|
# Verify ssh-mcp installed
|
|
npm list -g ssh-mcp
|
|
|
|
# Test manually
|
|
npx -y ssh-mcp --host 192.168.100.10 --user ShopFloor --password Test123
|
|
```
|
|
|
|
---
|
|
|
|
## Example Test Workflow
|
|
|
|
### Full Agent Deployment Test:
|
|
|
|
```
|
|
You: "Deploy and test the agent on the VM"
|
|
|
|
Claude:
|
|
1. [Builds agent] dotnet publish...
|
|
2. [SSH: Upload] Copying shopdbagent.exe to VM...
|
|
3. [SSH: Install] Running installer on VM...
|
|
4. [SSH: Configure] Setting API endpoint to http://192.168.100.1:5000...
|
|
5. [SSH: Start] Starting ShopDBEndpointAgent service...
|
|
6. [SSH: Verify] Checking service status... Running
|
|
7. [SSH: Logs] Reading agent.log... "Connected to API successfully"
|
|
8. [MySQL: Create alert] Inserting test fleet alert...
|
|
9. [Wait 5s]
|
|
10. [SSH: Check tray] Get-Process shopdb-endpoint-tray... Running
|
|
11. [SSH: Screenshot] Capturing tray notification...
|
|
12. ✅ Complete! Agent installed, connected, and received fleet alert.
|
|
```
|
|
|
|
---
|
|
|
|
## VM Requirements Summary:
|
|
|
|
| Requirement | Status | Command to Check |
|
|
|-------------|--------|------------------|
|
|
| OpenSSH Server installed | ⏳ | `Get-WindowsCapability -Online -Name OpenSSH.Server*` |
|
|
| SSH service running | ⏳ | `Get-Service sshd` |
|
|
| Port 22 open in firewall | ⏳ | `Get-NetFirewallRule -Name sshd` |
|
|
| User has password set | ⏳ | `net user ShopFloor` |
|
|
| Network connectivity | ✅ | `arp -a` shows 192.168.100.10 |
|
|
| Internal network configured | ✅ | VM has 192.168.100.10 |
|
|
|
|
---
|
|
|
|
## Next Steps:
|
|
|
|
1. Run Step 1 commands in VM (as Administrator)
|
|
2. Test SSH connection from host (Step 2)
|
|
3. Install ssh-mcp on host (Step 3)
|
|
4. Update .claude/mcp-servers.json (Step 4)
|
|
5. Restart Claude Code (Step 5)
|
|
6. Test with simple command (Step 6)
|
|
|
|
**Ready to proceed?**
|