acp-mcp
MCP server for remote machine operations via SSH, providing a single tool to execute any shell command on remote machines with real-time progress streaming.
README
ACP MCP
MCP server for remote machine operations via SSH. Provides a single, powerful tool for executing any shell command on remote machines with real-time progress streaming.
Installation
npm install @prmichaelsen/acp-mcp
Development
npm install
npm run dev
Build
npm run build
Usage
With Claude Desktop
Add to your Claude Desktop configuration:
{
"mcpServers": {
"acp-mcp": {
"command": "node",
"args": ["/absolute/path/to/acp-mcp/dist/server.js"]
}
}
}
With mcp-auth
import { createServer } from '@prmichaelsen/acp-mcp/factory';
import { readFileSync } from 'fs';
const server = await createServer({
userId: 'user-123',
ssh: {
host: 'remote.example.com',
port: 22,
username: 'remote-user',
privateKey: readFileSync('/path/to/private/key', 'utf-8'),
},
});
Available Tools
acp-mcp v1.0.0 provides a single, powerful tool for all remote operations:
acp_remote_execute_command
Execute any shell command on the remote machine with optional progress streaming.
Parameters:
command(required): Shell command to executecwd(optional): Working directory for command executiontimeout(optional): Timeout in seconds (default: 30, ignored if progress streaming)
Returns: { stdout, stderr, exitCode, timedOut, streamed? }
Features:
-
Shell Environment (v0.7.1+): Automatically sources shell configuration files
- Sources
~/.zshrc,~/.bashrc, or~/.profilebefore executing commands - Ensures
$PATHand environment variables are properly loaded - Enables user-installed tools (nvm, homebrew, etc.) to work correctly
- Gracefully handles missing config files
- Sources
-
Progress Streaming (v0.7.0+): Real-time output for long-running commands
- Requires MCP SDK v1.26.0+ (server and client)
- Client must provide
progressTokenin request_meta - Client must handle progress notifications via
onprogresscallback - Graceful fallback to timeout mode if no
progressTokenprovided - Rate limited to max 10 notifications/second
- Ideal for:
npm run build,npm test,npm run dev
Common Operations
List Files
# Basic listing
acp_remote_execute_command({ command: "ls -la ~/project" })
# Recursive listing
acp_remote_execute_command({ command: "find ~/project -type f" })
# With tree (if installed)
acp_remote_execute_command({ command: "tree ~/project" })
# Only directories
acp_remote_execute_command({ command: "ls -d */ ~/project" })
Read Files
# Read entire file
acp_remote_execute_command({ command: "cat ~/project/package.json" })
# Read first 100 lines
acp_remote_execute_command({ command: "head -n 100 ~/project/large-file.txt" })
# Read last 50 lines
acp_remote_execute_command({ command: "tail -n 50 ~/project/log.txt" })
# Search in file
acp_remote_execute_command({ command: "grep 'pattern' ~/project/file.txt" })
Write Files
# Write simple content
acp_remote_execute_command({ command: "echo 'hello world' > ~/project/file.txt" })
# Write multi-line content
acp_remote_execute_command({
command: "cat > ~/project/file.txt << 'EOF'\nline 1\nline 2\nline 3\nEOF"
})
# Append to file
acp_remote_execute_command({ command: "echo 'new line' >> ~/project/file.txt" })
# Create directories
acp_remote_execute_command({ command: "mkdir -p ~/project/new/nested/dir" })
File Operations
# Copy files
acp_remote_execute_command({ command: "cp ~/source.txt ~/dest.txt" })
# Move files
acp_remote_execute_command({ command: "mv ~/old.txt ~/new.txt" })
# Delete files
acp_remote_execute_command({ command: "rm ~/file.txt" })
# Change permissions
acp_remote_execute_command({ command: "chmod 755 ~/script.sh" })
Development Operations
# Git operations
acp_remote_execute_command({ command: "git status", cwd: "~/project" })
acp_remote_execute_command({ command: "git commit -m 'message'", cwd: "~/project" })
# Package management
acp_remote_execute_command({ command: "npm install", cwd: "~/project" })
acp_remote_execute_command({ command: "npm run build", cwd: "~/project" })
# Process management
acp_remote_execute_command({ command: "ps aux | grep node" })
acp_remote_execute_command({ command: "kill -9 12345" })
Why Single Tool?
v1.0.0 removed specialized tools (list_files, read_file, write_file) in favor of execute_command:
✅ Properly expands ~ and environment variables - SFTP-based tools didn't
✅ Maximum flexibility - Use any shell command or tool
✅ Simpler codebase - One tool instead of four
✅ More reliable - No SFTP edge cases or limitations
✅ Consistent behavior - Works exactly like interactive SSH
✅ Easier to maintain - Single code path to test and debug
Configuration
Standalone Server Configuration
Copy .env.example to .env and configure SSH credentials:
cp .env.example .env
Edit .env with your SSH connection details:
# SSH Configuration (required)
SSH_HOST=your-remote-server.com
SSH_PORT=22
SSH_USERNAME=your-username
SSH_PRIVATE_KEY_PATH=/path/to/your/ssh/private/key
mcp-auth Configuration
When using with mcp-auth, SSH credentials are provided programmatically:
import { createServer } from '@prmichaelsen/acp-mcp/factory';
import { readFileSync } from 'fs';
// SSH credentials provided by mcp-auth wrapper
const server = await createServer({
userId: 'user-123',
ssh: {
host: process.env.REMOTE_HOST,
port: parseInt(process.env.REMOTE_PORT || '22'),
username: process.env.REMOTE_USERNAME,
privateKey: readFileSync(process.env.REMOTE_KEY_PATH, 'utf-8'),
},
});
Scripts
npm run dev- Start development server with hot reloadnpm run build- Build for productionnpm run build:watch- Build and watch for changesnpm start- Run production buildnpm test- Run testsnpm run typecheck- Type check without emittingnpm run clean- Remove build output
License
MIT
Author
Patrick Michaelsen
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.