- TypeScript 96.9%
- JavaScript 3.1%
|
|
||
|---|---|---|
| .github/workflows | ||
| .vscode | ||
| resources | ||
| src | ||
| .gitignore | ||
| .vscodeignore | ||
| CLAUDE.md | ||
| eslint.config.mjs | ||
| jest.config.js | ||
| LICENSE.txt | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vibetty-logo.png | ||
VibeTTY
AI-assisted SSH/Telnet/Serial management in VSCode
VSCode extension + MCP server for managing remote infrastructure with AI assistance.
🔗 GitHub Repository | 🐛 Report Issues
⚠️ VIBECODED PROTOTYPE ⚠️
The code quality of this project is abysmal and security is mostly left to chance.
I would strongly advise against using VibeTTY in production environments.
🚀 Quick Start
1. Install
From VSIX:
# Download .vsix from releases or build from source
# Install: Extensions → `...` → Install from VSIX
Build from Source:
git clone https://github.com/torbbang/vibetty.git
cd vibetty
npm install && npm run compile
vsce package
2. Add Connections
- Open VibeTTY sidebar
- Click
+→ Choose SSH/Telnet/Serial - Fill in details → Connect
3. Setup MCP
MCP enables AI assistants (Claude Code, Cline, etc.) to interact with VibeTTY.
Automatic: Command Palette → VibeTTY: Configure MCP Client
Manual: Add to MCP client config:
{
"mcpServers": {
"vibetty": {
"command": "node",
"args": ["/path/to/vscode-vibetty/out/mcp/cli.js"]
}
}
}
For the best user experience I recommend auto-approving the following tools:
- list_connections
- list_active_sessions
- show_terminal
- read_output
- auto_paginate
- set_device_type
✨ Features
Connections:
- SSH/Telnet/Serial with ProxyJump, port forwarding, keep-alive
- Multiple concurrent sessions per host
- Folder organization with drag-and-drop
- Persistent terminals (don't close on disconnect)
AI Integration (MCP):
- 8 MCP tools for Claude Code, Cline, Gemini, etc.
- List/connect/command/read output with approval gates
- Auto-pagination through
--More--prompts - Device type detection (Cisco IOS/IOS-XE, Juniper Junos, FortiOS)
Security:
- 50+ secret filtering patterns (passwords, SNMP, BGP keys, etc.)
- Strict Mode: manual approval for all AI commands
- Edit-before-submit approval dialogs
- Localhost-only MCP server with token auth
UX:
- SecureCRT-compatible keyword highlighting
- Auto-focus on password prompts
- Session logging with daily rotation
- Connection notes for device documentation
🔐 SSH Authentication
VibeTTY provides seamless authentication for all SSH methods using VSCode-native input boxes:
Supported Authentication Methods:
- ✅ Password authentication - Detects password prompts, shows input box
- ✅ SSH key passphrases - Detects passphrase prompts, shows input box
- ✅ Keyboard-interactive - Handles multiple challenge-response prompts
- ✅ 2FA/MFA - Sequential prompts (password then OTP/token)
- ✅ Public keys (no passphrase) - Works automatically, no prompts
- ✅ In-session prompts (sudo, enable) - Consistent input box experience
How it works:
- SSH connection starts normally
- VibeTTY monitors output for authentication prompts
- When prompt detected, shows VSCode input box with contextual message
- User enters password/passphrase/code
- Response sent to SSH stdin
- Process repeats for multiple prompts (keyboard-interactive)
Configuration:
{
// Disable VSCode input boxes (use manual terminal input)
"vibetty.ssh.enableReactiveAuth": false
}
Benefits:
- Universal: Works with ALL SSH authentication methods
- VSCode Remote compatible: Input boxes work in remote environments
- Secure: Credentials never logged or exposed in command line
- Context-aware: Different prompts for password vs passphrase vs 2FA
- No pre-configuration: Works automatically, no per-host setup needed
Note: System OS dialogs will never appear - you'll always get VSCode input boxes.
🛠️ MCP Tools
| Tool | Description | Approval |
|---|---|---|
list_connections |
List configured devices with status | Auto |
connect_host |
Open connections, returns session_id | Auto |
show_terminal |
Focus terminal window | Auto |
send_to_terminal |
Execute commands | Required |
read_output |
Read output (secrets filtered) | Strict Mode |
update_connection_notes |
Update device notes | Auto |
auto_paginate |
Enable auto-pagination | Auto |
set_device_type |
Set device type | Auto |
⚙️ Configuration
VSCode Settings
Access via: Settings → Extensions → VibeTTY
{
// ===== Security =====
"vibetty.security.strictMode": false, // Require manual approval for LLM commands/output
// ===== Session Logging =====
"vibetty.logging.enabled": false, // Global logging toggle (per-connection override available)
"vibetty.logging.directory": "~/.vibetty/logs", // Log directory (supports ~ expansion)
// ===== SSH Keep-Alive =====
"vibetty.ssh.serverAliveInterval": 60, // Seconds (0 to disable)
// ===== Keyword Highlighting =====
"vibetty.highlighting.enabled": true,
"vibetty.highlighting.customKeywordFile": "~/.vibetty/keywords.ini", // SecureCRT .ini format
// ===== Connections =====
"vibetty.connections": [
{
// Basic properties (all connection types)
"name": "router1",
"type": "ssh", // "ssh", "telnet", or "serial"
"folder": "Production/Core", // Optional: organize in folders (use / for nesting)
// SSH properties
"hostname": "10.0.1.1",
"port": 22, // Default: 22
"user": "admin",
"identityFile": "~/.ssh/id_rsa", // Optional: SSH key path
"proxyJump": "bastion.example.com", // Optional: jump host
// Port forwarding (SSH only)
"localForward": ["8080:localhost:80"], // Optional: local port forwarding
"remoteForward": ["9090:localhost:8080"], // Optional: remote port forwarding
"dynamicForward": ["1080"], // Optional: SOCKS proxy
// Device configuration
"device_type": "cisco_ios", // cisco_ios, cisco_ios-xe, juniper_junos, fortinet_fortios, generic
"notes": "Core router - IOS 15.2(4)E7 - MPLS PE - BGP AS 65001", // Device documentation
// Logging override (optional)
"enableLogging": true // Override global logging setting for this connection
},
{
// Telnet example
"name": "switch1",
"type": "telnet",
"hostname": "192.168.1.10",
"port": 23,
"device_type": "cisco_ios"
},
{
// Serial example
"name": "console1",
"type": "serial",
"device": "/dev/ttyUSB0", // Serial device path
"baudRate": 9600, // Default: 9600
"device_type": "cisco_ios"
}
]
}
🔒 Security
Protection Layers:
- Secret Filtering - 50+ patterns for Cisco/Juniper/FortiOS (passwords, SNMP, BGP keys, etc.)
- Strict Mode - Manual approval for all AI commands/output (toggle in status bar)
- Network Isolation - Localhost-only MCP server with token auth (port 47632)
- File Permissions - Session logs and auth token stored with 0600 (owner-only)
Limitations:
- Pattern-based filtering may miss uncommon secret formats
- Session logs contain unfiltered output (user responsibility to secure)
- Connection notes stored in plaintext VSCode settings