Server data from the Official MCP Registry
Manage AWS, Hetzner, OVH and SSH servers: status, logs, CloudWatch, IP bans, safe command exec.
Manage AWS, Hetzner, OVH and SSH servers: status, logs, CloudWatch, IP bans, safe command exec.
Valid MCP server (1 strong, 1 medium validity signals). 5 known CVEs in dependencies (0 critical, 2 high severity) ⚠️ Package registry links to a different repository than scanned source. Imported from the Official MCP Registry.
3 files analyzed · 6 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"dev-servonaut-servonaut": {
"args": [
"servonaut"
],
"command": "uvx"
}
}
}From the project's GitHub README.
Your servers. Your terminal. Your AI agent. One TUI.
Manage AWS, Hetzner, OVH, and custom servers from one terminal — with a built-in AI assistant and MCP server.
Linux / macOS:
curl -sSL https://raw.githubusercontent.com/zb-ss/servonaut/master/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/zb-ss/servonaut/master/install.ps1 | iex
Or install directly via pipx / pip:
pipx install servonaut
Manual install from source:
git clone https://github.com/zb-ss/servonaut.git
cd servonaut
pipx install .
Instance list — AWS, Hetzner, OVH, and custom servers merged into one view
Sidebar reveals Fleet Memory, Memory Sync, Secrets, Settings, and per-provider management for OVH and Hetzner
Built-in AI assistant with MCP server integration — chat with local providers or hosted Servonaut AI
CloudWatch log browsing with Top IPs analysis, geolocation, and abuse scoring
Ban/unban IPs via WAF, Security Groups, or NACLs with audit trail
All screenshots and the launch video were recorded with --demo active, which replaces real IPs, ARNs, paths, and secrets with safe fake equivalents. See docs/demo-mode.md for what is redacted and how to use it.
L to start — polled over SSH only while open, never in the background)tail -f with pause, search, and log switchingOVH → ⚙ Manage per-provider screen with create / start / stop / reboot / delete (Cloud / VPS / dedicated routed automatically), region-first create wizard with API-backed flavor pricing, plus DNS zones, IP blocks and failover IPs, snapshots, block storage, billing and invoices, project-level SSH keysHetzner → ⚙ Manage per-provider screen with full lifecycle (create / power on / shutdown / power off / reboot / delete), state-aware action toolbar, project SSH-key registry, plus equivalent CLI (servonaut hetzner list / create / destroy / ssh-keys / server-types). Auto-registers new servers into the fleet. Full docsservonaut ai quota.ai_provider.openai_api_key, ai_provider.anthropic_api_key, ai_provider.gemini_api_key, ai_provider.ollama_api_key for Ollama Cloud). Local Ollama needs no key — just point ai_provider.base_url at your install. All options coexist with Servonaut AI; a one-time picker lets you choose the default and you can switch per-session from the chat-panel header.get_server_memory(id) before SSH round-trips; CLI has servonaut memory build|refresh|show|export|annotate|pin|clear. Full docs☁ Memory Sync sidebar entry is the unified setup / unlock / status hub.readonly / standard / dangerous), confirmation-protocol prompt baked into every mutating tool's description, and a JSONL audit trail.servonaut login (or TUI → Account → Login) to unlock config sync across machines and the MCP relayservonaut connect (or the TUI autostart) keeps a Mercure SSE connection open so AI agents and team-mates can dispatch MCP tool calls to this machine over the internet. Tokens never leave the CLI; heartbeats every 30 s with automatic Mercure JWT refresh.extra_ssh_options per connection profile / custom server for legacy boxes (HostKeyAlgorithms=+ssh-rsa, custom keepalives, etc.)servonaut --updateservonaut --install-desktop adds an app launcher entry (Linux/macOS)~/.servonaut/config.json~/.aws/credentials and ~/.aws/config)pipx for isolated installation (recommended)Your AWS credentials need ec2:DescribeInstances and ec2:DescribeRegions permissions. Additional permissions needed for optional features:
| Feature | Required Permissions |
|---|---|
| CloudTrail browser | cloudtrail:LookupEvents |
| IP ban (WAF) | wafv2:GetIPSet, wafv2:UpdateIPSet |
| IP ban (Security Groups) | ec2:AuthorizeSecurityGroupIngress, ec2:RevokeSecurityGroupIngress, ec2:DescribeSecurityGroups |
| IP ban (NACLs) | ec2:CreateNetworkAclEntry, ec2:DeleteNetworkAclEntry, ec2:DescribeNetworkAcls |
| CloudWatch Logs | logs:DescribeLogGroups, logs:FilterLogEvents |
| OVHcloud (optional) | OVH API credentials — 3-key (application key / secret / consumer key) or OAuth2. Set up via servonaut --setup-ovh or in Settings. |
servonaut
That's the whole interface. The TUI is the primary and recommended way to use Servonaut — every feature (fleet view, SSH, remote commands, logs, IP banning, AI chat, server memory, provider management) is reachable from the sidebar, with full mouse and keyboard support.
A few flags you may want on day one:
servonaut --update # Check for updates and upgrade
servonaut --install-desktop # Create desktop shortcut (Linux/macOS)
servonaut --setup-ovh # Guided OVHcloud credential setup
servonaut --debug # Verbose logging to stderr
Headless & automation: every major feature also has a scriptable CLI
(servonaut connect, servonaut memory, servonaut ai,
servonaut hetzner, servonaut secrets) for CI runners, cron jobs, and
boxes without an interactive session — see the
CLI Reference. Wiring up an AI agent instead?
Jump to MCP Server for AI Agents.
| Context | Key | Action |
|---|---|---|
| Main Menu | U | Update Servonaut (when update available) |
| Global | Q | Quit |
| Global | ? | Help screen |
| Global | Escape | Go back / close |
| Instance List | / | Focus search |
| Instance List | R | Force-refresh from AWS |
| Instance List | S | SSH to selected instance |
| Instance List | B | Browse remote files |
| Instance List | C | Run command overlay |
| Instance List | T | SCP transfer |
| Instance List | Y | Copy IP to clipboard |
| Server Actions | L | Toggle the live resource monitor |
| Server Actions | 1–8 | Run the numbered action (Browse, Command, SSH, …) |
| Server Actions | Esc | Close inline view, or go back |
| Global | F2 | Toggle AI chat panel |
| Anywhere | Mouse drag | Select text (auto-copies to clipboard) |
| Anywhere | Ctrl+C | Copy selected text |
| Command Overlay | Ctrl+C | Stop running command |
| Command Overlay | Ctrl+R | Command picker (saved + recent) |
| Command Overlay | Ctrl+S | Save command to favorites |
| Command Overlay | Up/Down | Command history |
| Log Viewer | P | Pause/resume streaming |
| Log Viewer | C | Clear output |
| Log Viewer | F | Find/search in output |
| Log Viewer | L | Switch log file |
The TUI opens to a unified instance list (AWS + OVH + Hetzner + custom servers in one searchable table). The collapsible left sidebar groups everything else by purpose:
Core
Logs & Security
Tools
OVH (visible when configured)
Hetzner (visible when configured)
Account
Server Actions (clicking any instance row): a per-instance dashboard — the detail pane shows the server's identity, a memory snapshot, and an opt-in live resource monitor (L), while the action rail covers Browse Files (opens inline in the dashboard), Run Command, SSH Connect, SCP Transfer, View Scan Results, View Logs (tail -f), AI Analysis, Ban IP, and Manage/Verify SSH Ref
Command history persists across sessions — use Ctrl+R to search history and saved commands, Ctrl+S to save favorites.
| Scenario | Behavior |
|---|---|
| First launch (no cache) | Fetches from AWS with progress indicator |
| Restart within TTL (default 1h) | Instant load from cache |
| Restart after TTL | Shows stale data immediately, refreshes in background |
Press R | Force-refresh from AWS |
All configuration lives in ~/.servonaut/config.json, created automatically on first run.
See Configuration Guide for the full reference including connection profiles, custom servers, scan rules, and match conditions.
Legacy / special-case SSH hosts: connection profiles and custom servers both accept an extra_ssh_options array that appends arbitrary -o KEY=VALUE flags per host — use it to talk to ancient OpenSSH boxes (HostKeyAlgorithms=+ssh-rsa), tune keepalives, or set connect timeouts without weakening your global SSH defaults. See Per-host SSH tuning.
Secrets: API keys in config.json support $ENV_VAR and file:~/.secrets/key syntax so the config file stays secret-free. You can also create ~/.secrets/servonaut.env with KEY=value pairs — loaded automatically on startup.
# MCP server for AI agents
pipx inject servonaut mcp
# or: pip install 'servonaut[mcp]'
# Hetzner Cloud / OVHcloud provider SDKs
pip install 'servonaut[hetzner]'
pip install 'servonaut[ovh]'
# Install everything
pip install 'servonaut[all]'
AI log analysis (OpenAI, Anthropic, Gemini, Ollama) needs no extra install —
httpx ships as a base dependency.
This section is for wiring up AI agents (Claude Code, Cursor, Windsurf, …) — not day-to-day interactive use. If you're a human operating your fleet, the TUI above is the recommended interface.
Servonaut includes an integrated MCP server that exposes tools to AI agents like Claude Code:
# Auto-install into a coding agent
servonaut --mcp-install claude # Claude Code
servonaut --mcp-install cursor # Cursor
servonaut --mcp-install windsurf # Windsurf
servonaut --mcp-install opencode # OpenCode
servonaut --mcp-install vscode # VS Code Copilot
servonaut --mcp-install all # All of the above
# Run MCP server manually (stdio transport)
servonaut --mcp
You don't need the TUI to use Servonaut as an agent toolbox. The MCP server
runs fully headless — servonaut --mcp never loads the terminal UI (this is
enforced by a regression test), so you can install it on a server or CI box
purely as an MCP backend for your coding agent:
pipx install 'servonaut[mcp]'
servonaut --mcp-install claude # or cursor, windsurf, opencode, vscode, all
Configure credentials and servers the same way as a TUI install (
~/.servonaut/config.json, $ENV_VAR / file: secret syntax — see
Configuration Guide). For Servonaut Cloud features
(relay, config sync, hosted AI), servonaut login runs the device-flow
sign-in fully headless — approve from a browser on any device. Everything an
agent does goes through the same guard levels and is logged to
~/.servonaut/mcp_audit.jsonl.
Available tools:
| Category | Tools |
|---|---|
| Instance ops | list_instances, check_status, get_server_info, run_command, get_logs, transfer_file |
| AWS observability & security | cloudwatch_list_log_groups, cloudwatch_get_log_events, cloudwatch_top_ips, cloudtrail_lookup_events, ip_ban_list_configs, ip_ban_list_banned, ip_ban_set |
| Server memory | get_server_memory, list_server_memories, build_server_memory, refresh_server_memory |
| Session / backend | whoami, api_request |
| Relay | relay_status, relay_reconnect, mcp_tool_call |
| Hetzner Cloud | hetzner_list_servers, hetzner_list_server_types, hetzner_list_ssh_keys, hetzner_create_ssh_key, hetzner_delete_ssh_key, hetzner_create_server, hetzner_delete_server, hetzner_power_on, hetzner_power_off, hetzner_shutdown, hetzner_reboot |
| OVHcloud | ovh_monitoring, ovh_list_ips, ovh_firewall_rules, ovh_ssh_keys, ovh_snapshots, ovh_dns_records, ovh_billing, ovh_invoices, ovh_create_instance, ovh_delete_instance, ovh_start_instance, ovh_stop_instance, ovh_reboot_instance |
| AWS EC2 | aws_list_regions, aws_list_amis, aws_list_instance_types, aws_list_key_pairs, aws_list_subnets, aws_list_security_groups, aws_start_instance, aws_stop_instance, aws_reboot_instance, aws_terminate_instance, aws_run_instances |
| S3 / Object Storage | s3_list_buckets, s3_list_objects, s3_download_object, s3_create_bucket, s3_delete_bucket, s3_upload_object, s3_delete_object, s3_copy_object, s3_move_object, s3_generate_presigned_url |
The tool list is filtered to what's actually usable: OVH and Hetzner tools appear only when those providers are configured, the ip_ban_* tools only when at least one IP-ban target is defined, and the *_server_memory* tools only when the memory subsystem is enabled. CloudWatch/CloudTrail and the core instance tools are always available (AWS is the base provider).
cloudwatch_top_ips parses WAF/ALB structured logs to rank client IPs with allowed/blocked counts — pair it with cloudtrail_lookup_events to corroborate, then ip_ban_set to block via WAF, a security group, or a NACL.whoami returns session metadata — the OAuth bearer is never exposed.api_request lets an agent make authenticated REST calls against servonaut.dev with automatic 401 refresh and a CLI-side rate limit (30/min). The bearer stays on the CLI.mcp_tool_call wraps a JSON-RPC 2.0 tools/call envelope against the hosted MCP at mcp.servonaut.dev — used for premium tools when your plan includes them.get_server_memory(id) returns the cached fact snapshot — agents call this BEFORE any SSH round-trip so they answer most OS / runtime / service questions without run_command. Pass format='context_block' to get back a <CONTEXT> envelope for direct prompt injection.Guard levels: readonly (list/status/introspection only — includes CloudWatch/CloudTrail and ip_ban_list_* queries), standard (read + safe commands + authenticated REST + power management — start / stop / reboot / shutdown + S3 download), dangerous (everything, including create_server / delete_server / transfer_file / ip_ban_set / aws_terminate_instance / aws_run_instances / S3 mutations (s3_create_bucket, s3_delete_bucket, s3_upload_object, s3_delete_object, s3_copy_object, s3_move_object, s3_generate_presigned_url)). Dangerous shell commands (rm -rf, shutdown, reboot, etc.) are always blocked regardless of guard level. Mutating tools carry an explicit "confirm with the user before calling" cue in their descriptions; the top-level MCP instructions document the three-step protocol (summarise → state args → wait for affirmative reply). All operations are logged to ~/.servonaut/mcp_audit.jsonl.
Paste this prompt into Claude Code, Cursor, or any AI coding assistant to get Servonaut installed and configured automatically:
Install and configure Servonaut, a TUI for managing servers.
1. Install: `pipx install servonaut` (or `pip install servonaut`)
2. Install optional deps: `pipx inject servonaut mcp` (for the MCP server)
3. Run `servonaut` once to generate ~/.servonaut/config.json
4. Read ~/.servonaut/config.json and help me configure:
- AWS regions to scan (default scans all, set `regions` array to limit)
- Default SSH username (`default_username`, default "ec2-user")
- Cache TTL (`cache_ttl_seconds`, default 3600)
- Terminal emulator if not auto-detected (`terminal_emulator`)
5. If I use bastion/jump hosts, help me set up `connection_profiles` and `connection_rules`
6. If I have non-AWS servers, help me add them to `custom_servers`
7. If I want AI log analysis, help me configure `ai_provider` (openai/anthropic/gemini/ollama)
- Each cloud provider has its own dedicated key field (`openai_api_key`, `anthropic_api_key`, `gemini_api_key`, `ollama_api_key`)
- All key fields support `$ENV_VAR` and `file:~/.secrets/key` syntax so they don't go in the config file
8. Install MCP server into your coding agent: `servonaut --mcp-install claude` (or `cursor`, `windsurf`, `opencode`, `vscode`, `all`)
After setup, launch with `servonaut` and walk me through the key features.
Optional — Servonaut works fully offline against your own AWS / OVH credentials. Signing in at servonaut.dev unlocks:
config.json between machines. The passphrase never leaves your
client; the server only sees ciphertext. Sidebar entry 🔄 Sync Config opens the snapshot manager directly (Pull Latest / Push New
/ Restore / Rename / Delete).https://servonaut.dev/account reports your CLI as
online, and hosted agents can reach it.☁ Memory Sync sidebar entry, click Unlock
Memory Sync, and enter a passphrase. The same screen handles
first-time enrolment AND post-restart unlock — your private key is
wrapped with the passphrase locally, so the server never sees it.
After unlock, click Sync now to push every cached server's memory
modules as encrypted envelopes. Per-feature settings (digest
cadence, Mercure push, AI consent) live at the bottom of the
Settings panel and are stored on your servonaut.dev account.Sign in from the TUI's Account / Login screen. After a successful
device-flow authentication, the TUI auto-starts an in-process relay
listener and the sidebar indicator flips to ● connected.
The listener is tied to the TUI window — closing the TUI drops the
connection after ~60 s. For always-on reachability (CI runners,
headless boxes), use servonaut connect --bg instead; the CLI and
TUI cooperate over ~/.servonaut/relay.lock so they can't run at the
same time. The TUI shows external listener (PID N) when a --bg
listener is holding the connection.
servonaut connect # Foreground relay (Ctrl+C to stop)
servonaut connect --bg # Detach; writes ~/.servonaut/relay.pid
servonaut connect --status # Local + backend view with divergence warning
servonaut connect --stop # SIGTERM the background listener
servonaut connect --reconnect # Heal a stale SSE socket (stop+start)
servonaut connect --force-bg # Take over from a TUI's in-process listener
See CLI Reference → servonaut connect for full flags.
Tokens are stored at ~/.servonaut/auth.json with mode 0600, written
atomically via tmp + os.replace(). If an older build left the file
world-readable, the next run auto-fixes it.
Centralise SSH keys + other named secrets behind a pluggable provider backend. Day-to-day this is invisible: once configured, SSH key resolution checks your provider automatically on every connect — you keep clicking SSH in the TUI and it just works. The commands below are one-time setup. MVP supports two backends:
~/.servonaut/secrets.json
(mode 0600, atomic write, same trust model as auth.json). Always
available on Solo and Teams plans.bws) — keys live in your team's Bitwarden
Secrets Manager project. Team admin configures the project from
https://servonaut.dev/account/teams/<slug>/secrets; CLI fetches
the metadata and reads/writes through the local bws binary using
your own access token. The token never leaves your machine —
servonaut.dev only stores the project ID and the name of the env
var holding the token.To use Bitwarden as your team's backend:
# 1. Install the bws CLI (one-time)
servonaut secrets install bws # macOS: brew · Linux: cargo
# Windows / other → prints upstream install URL.
# 2. Mint a BWS access token (https://bitwarden.com/help/personal-access-tokens/)
# and export it
export BWS_ACCESS_TOKEN=<your-token>
# 3. Verify wiring
servonaut secrets status # shows plan, entitlement, active provider
# That's it — SSH key resolution now checks Bitwarden first, ~/.ssh as
# fallback. Push a key into BWS with `bws secret create`:
bws secret create "$(basename ~/.ssh/prod-server)" \
"$(cat ~/.ssh/prod-server)" \
--project-id <project-uuid-from-status>
Key resolution order on every SSH connect:
~/.ssh discovery (existing patterns + fuzzy match).config.json::instance_keys[<id>] or
config.default_key.Free-tier users get the legacy ~/.ssh-only flow with zero behaviour
change. Provider-supplied keys land in ~/.servonaut/keys/<name> at
mode 0600.
Threat-model + design notes are pinned in the codebase via inline
docstrings on services/secret_provider.py,
services/bitwarden_provider.py, and
services/secret_provider_resolver.py.
# Run directly (primary dev workflow)
PYTHONPATH=src python3 -m servonaut.main
# Run with debug logging
PYTHONPATH=src python3 -m servonaut.main --debug
# Install editable
pip install -e .
# Update pipx installation after changes
pipx install . --force
# Run tests
pip install -e ".[test]"
pytest
See Architecture for codebase structure and design patterns.
See Troubleshooting Guide for help with SSH connections, bastion hosts, key management, and AWS credentials.
All runtime files are under ~/.servonaut/:
| File | Purpose |
|---|---|
config.json | Main configuration |
cache.json | Cached instance list (AWS + merged OVH) |
auth.json | OAuth tokens for servonaut.dev, mode 0600, atomic writes |
keywords.json | Scan results store |
command_history.json | Saved commands and command history |
ip_ban_audit.json | IP ban audit trail |
mcp_audit.jsonl | MCP server audit trail |
relay.pid | Background servonaut connect --bg PID (when running) |
relay.lock | Advisory flock shared between the TUI's in-process listener and --bg, carries {pid, mode, acquired_at} |
memory/ | Server-memory store: <provider>/<instance_id>/<module>.json per probed server, plus index.json |
memory/sync_queue.jsonl | Pre-encryption envelopes waiting to be pushed to servonaut.dev. Replayed on next bootstrap; deleted after a successful drain. Only present while Memory Sync has unsent work. |
logs/servonaut.log | Application log |
logs/relay.log | Relay lifecycle events (one JSON line per event, secrets redacted) |
Logs are always written to ~/.servonaut/logs/servonaut.log. Use --debug for verbose stderr output.
When SSH fails, the terminal window stays open showing the error and exit code.
This project is licensed under the MIT License — see the LICENSE file for details.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.