Skip to main content
Glama
README.md•8.13 kB
# MCP Remote Server A Model Context Protocol (MCP) server that enables Cursor IDE to execute SSH commands on remote servers and manage Google Cloud Platform (GCE) instances. This server provides a seamless integration between Cursor and your remote infrastructure. ## Features - šŸ” **SSH Command Execution**: Run commands on remote servers via SSH - ā˜ļø **GCE Instance Management**: Start and stop Google Cloud Compute Engine instances - šŸ”„ **Connection Pooling**: Reuses SSH connections for improved performance - šŸ“ **SSH Config Integration**: Uses your existing `~/.ssh/config` for host configuration - šŸš€ **MCP Protocol**: Full support for Model Context Protocol v2025-06-18 ## Prerequisites - Node.js 16+ installed - SSH access configured to your remote server - Google Cloud Platform credentials (for GCE features) - Cursor IDE installed ## Installation 1. **Clone or navigate to the repository:** ```bash cd mcp-remote ``` 2. **Install dependencies:** ```bash npm install ``` 3. **Start the MCP server:** ```bash node src/index.js ``` The server will start on `http://localhost:3000` by default. ## Configuration ### 1. SSH Configuration First, you need to configure your SSH connection in `~/.ssh/config`. The server always uses the host alias `dev` regardless of what you specify in prompts. Create or edit `~/.ssh/config`: ```ssh-config Host dev HostName your-server.example.com User your-username Port 22 IdentityFile ~/.ssh/id_rsa # Optional: Add additional SSH options # ServerAliveInterval 60 # ServerAliveCountMax 3 # StrictHostKeyChecking no # UserKnownHostsFile ~/.ssh/known_hosts ``` **Example with AWS EC2:** ```ssh-config Host dev HostName ec2-12-34-56-78.compute-1.amazonaws.com User ubuntu Port 22 IdentityFile ~/.ssh/my-aws-key.pem ``` **Example with Google Cloud:** ```ssh-config Host dev HostName 34.123.45.67 User root Port 22 IdentityFile ~/.ssh/gcp-key.pem ``` **Important Notes:** - The host alias **must** be named `dev` (all lowercase) - The server will **always** connect to `dev` regardless of the host you specify in prompts - Make sure your SSH key has proper permissions: `chmod 600 ~/.ssh/id_rsa` ### 2. Cursor MCP Configuration Configure Cursor to connect to the MCP server by editing `~/.cursor/mcp.json`: ```json { "mcpServers": { "local-mcp": { "name": "Local MCP", "url": "http://localhost:3000", "description": "Runs SSH commands and manages GCE instances", "apiKeyHeader": "x-api-key", "apiKeyValue": "8BOe6KshR5Eq0otTSjSGMEf5P1edKcq" } } } ``` **Configuration Fields:** - `name`: Display name for the MCP server in Cursor - `url`: The URL where your MCP server is running (default: `http://localhost:3000`) - `description`: Description of what the server does - `apiKeyHeader`: Header name for API authentication (currently optional) - `apiKeyValue`: API key value for authentication (currently optional) **After modifying `mcp.json`:** 1. Save the file 2. Restart Cursor IDE 3. The MCP server should appear in Cursor's tool list ### 3. Environment Variables (Optional) You can set environment variables to customize behavior: ```bash # SSH Configuration (optional - defaults to ~/.ssh/id_rsa) export SSH_USERNAME=your-username export SSH_PRIVATE_KEY_PATH=~/.ssh/custom_key # Server Configuration export PORT=3000 # GCP Configuration (for GCE features) export GOOGLE_APPLICATION_CREDENTIALS=/path/to/gcp-credentials.json ``` ## Usage ### Starting the Server ```bash # Start the server node src/index.js # Or with custom port PORT=8080 node src/index.js ``` The server will output: ``` MCP server running on http://localhost:3000 Ready to accept MCP connections from Cursor ``` ### Using in Cursor IDE Once configured, you can use the MCP tools directly in Cursor: 1. **Run SSH Commands:** - Ask Cursor: "Check disk usage on server1.example.com" - The server will automatically connect to `dev` and execute the command - Example: "Run `df -h` on my remote server" 2. **Manage GCE Instances:** - Ask Cursor: "Start instance my-vm in project my-project, zone us-central1-a" - Ask Cursor: "Stop instance my-vm in project my-project, zone us-central1-a" ### Available Tools 1. **run_command** - Execute SSH commands on the remote server - Always connects to `dev` from `~/.ssh/config` - Parameters: - `host`: Ignored (always uses `dev`) - `cmdKey`: The command to execute (e.g., `df -h`, `ls -la`) 2. **start_instance** - Start a GCE instance - Parameters: - `project`: GCP project ID - `zone`: GCE zone (e.g., `us-central1-a`) - `instance`: Instance name 3. **stop_instance** - Stop a GCE instance - Parameters: - `project`: GCP project ID - `zone`: GCE zone - `instance`: Instance name ## Architecture ### Connection Pooling The server maintains a pool of SSH connections to improve performance: - Connections are reused across multiple commands - Connections are kept alive with keepalive settings - Automatic cleanup on connection errors ### SSH Config Integration The server reads connection details from `~/.ssh/config`: - Hostname, port, username, and identity file - Supports all standard SSH config options - Handles `~` expansion in file paths - Supports multiple IdentityFile entries (uses the first one) ## Troubleshooting ### Server Won't Start 1. **Check if port is already in use:** ```bash lsof -i :3000 ``` 2. **Check Node.js version:** ```bash node --version # Should be 16+ ``` ### Cursor Can't Connect 1. **Verify server is running:** ```bash curl http://localhost:3000 ``` 2. **Check `~/.cursor/mcp.json` syntax:** - Ensure valid JSON - Verify the URL matches your server 3. **Restart Cursor IDE** after modifying `mcp.json` ### SSH Connection Issues 1. **Test SSH connection manually:** ```bash ssh dev ``` 2. **Verify SSH config:** ```bash ssh -F ~/.ssh/config dev ``` 3. **Check SSH key permissions:** ```bash ls -la ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ``` 4. **Verify the host alias exists:** ```bash grep -A 5 "^Host dev" ~/.ssh/config ``` ### Commands Not Executing 1. **Check server logs** for error messages 2. **Verify the `dev` host is properly configured** in `~/.ssh/config` 3. **Check SSH key has access** to the remote server ## Development ### Project Structure ``` mcp-remote/ ā”œā”€ā”€ src/ │ ā”œā”€ā”€ index.js # Main MCP server │ ā”œā”€ā”€ ssh.js # SSH connection handling │ └── gcp.js # GCP instance management ā”œā”€ā”€ package.json ā”œā”€ā”€ README.md └── .gitignore ``` ### Adding New Tools To add new MCP tools: 1. Add tool definition to the `tools` array in `src/index.js` 2. Add handler in the `tools/call` case 3. Implement the functionality in the appropriate module ### Testing ```bash # Test SSH connection node -e "const {runRemoteCommand} = require('./src/ssh'); runRemoteCommand({host: 'dev', command: 'echo test'}).then(r => console.log(r));" # Test MCP server curl -X POST http://localhost:3000 \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2025-06-18"},"id":1}' ``` ## Security Considerations - The server runs on `localhost:3000` by default (not exposed to network) - SSH credentials are read from `~/.ssh/config` (standard SSH security) - API key authentication is available but currently optional - Consider using environment variables for sensitive data ## License [Add your license here] ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## Support For issues and questions: - Check the Troubleshooting section - Review server logs for error messages - Ensure SSH configuration is correct --- **Note**: The server always connects to the `dev` host alias from your SSH config, regardless of the host you specify in prompts. Make sure `dev` is properly configured in `~/.ssh/config`.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rpavez/ssh-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server