Skip to main content
Glama

🛠️ 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/mcp

Step 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-packages

Step 3: Configure

Edit config.json and adjust the settings for your server:

  • Set server_type (development or production)

  • Set server_ip to your server's IP address

  • Set server_name to identify this server

  • Configure 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/sandbox

Step 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.target

Enable 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.service

Step 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/mcp

  • Transport: 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.service

Important: 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 handling

  • config.py – Config loading and validation (fail-fast on missing fields)

  • register_tools.py – Central tool registration

  • core/ – Core modules:

    • errors.py – Error codes (DENIED_PATH, INVALID_INPUT, COMMAND_BLOCKED, etc.)

    • models.py – Pydantic models for uniform response contract

    • response.py – ok(), err(), err_denied_* helpers

    • security.py – Allowlist and path validation

    • process.py – Subprocess runner

  • tools/ – Tool modules per domain:

    • discovery.py, filesystem.py, logs.py, systemd.py

    • python_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 server

  • server_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 read

  • directories.allowed_log: Directories where log files can be read

  • directories.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 roots

  • wordpress.bin_candidates: Possible locations for WP-CLI binary

  • wordpress.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 webserver

  • php8.4-fpm - PHP FastCGI Process Manager

  • postfix - Mail server

  • opendkim - DomainKeys email authentication

  • sshd - SSH daemon

  • docker - Container runtime

  • memcached - Memory cache daemon

  • postgresql - PostgreSQL database server

  • odoo - 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 services

  • get_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 via systemctl reload (preferred action, low impact)

  • restart_service(name, force_restart) - Service modification: default is reload, use force_restart=True for 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 sites

  • wp_cache_flush(site_path, as_www_data) - WordPress cache flush

  • wp_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

  1. Read-Only Default: Most tools are read-only. Write operations are limited to:

    • reload_service() / restart_service() - Service reload/restart

    • cron_add/remove/enable() - Cron modifications

    • create_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!)

  2. Whitelisting: Everything is whitelisted. Tools return "Denied" if you work outside the whitelist.

  3. Service Names: Different distributions use different service names. For example:

    • DNS: systemd-resolved, bind9, or named

    • DHCP: isc-dhcp-server or dhcpd

    • MySQL: mysql, mariadb, or mysqld

    • SMB: smbd or samba

  4. Security First:

    • No blind rm -rf possible

    • No arbitrary file writes

    • Python is sandboxed

    • Cron commands must use absolute paths

  5. Error Handling – Uniform response contract {success, data, error, meta}:

    • success=true: data contains result, error is null

    • success=false: error contains {code, message, hint}, data is null

    • Error codes: DENIED_PATH, DENIED_SERVICE, DENIED_SITE, INVALID_INPUT, COMMAND_BLOCKED, NOT_FOUND, TIMEOUT, etc.

    • meta: server_type, server_ip, server_name

  6. Return Types:

    • Strings for simple output

    • Dicts for structured data (Python, MySQL, etc.)

    • Lists for directories and cron schedules


🎯 BEST PRACTICES

  1. Server identification: Use get_server_info() to verify which server you're working on

  2. Check whitelists first: Call get_service_whitelist() before managing services

  3. Read-only first: Check status/logs before restarting services

  4. Validate cron schedules: Use cron_next_runs() to validate schedules

  5. Service names: Check which service name is used on the system

  6. Error handling: Always check for "Denied" or {"error": ...} in responses

  7. Log locations: Use list_dir() to explore log directories before reading logs

  8. Config 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 tools
chmod_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

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

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

    A3.7/5.0

    Scored across 29 tools

    Disambiguation3/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables 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.
      23
      60 npm
      MIT
    • F
      license
      Not graded
      quality
      B
      maintenance
      Enables 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.
      -
    • A
      license
      A
      quality
      B
      maintenance
      Gives 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.
      4
      60 PyPI
      1
      MIT