mcp-linux-tools
MCP Linux Tools is a secure MCP server providing AI assistants with a whitelisted API for controlled Linux system administration. Most operations are read-only; write operations are restricted to specific paths and services.
Server Metadata & Discovery – Identify server type, IP, and name; list whitelisted systemd services and allowed WordPress site paths.
File & Directory Operations – List directories, read files (up to 512KB), view head/tail of files (read-only); create directories, change permissions (
chmod), and change ownership (chown) — writes limited to/var/wwwand/opt/.Log Operations – Find WordPress debug log paths; tail/filter/search logs by keyword or AI Translate-specific entries.
System Services – Check status, reload, or restart whitelisted systemd services.
Python Sandbox – Execute Python code snippets in an isolated environment (no network, 8s timeout).
Cron Management – List, add, remove, enable/disable root cron jobs in an MCP-managed section; calculate next run times for a given schedule.
WordPress Operations – Run WP-CLI commands on allowed sites, flush object cache, list plugins and users.
Database Operations – Execute MySQL queries with dangerous statements (
DROP,TRUNCATE,DELETE,ALTER) blocked.Network Operations – Ping hosts to test network reachability.
Git Operations – Run safe Git commands in whitelisted repos;
push,force,delete, and hardresetare blocked.Shell Execution – Run arbitrary shell commands as root or a specified user (300s timeout, no shell expansion — use with caution).
Allows checking the status and reloading or restarting the Apache web server via systemd.
Allows checking the status and reloading or restarting the Docker service via systemd.
Provides safe Git commands for repository operations (no push/force).
Allows read-only MySQL database queries, blocking dangerous operations.
Allows checking the status and reloading or restarting the Odoo ERP service via systemd.
Allows checking the status and reloading or restarting the PHP-FPM service via systemd.
Allows checking the status and reloading or restarting the PostgreSQL database server via systemd.
Executes sandboxed Python code with no network access and an 8-second timeout.
Provides WP-CLI commands, cache flushing, plugin/user listing, and log tailing for WordPress sites.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-linux-tools check the status of nginx"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🛠️ MCP Linux Tools – Complete Tool Reference for LLMs
📖 Description
MCP Linux Tools is an MCP (Model Context Protocol) server that exposes a secure, whitelisted set of operations on a Linux server. It allows AI assistants (such as VS Code, Claude or Cursor) to perform controlled system administration tasks like reading logs, checking service status, managing cron jobs, running WP-CLI commands, and executing sandboxed Python code—all through a uniform API with strict security constraints.
The server runs as a systemd service and communicates over HTTP. All operations are restricted by configurable whitelists (directories, services, WordPress sites). Tools return a uniform response contract {success, data, error, meta}.
Related MCP server: VPS-Guardian-MCP
✨ Features
🔍 Metadata & Discovery – Server info, service whitelist, WordPress allowed sites
📂 File Operations – Read files, list directories, head/tail logs (whitelisted paths only)
⚙️ System Services – Check status, reload or restart whitelisted services
🐍 Python Sandbox – Execute Python code (no network, 8s timeout)
⏰ Cron Management – List, add, remove, enable/disable cron jobs
🌐 WordPress – WP-CLI runner, cache flush, plugin/user listing, log tailing
🗄️ Database – Read-only MySQL queries (dangerous queries blocked)
📡 Network – Ping for connectivity testing
📌 Git – Safe Git commands (no push/force)
📦 Installation
Requirements
Python 3.13 or higher
Root access (for systemctl and crontab)
Linux system with systemd
Step 1: Clone Repository
# Clone the MCP server repository to /opt/mcp
sudo mkdir -p /opt
cd /opt
sudo git clone https://github.com/gerard-kanters/mcp-linux-tools.git mcp
cd /opt/mcpStep 2: Create Python Virtual Environment
# Create virtual environment
sudo python3.13 -m venv /opt/mcp/venv
# Install dependencies
sudo /opt/mcp/venv/bin/pip install --upgrade pip
sudo /opt/mcp/venv/bin/pip install -r requirements.txt --break-system-packagesStep 3: Configure
Edit config.json and adjust the settings for your server:
Set
server_type(development or production)Set
server_ipto your server's IP addressSet
server_nameto identify this serverConfigure directory whitelists, service whitelist, and other settings as needed
See the Configuration section below for detailed information about all configuration options.
Step 4: Create Sandbox Directory
sudo mkdir -p /opt/mcp/sandbox
sudo chown root:root /opt/mcp/sandbox
sudo chmod 755 /opt/mcp/sandboxStep 5: Install Systemd Service
Create a service file: /etc/systemd/system/mcp-linux-tools.service
[Unit]
Description=MCP Linux Tools Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/mcp
ExecStart=/opt/mcp/venv/bin/python /opt/mcp/server.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
# Security settings
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/log /opt/mcp/sandbox
[Install]
WantedBy=multi-user.targetEnable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable mcp-linux-tools.service
sudo systemctl start mcp-linux-tools.service
sudo systemctl status mcp-linux-tools.serviceStep 6: Cursor MCP Configuration
Add to your Cursor MCP configuration (usually ~/.cursor/mcp.json or in Cursor settings):
{
"mcpServers": {
"linux-tools": {
"command": "curl",
"args": [
"-X", "POST",
"http://192.168.1.22:8765/mcp",
"-H", "Content-Type: application/json",
"-d", "@-"
]
}
}
}Or use direct HTTP transport in Cursor MCP settings with:
URL:
http://192.168.1.22:8765/mcpTransport: HTTP
Verification
Check if the server is running:
# Check service status
sudo systemctl status mcp-linux-tools.service
# Check logs
sudo journalctl -u mcp-linux-tools.service -f
# Test HTTP endpoint
curl -X POST http://localhost:8765/mcp -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'Installing Updates
To update the MCP server:
cd /opt/mcp
sudo git pull origin main # or master, depending on your branch
sudo /opt/mcp/venv/bin/pip install -r requirements.txt --break-system-packages
sudo systemctl restart mcp-linux-tools.serviceImportant: After an update, check if config.json is still correct. New configuration options may have been added.
🏗️ Architecture
The server follows a modular MCP architecture:
server.py– Entrypoint: config loading, MCP setup, tool registration, run/retry/signal handlingconfig.py– Config loading and validation (fail-fast on missing fields)register_tools.py– Central tool registrationcore/– Core modules:errors.py– Error codes (DENIED_PATH, INVALID_INPUT, COMMAND_BLOCKED, etc.)models.py– Pydantic models for uniform response contractresponse.py– ok(), err(), err_denied_* helperssecurity.py– Allowlist and path validationprocess.py– Subprocess runner
tools/– Tool modules per domain:discovery.py,filesystem.py,logs.py,systemd.pypython_exec.py,wordpress.py,cron_tools.py,ops.py
All tools return a uniform response contract: {success, data, error, meta}.
⚙️ Configuration
All configuration is done via config.json in the root of the MCP server directory (/opt/mcp/config.json).
Configuration Sections
Server Identification
server_type: "development" or "production"server_ip: IP address of the serverserver_name: Name for the MCP server
Server Listen (optional)
server.host: Bind address (default: "0.0.0.0")server.port: HTTP port (default: 8765)
Logging
logging.log_file: Path to log file
Limits
limits.max_bytes: Maximum file size for reading (default: 524288 = 512KB)limits.max_items: Maximum items in directory listings (default: 500)
Python Sandbox
python.bin: Path to Python interpreter (must be in venv)directories.sandbox_cwd: Working directory for Python sandbox
Directory Whitelists
directories.allowed_read: Directories from which files can be readdirectories.allowed_log: Directories where log files can be readdirectories.allowed_write: Directories where write operations are allowed
Services
services.whitelist: List of service names that can be managed
WordPress
wordpress.allowed_sites: Absolute paths to WordPress rootswordpress.bin_candidates: Possible locations for WP-CLI binarywordpress.log_candidates: Possible locations for WordPress debug logs
Important: After changes to config.json, the service must be restarted:
sudo systemctl restart mcp-linux-tools.service🔒 SECURITY OVERVIEW
LINUX SERVER Tools with limited write operations:
✅ WHAT IS ALLOWED:
READ Files (in allowed directories)
VIEW Logs (system logs)
CHECK Service STATUS and RESTART (only whitelisted services)
EXECUTE Python CODE (sandboxed, no network, 8s timeout)
MANAGE Cron JOBS (only within MCP-managed section)
❌ WHAT IS NOT ALLOWED:
Access to arbitrary directories (strict whitelisting)
Services STOP/START/ENABLE (only restart allowed)
Sudo/root operations
Python with network access
Modifying system crontab outside MCP section
📂 ALLOWED DIRECTORIES
Directory whitelists are configured in config.json under directories.
Read Access (allowed_read):
Default: /var/log, /etc, /tmp, /opt/, /root/scripts, /var/www
Log Access (allowed_log):
Default: /var/log, /tmp, /var/www
Write Access (allowed_write):
Default: /var/www, /opt/
Note: All directory paths are configurable via config.json. Changes require a service restart.
🛠️ ALLOWED SERVICES (SERVICE_WHITELIST)
The service whitelist is configured in config.json under services.whitelist. Only services in this list can be checked or restarted.
Default whitelist (as configured in config.json):
apache2- Apache webserverphp8.4-fpm- PHP FastCGI Process Managerpostfix- Mail serveropendkim- DomainKeys email authenticationsshd- SSH daemondocker- Container runtimememcached- Memory cache daemonpostgresql- PostgreSQL database serverodoo- Odoo ERP system
Note: Service names may vary by distribution. Use get_service_whitelist() to query the active whitelist.
📚 TOOL CATEGORIES
1️⃣ METADATA & DISCOVERY (Read-Only)
get_server_info()- Server identification (type, IP, name)get_service_whitelist()- List of manageable servicesget_wp_allowed_sites()- List of allowed WordPress sites
2️⃣ FILE OPERATIONS
list_dir(path, pattern, include_files, include_dirs, max_items)- Directory listing (Read-Only)read_file(path, max_bytes)- Read file (max 512KB, Read-Only)head(path, n)- First N lines (Read-Only)tail(path, n)- Last N lines (for logs, Read-Only)log_search(keywords, path, n)- Search literal keywords in recent log lines (Read-Only)create_directory(path, owner, group, mode, parents)- Create directory ⚠️ (only /var/www and /opt/)chmod_file(path, mode)- Change file permissions ⚠️ (only /var/www and /opt/)chown_path(path, owner, group)- Change owner ⚠️ (only /var/www and /opt/)
3️⃣ SYSTEM SERVICES
service_status(name)- Check status (Read-Only)reload_service(name)- Reload service viasystemctl reload(preferred action, low impact)restart_service(name, force_restart)- Service modification: default is reload, useforce_restart=Truefor full restart ⚠️ (Live impact!)
4️⃣ PYTHON EXECUTION
python_run(code)- Sandboxed Python (no network, 8s timeout)
5️⃣ CRON MANAGEMENT
cron_list()- View crontab (Read-Only)cron_add(job_id, schedule, command)- Add job ⚠️ (Live impact!)cron_remove(job_id)- Remove job ⚠️ (Live impact!)cron_enable(job_id, enabled)- Enable/disable job ⚠️ (Live impact!)cron_next_runs(schedule, n)- Validate schedule (Read-Only)
6️⃣ WORDPRESS OPERATIONS
wp_cli(site_path, args, as_www_data)- WP-CLI runner for allowed siteswp_cache_flush(site_path, as_www_data)- WordPress cache flushwp_plugin_list(site_path, as_www_data)- List all plugins (JSON)wp_user_list(site_path, as_www_data)- List all users (JSON)log_pick_path()- Find WordPress debug log path
7️⃣ DATABASE OPERATIONS
mysql_query(query, database)- Execute MySQL query (Read-Only, dangerous queries blocked)
8️⃣ NETWORK OPERATIONS
ping_host(host, count)- Test network connectivity (Read-Only)
9️⃣ GIT OPERATIONS
git_command(path, command)- Execute Git commands (only safe commands, no push/force)
🔟 SYSTEM COMMANDS
execute_shell_command(command, user)- Execute shell command ⚠️ (Live impact!)
💡 USAGE EXAMPLES
Server Info:
{"tool": "get_server_info", "args": {}}Service Whitelist:
{"tool": "get_service_whitelist", "args": {}}Service Status:
{"tool": "service_status", "args": {
"name": "nginx"
}}Restart Service:
{"tool": "restart_service", "args": {
"name": "mysql"
}}View Log File:
{"tool": "tail", "args": {
"path": "/var/log/nginx/error.log",
"n": 100
}}Execute Python:
{"tool": "python_run", "args": {
"code": "import sys; print(sys.version)"
}}WordPress Cache Flush:
{"tool": "wp_cache_flush", "args": {
"site_path": "/var/www/netcare.nl"
}}WordPress Plugin List:
{"tool": "wp_plugin_list", "args": {
"site_path": "/var/www/netcare.nl"
}}MySQL Query:
{"tool": "mysql_query", "args": {
"query": "SHOW DATABASES;",
"database": ""
}}Network Ping:
{"tool": "ping_host", "args": {
"host": "8.8.8.8",
"count": 4
}}Git Status:
{"tool": "git_command", "args": {
"path": "/var/www/example",
"command": "status"
}}Add Cron Job:
{"tool": "cron_add", "args": {
"job_id": "backup_daily",
"schedule": "0 3 * * *",
"command": "/usr/bin/backup.sh"
}}⚠️ IMPORTANT NOTES FOR LLMs
Read-Only Default: Most tools are read-only. Write operations are limited to:
reload_service()/restart_service()- Service reload/restartcron_add/remove/enable()- Cron modificationscreate_directory()- Create directory (only /var/www and /opt/)chmod_file()- Change file permissions (only /var/www and /opt/)chown_path()- Change owner (only /var/www and /opt/)execute_shell_command()- Shell commands (use with caution!)
Whitelisting: Everything is whitelisted. Tools return "Denied" if you work outside the whitelist.
Service Names: Different distributions use different service names. For example:
DNS:
systemd-resolved,bind9, ornamedDHCP:
isc-dhcp-serverordhcpdMySQL:
mysql,mariadb, ormysqldSMB:
smbdorsamba
Security First:
No blind
rm -rfpossibleNo arbitrary file writes
Python is sandboxed
Cron commands must use absolute paths
Error Handling – Uniform response contract
{success, data, error, meta}:success=true: data contains result, error is nullsuccess=false: error contains{code, message, hint}, data is nullError codes: DENIED_PATH, DENIED_SERVICE, DENIED_SITE, INVALID_INPUT, COMMAND_BLOCKED, NOT_FOUND, TIMEOUT, etc.
meta: server_type, server_ip, server_name
Return Types:
Strings for simple output
Dicts for structured data (Python, MySQL, etc.)
Lists for directories and cron schedules
🎯 BEST PRACTICES
Server identification: Use
get_server_info()to verify which server you're working onCheck whitelists first: Call
get_service_whitelist()before managing servicesRead-only first: Check status/logs before restarting services
Validate cron schedules: Use
cron_next_runs()to validate schedulesService names: Check which service name is used on the system
Error handling: Always check for "Denied" or {"error": ...} in responses
Log locations: Use
list_dir()to explore log directories before reading logsConfig changes: Always restart the service after changes to
config.json
📊 TESTED & VERIFIED
All tools have been tested and work correctly: ✅ Service status and restart functionality ✅ Log file reading ✅ Python 3.13 execution (sandboxed) ✅ Cron schedule validation ✅ File operations (read-only) ✅ Directory listing
Last Updated: 2026-03-03
Server: Linux (generic)
Environment: Production/Development
Configuration: Via config.json (no hardcoded values)
Architecture: Modular (server.py entrypoint, core/, tools/)
Available Tools
29 toolschmod_fileA
Wijzig de Unix-permissiemodus van een bestaand toegestaan pad.
path moet bestaan en onder allowed_write_dirs vallen. mode moet
een octale tekenreeks van drie of vier cijfers zijn, bijvoorbeeld
755 of 0755. Deze tool muteert bestandssysteemmetadata via
chmod, maar wijzigt de bestandsinhoud niet.
Inputs: mode (required), path (required). Returns: object
chown_pathA
Wijzig eigenaar en groep van een bestaand toegestaan pad.
path moet bestaan en onder allowed_write_dirs vallen. owner en
group moeten bestaande lokale namen zijn. Deze tool muteert
bestandssysteemmetadata via chown; onbekende gebruikers of groepen
en ontbrekende permissies leveren een fout op.
Inputs: path (required), group (required), owner (required). Returns: object
create_directoryA
Maak een nieuwe directory en stel eigenaar, groep en Unix-modus in.
Deze tool wijzigt het bestandssysteem. path mag nog niet bestaan en
de bovenliggende directory moet onder allowed_write_dirs vallen.
owner en group zijn bestaande lokale namen (standaard root);
mode is een octale tekenreeks zoals 755 of 0755. Met
parents=True worden ontbrekende bovenliggende directories aangemaakt;
eigenaar, groep en de opgegeven modus worden alleen expliciet op de
doel-directory toegepast. De uitvoerende service moet daarvoor voldoende
permissies hebben. Succes retourneert "ok" via
{success, data, error, meta}; bestaande paden, onbekende accounts,
ongeldige modi, geweigerde paden en ontbrekende permissies leveren een
foutresponse op. Gebruik deze tool niet om een bestaande directory of
bestandsinhoud te wijzigen.
Inputs: path (required), mode, group, owner, +1 more. Returns: object
cron_addA
Voeg een root-cronjob toe of vervang die binnen de MCP-beheerde sectie.
job_id identificeert de job en accepteert alleen letters, cijfers,
punt, underscore en koppelteken. schedule moet exact vijf cronvelden
bevatten. Het eerste woord van command moet een absoluut pad zijn.
Deze tool herschrijft de root-crontab, maar behoudt regels buiten
# --- BEGIN/END MCP MANAGED ---; een bestaand job_id wordt vervangen.
Inputs: job_id (required), command (required), schedule (required). Returns: object
cron_enableA
Schakel een MCP-beheerde root-cronjob in of uit.
job_id selecteert een bestaande job in de MCP-sectie. Met
enabled=True wordt een uitgeschakelde cronregel actief; met False
wordt de regel met # gecommentarieerd. De tool herschrijft de
root-crontab, behoudt regels buiten de MCP-sectie en doet inhoudelijk
niets wanneer het opgegeven ID niet bestaat.
Inputs: job_id (required), enabled (required). Returns: object
cron_listA
Lees de volledige crontab van de lokale rootgebruiker.
De tool heeft geen parameters en wijzigt de crontab niet. Zowel handmatig beheerde regels als de sectie tussen de MCP-markeringen worden als onbewerkte tekst teruggegeven; een ontbrekende crontab resulteert in een lege tekenreeks.
Inputs: no named parameters. Returns: object
cron_next_runsA
Bereken toekomstige lokale uitvoertijden voor een cronschema.
schedule moet exact vijf geldige cronvelden bevatten. n bepaalt
het aantal resultaten en wordt begrensd tot 1–20. De berekening start
op het huidige servertijdstip, gebruikt de lokale tijdzone en wijzigt
geen crontab. De tool vereist dat de dependency croniter beschikbaar is.
Inputs: schedule (required), n. Returns: object
cron_removeA
Verwijder één job uit de MCP-beheerde sectie van de root-crontab.
job_id is de identifier die eerder door cron_add is opgeslagen.
De tool herschrijft de root-crontab en verwijdert de bijbehorende
MCP-marker en cronregel; regels buiten de MCP-sectie blijven behouden.
Een onbekend job_id veroorzaakt geen verwijdering.
Inputs: job_id (required). Returns: object
execute_shell_commandA
Voer een lokaal programma uit als root of als de opgegeven gebruiker.
command wordt in argumenten opgesplitst en direct gestart, dus pipes,
redirects en andere shellsyntaxis worden niet geïnterpreteerd. Met
user wordt het programma via sudo -u uitgevoerd; zonder waarde is
de uitvoerende gebruiker root. Het commando kan het systeem wijzigen.
Voor curl/wget is de werkdirectory /tmp; de timeout is 300 seconden.
Stdout, stderr, exitcode en de effectieve gebruiker worden geretourneerd.
Inputs: command (required), user. Returns: object
get_server_infoA
Geef informatie over deze MCP server instance.
Geeft server type, IP adres en naam terug om duidelijk te identificeren welke server dit is.
Inputs: no named parameters. Returns: object
get_service_whitelistA
Lijst van services die deze server mag beheren (status/restart).
Inputs: no named parameters. Returns: object
get_wp_allowed_sitesA
Lijst van WordPress roots waarvoor WP-CLI is toegestaan.
Inputs: no named parameters. Returns: object
git_commandA
Voer één Git-subcommando uit in een toegestane lokale repository.
path moet onder allowed_write_dirs vallen en een .git-directory
bevatten. command bevat alles na git -C <path> en wordt met
shell-achtige argumentquoting opgesplitst, zonder shelluitbreiding.
Push, force, delete, branch -d en reset --hard worden geblokkeerd;
andere muterende Git-commando's kunnen de repository wel wijzigen.
De timeout is 30 seconden en stdout, stderr en exitcode worden geretourneerd.
Inputs: path (required), command (required). Returns: object
headA
Eerste n regels van een bestand (onder ALLOWED_READ_DIRS).
Inputs: path (required), n. Returns: object
list_dirA
Bekijk gefilterde directory-inhoud zonder het bestandssysteem te wijzigen.
path moet een bestaande directory onder allowed_read_dirs zijn.
pattern gebruikt pathlib-globsyntaxis (* standaard; gebruik
bijvoorbeeld **/* voor recursieve resultaten). Standaard worden alleen
bestanden opgenomen; zet include_dirs=True voor directories en
include_files=False om bestanden uit te sluiten. max_items gebruikt
standaard de geconfigureerde limiet en wordt begrensd tot 1–max_items
uit de serverconfiguratie. De tool retourneert per item naam, absoluut
pad, type, wijzigingstijd en voor bestanden de grootte; ontoegankelijke
items bevatten een eigen foutmelding. Resultaten gebruiken de standaard
{success, data, error, meta}-response. Gebruik read_file, head of
tail om vervolgens bestandsinhoud te lezen.
Inputs: path (required), pattern, max_items, include_dirs, +1 more. Returns: object
log_pick_pathA
Kies het eerste bestaande WordPress-debuglog uit de configuratie.
De kandidaten worden in de volgorde van wp_log_candidates getest.
De tool wijzigt niets en retourneert alleen het gevonden pad. Als
geen kandidaat een bestaand bestand is, volgt een NOT_FOUND-fout.
Inputs: no named parameters. Returns: object
log_searchA
Zoek letterlijke trefwoorden in de laatste regels van een logbestand.
keywords moet minimaal één niet-lege tekenreeks bevatten; een regel
wordt opgenomen als één van de trefwoorden erin voorkomt. De vergelijking
is hoofdlettergevoelig. Met path wordt een specifiek bestaand bestand
onder allowed_log_dirs gekozen. Zonder path gebruikt de tool het
eerste bestaande bestand uit wp_log_candidates; als dat ontbreekt volgt
een NOT_FOUND-fout. n bepaalt hoeveel laatste regels vóór filtering
worden gelezen. De tool is alleen-lezen en retourneert het gebruikte pad
en uitsluitend de overeenkomende regels via
{success, data, error, meta}. Gebruik tail wanneer geen filtering
nodig is.
Inputs: keywords (required), n, path. Returns: object
mysql_queryA
Voer SQL uit met de lokale MySQL-client als databasegebruiker root.
query is de volledige SQL-tekst en mag niet leeg zijn. database
kiest optioneel een database; een lege waarde gebruikt de standaard
MySQL-context. Queries met de tekst DROP, TRUNCATE, DELETE of
ALTER worden geblokkeerd. Andere SQL, inclusief mogelijk muterende
statements, wordt niet door deze tool geblokkeerd. De timeout is
30 seconden en stdout van de client wordt teruggegeven.
Inputs: query (required), database. Returns: object
ping_hostA
Test netwerkbereikbaarheid van een host met ICMP-ping.
host accepteert alleen letters, cijfers, punten en koppeltekens;
shell-expressies zijn daardoor niet toegestaan. count wordt begrensd
tot 1–10 pakketten. De tool wijzigt het systeem niet, heeft een totale
timeout van 60 seconden en retourneert uitvoer, exitcode en successtatus.
Inputs: host (required), count. Returns: object
python_runA
Voer een kort Python-fragment uit in de geconfigureerde sandboxdirectory.
code is verplichte Python-broncode en wordt met de geconfigureerde
interpreter als python -S -c uitgevoerd. De subprocess krijgt alleen
een minimale PATH en PYTHONUNBUFFERED, gebruikt sandbox_cwd als
werkdirectory en wordt na 8 seconden beëindigd. De code kan binnen de
rechten en isolatie van het MCP-serviceproces side effects veroorzaken.
Stdout, stderr, exitcode en successtatus worden geretourneerd.
Inputs: code (required). Returns: object
read_fileA
Lees een tekstbestand onder allowed_read_dirs zonder het te wijzigen.
path moet een bestaand regulier bestand zijn. max_bytes bepaalt
hoeveel bytes maximaal worden gelezen; zonder waarde geldt de
geconfigureerde max_bytes, en iedere opgegeven waarde wordt begrensd
tot 1–die configuratielimiet. Bytes worden als UTF-8 gedecodeerd waarbij
ongeldige tekens worden vervangen. Als meer gegevens beschikbaar zijn,
eindigt de tekst met [...truncated...]. De
{success, data, error, meta}-response bevat de tekst of een fout voor
een geweigerd pad, ontbrekend bestand of ontbrekende leespermissie.
Gebruik head of tail wanneer alleen regels aan het begin of einde
nodig zijn.
Inputs: path (required), max_bytes. Returns: object
reload_serviceA
Herlaad een service via systemctl reload (voorkeursactie).
Gebruik bij voorkeur reload in plaats van restart om impact te beperken.
Alleen als reload niet wordt ondersteund of expliciet nodig is, gebruik restart_service.
Inputs: name (required). Returns: object
restart_serviceA
Herlaad standaard een toegestane systemd-service of herstart die expliciet.
name moet exact in service_whitelist staan; raadpleeg
get_service_whitelist voor geldige namen. De MCP-service zelf is
geblokkeerd om te voorkomen dat de verbinding wordt verbroken. Met
force_restart=False (standaard) voert de tool systemctl reload uit;
alleen force_restart=True voert systemctl restart uit, wat de service
tijdelijk kan onderbreken en actieve processen kan beëindigen. De
uitvoerende service heeft systemd-permissies nodig en de actie heeft een
timeout van 30 seconden. De {success, data, error, meta}-response bevat
na succes de actie en actuele status, of een fout bij een geweigerde
service, systemd-fout of timeout. Gebruik reload_service wanneer
uitsluitend een reload gewenst is en service_status wanneer geen
wijziging nodig is.
Inputs: name (required), force_restart. Returns: object
service_statusA
Lees de actieve systemd-status van één toegestane service.
name moet exact in service_whitelist staan. De tool voert alleen
systemctl is-active uit, wijzigt de service niet en heeft een timeout
van 10 seconden. Zowel een actieve status als een niet-actieve
systemd-melding wordt als tekst in de standaardresponse teruggegeven.
Inputs: name (required). Returns: object
tailA
Lees de laatste n regels van één specifiek logbestand.
path moet een bestaand bestand onder een geconfigureerde
allowed_log_dirs-directory zijn. n bepaalt hoeveel regels aan
tail -n worden doorgegeven. De tool is alleen-lezen, heeft een
timeout van 10 seconden en retourneert de tekst via de standaard
{success, data, error, meta}-response.
Inputs: path (required), n. Returns: object
wp_cache_flushA
Wis de WordPress-objectcache van één toegestane site via WP-CLI.
site_path moet in wp_allowed_sites staan en een wp-config.php
bevatten. Deze muterende tool voert wp cache flush uit, standaard
als www-data; met as_www_data=False als root met --allow-root.
De timeout is 60 seconden en stdout, stderr en exitcode worden geretourneerd.
Inputs: site_path (required), as_www_data. Returns: object
wp_cliA
Voer opgegeven WP-CLI-argumenten uit voor een toegestane WordPress-site.
site_path moet in wp_allowed_sites staan en wp-config.php bevatten.
args wordt met shell-achtige argumentquoting opgesplitst, zonder
shelluitbreiding, en kan afhankelijk van het WP-CLI-commando de site
wijzigen. Standaard draait het commando als www-data; met
as_www_data=False draait het als root met --allow-root. De timeout
is 60 seconden; commando, stdout, stderr en exitcode worden geretourneerd.
Inputs: args (required), site_path (required), as_www_data. Returns: object
wp_plugin_listA
Lees de geïnstalleerde WordPress-plugins van een toegestane site.
site_path moet in wp_allowed_sites staan en wp-config.php
bevatten. De tool voert wp plugin list --format=json uit, standaard
als www-data; met as_www_data=False als root met --allow-root.
De bedoelde operatie is alleen-lezen en heeft een timeout van 60 seconden.
Inputs: site_path (required), as_www_data. Returns: object
wp_user_listA
Lees de WordPress-gebruikers van een toegestane site als JSON.
site_path moet in wp_allowed_sites staan en wp-config.php
bevatten. De tool voert wp user list --format=json uit, standaard
als www-data; met as_www_data=False als root met --allow-root.
De bedoelde operatie is alleen-lezen en heeft een timeout van 60 seconden.
Inputs: site_path (required), as_www_data. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Most tools have clearly distinct purposes, but several boundaries overlap: reload_service and restart_service both perform a reload by default, and wp_cli overlaps with wp_cache_flush, wp_plugin_list, and wp_user_list while execute_shell_command overlaps with python_run, git_command, and mysql_query. The detailed descriptions help an agent choose, but the redundancy still creates moderate selection risk.
Names are consistently lowercase snake_case, but the verb/noun ordering is mixed: verb-first names like read_file and create_directory sit alongside noun-first names like cron_add, service_status, and wp_plugin_list, plus get_* info tools. This is readable and predictable within subsystems, but there is no single global naming convention.
With 29 tools, the set exceeds the 25+ threshold and feels heavy for its scope. Several tools are redundant, notably reload_service versus restart_service, wp_cli versus the specialized wp_* helpers, and execute_shell_command versus python_run, git_command, and mysql_query. A tighter set of around 20 tools would be clearer.
Core Linux administration workflows are covered: service status/reload/restart, directory and file reading, log inspection, WP-CLI operations, cron lifecycle management, SQL queries, git, and generic shell execution. Minor gaps exist, such as no dedicated file write/delete or explicit service start/stop, but execute_shell_command provides a workaround for those cases.
Maintenance
Related MCP Connectors
Secure Linux sandboxes for AI agents, as MCP tools.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Give your AI assistant its own small Linux computer: isolated Firecracker microVMs with root, internet and a real disk. Run code, install packages, serve apps on a public URL. Idle sandboxes fall asleep instead of being deleted, keep their files and wake on the next command, even in a later chat. Jobs and batches with per-job cost caps. Servers in the EU.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI tools to perform server operations such as log inspection, system monitoring, code management, Nginx and certificate management, with support for local and remote SSH modes and built-in security controls.2360 npmMIT
- AlicenseAqualityBmaintenanceEnables AI agents to safely monitor Linux VPS health, inspect Docker containers, retrieve service logs, and execute whitelisted recovery actions via MCP.31134 npm45 PyPIMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI-controlled administration of remote Linux hosts and containers, including bounded shell execution, persistent PTY sessions, durable jobs/tasks, hardened filesystem access, process/service control, and resumable transfers.-
- AlicenseAqualityBmaintenanceGives AI agents safe, bounded, non-blocking access to Linux sysadmin inspection tasks, including CPU, RAM and disk healthchecks, memory-safe log tailing with regex filtering, and user-level systemd service and timer auditing. All operations run without sudo or unrestricted root shells, avoiding interactive pager hangs and context window flooding.460 PyPI1MIT