Kastell
OfficialKastell is a comprehensive server management and security platform for provisioning, managing, securing, monitoring, and auditing cloud servers via an AI-native MCP interface (17 tools).
Server Info & Monitoring
List servers, check status/health, monitor CPU/RAM/disk, view logs, list Docker containers, and get fleet-wide posture (health, audit scores, SSH response times).
Provisioning
Deploy new servers on Hetzner, DigitalOcean, Vultr, or Linode with Coolify, Dokploy, or bare VPS mode using templates (starter, production, dev).
Management
Add/remove/destroy servers, SSH access, restart, export/import server lists.
Maintenance
Update platform software, run full 5-step maintenance cycles (status → update → health → reboot → final check).
Backup & Snapshots
Create/restore local backups (DB + config) and manage cloud provider VPS snapshots (create, list, delete, restore).
Security Auditing
Run 470+ checks across 32 categories with compliance filtering (CIS, PCI-DSS, HIPAA), score thresholds for CI/CD gating, audit snapshots/comparisons, and HTML/JSON/SVG reports.
Hardening (Lock)
Apply 24-step production hardening (SSH, UFW, fail2ban, sysctl, auditd, AIDE, Docker daemon) with dry-run preview and before/after score tracking.
Safe Auto-Fix
Apply safe-tier fixes with backup, dry-run preview, rollback, and fix history. Target specific checks or categories.
Guard Daemon
Install autonomous security monitoring cron (every 5 minutes) with breach detection for disk/RAM/CPU/audit thresholds.
Forensic Evidence
Collect firewall rules, auth logs, listening ports, and system logs with SHA256 manifest.
Proactive Doctor
Detect disk trending full, high swap, stale packages, fail2ban bans, audit regressions, old backups, and reclaimable Docker space — with optional auto-fix.
Compare Servers
Side-by-side comparison of two servers by category scores or individual check results.
Domain & Firewall
Add/remove domains, manage SSL, verify DNS, and configure UFW rules.
Explain Checks
Deep-dive into any audit check: description, risk, remediation steps, fix tier, and compliance references (no SSH required).
Plugin Management
List and validate installed plugins.
Allows provisioning and managing cloud servers on Linode (Akamai), including snapshots and automated maintenance routines.
Enables automated deployment, status monitoring, and snapshot management for DigitalOcean droplets.
Facilitates the management and hardening of Docker-based platforms like Coolify and Dokploy on remote infrastructure.
Supports provisioning, management, and snapshot routines for infrastructure hosted on Hetzner Cloud.
Provides security hardening, firewall configuration, and maintenance tools specifically tailored for Ubuntu-based server environments.
Allows for automated server provisioning, status tracking, and backup operations on the Vultr cloud platform.
Utilizes YAML files for defining server deployment configurations and infrastructure templates.
English | Türkçe
Why Kastell?
Server security is fragmented. Lynis scans but doesn't fix. OpenSCAP is powerful but complex. Custom scripts work until they don't -- and nobody maintains them. Each tool has its own output format, its own update cycle, its own learning curve.
Kastell takes a different approach: one CLI that audits, fixes, hardens, and monitors. Scan your server, apply safe fixes, lock it down to production standards, and keep watching -- all with the same tool.
AI-native from day one. Kastell ships with a built-in MCP server, so Claude, Cursor, or any MCP-compatible AI agent can manage your servers directly. Go from a prompt to production hardening in seconds.
You don't need four separate tools to secure a server.
Related MCP server: Multi-Function Security MCP
Quick Start
# Interactive mode -- no commands to memorize
npx kastellRunning kastell without any arguments launches an interactive search menu with a gradient ASCII banner and quick-start examples. Browse actions by emoji-categorized groups, type to filter results instantly, and configure options step by step -- no need to remember any command names or flags.
██╗ ██╗ ██████╗ ███████╗████████╗███████╗██╗ ██╗
██║ ██╔╝ ██╔══██╗ ██╔════╝╚══██╔══╝██╔════╝██║ ██║
█████╔╝ ███████║ ███████╗ ██║ █████╗ ██║ ██║
██╔═██╗ ██╔══██║ ╚════██║ ██║ ██╔══╝ ██║ ██║
██║ ██╗ ██║ ██║ ███████║ ██║ ███████╗███████╗███████╗
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚══════╝╚══════╝╚══════╝
KASTELL v2.3.1 · Your infrastructure, fortified.
$ kastell init --template production → deploy a new server
$ kastell status --all → check all servers
$ kastell secure setup → harden SSH + fail2ban
$ kastell maintain --all → full maintenance cycle
? What would you like to do?
Server Management
❯ Deploy a new server
Add an existing server
List all servers
...
Security
Harden SSH & fail2ban
Manage firewall (UFW)
...Each action includes sub-options (server mode, template, log source, port number, etc.) and a <- Back option to return to the main menu at any point.
If you already know the commands, you can still use them directly:
kastell init # Deploy a new server
kastell status my-server # Check server status
kastell backup --all # Backup all serversKastell handles server provisioning, SSH key setup, firewall configuration, and platform installation automatically.
What Makes Kastell Different?
Problem | Solution |
Broke your server with an update? | Pre-update snapshot protection via |
No idea if your server is healthy? | Built-in monitoring, health checks, and |
Security is an afterthought? | Firewall, SSH hardening, SSL, and security audits built-in |
Backups? Maybe someday... | One-command backup & restore with manifest tracking |
Managing multiple servers? |
|
Existing server not tracked? |
|
Don't want to memorize commands? | Just run |
Kastell vs Alternatives
Feature | Kastell | Lynis | OpenSCAP |
Installation |
| Package manager | Package manager |
Language | TypeScript | Shell | C/Python |
Security Checks | 449 | 300+ | Varies by profile |
Auto-Fix | Safe tier | Suggest only | Suggest only |
MCP (AI Agent) | 17 tools | -- | -- |
Compliance | CIS, PCI-DSS, HIPAA | CIS, HIPAA | CIS, STIG, PCI-DSS |
Cloud Provision | 4 providers | -- | -- |
Hardening (Lock) | 24-step | -- | -- |
Remote Monitoring | Guard daemon | -- | -- |
Telegram Bot | Built-in | -- | -- |
Platform Support | Linux (SSH) | Linux/macOS/BSD | Linux |
License | Apache 2.0 | GPL-3.0 | LGPL-2.1 |
What Can You Do?
Deploy
kastell # Interactive menu (recommended)
kastell init # Interactive setup (direct)
kastell init --provider hetzner # Non-interactive
kastell init --config kastell.yml # From YAML config
kastell init --template production # Use a template
kastell init --mode bare # Generic VPS (no platform)
kastell init --mode dokploy # Dokploy (Docker Swarm PaaS)Manage
kastell list # List all servers
kastell status my-server # Check server status
kastell status --all # Check all servers
kastell ssh my-server # SSH into server
kastell restart my-server # Restart server
kastell destroy my-server # Destroy cloud server entirely
kastell add # Add existing server
kastell remove my-server # Remove from local config
kastell config set key value # Manage default configuration
kastell config validate # Validate servers.yaml structure and types
kastell export # Export server list to JSON
kastell import servers.json # Import servers from JSONUpdate & Maintain
kastell update my-server # Update platform (Coolify or Dokploy, auto-detected)
kastell update my-server --dry-run # Preview update without executing
kastell maintain my-server # Full maintenance (snapshot + update + health + reboot)
kastell maintain my-server --dry-run # Preview maintenance steps
kastell maintain --all # Maintain all serversBack Up & Restore
kastell backup my-server # Backup DB + config
kastell backup --all # Backup all servers
kastell restore my-server # Restore from backupSnapshots
kastell snapshot create my-server # Create VPS snapshot (with cost estimate)
kastell snapshot list my-server # List snapshots
kastell snapshot list --all # List all snapshots across servers
kastell snapshot delete my-server # Delete a snapshotSecurity
kastell firewall status my-server # Check firewall
kastell firewall setup my-server # Configure UFW
kastell secure audit my-server # Security audit
kastell secure setup my-server # SSH hardening + fail2ban
kastell domain add my-server --domain example.com # Set domain + SSLSecurity Audit
kastell audit my-server # Full security audit (31 categories, 449 checks)
kastell audit my-server --json # JSON output for automation
kastell audit my-server --threshold 70 # Exit code 1 if score below threshold
kastell audit my-server --fix # Interactive fix mode (prompts per severity)
kastell audit my-server --fix --dry-run # Preview fixes without executing
kastell audit my-server --watch # Re-audit every 5 min, show only changes
kastell audit my-server --watch 60 # Custom interval (60 seconds)
kastell audit --host root@1.2.3.4 # Audit unregistered server
kastell audit my-server --badge # SVG badge output
kastell audit my-server --report html # Full HTML report
kastell audit my-server --score-only # Just the score (CI-friendly)
kastell audit my-server --summary # Compact dashboard view
kastell audit my-server --explain # Explain failed checks with remediation guidance
kastell audit my-server --compliance cis # Filter by compliance framework (cis-level1, cis-level2, pci-dss, hipaa)Security Hardening
kastell lock my-server # 24-step production hardening (SSH + UFW + sysctl + auditd + AIDE + Docker)
kastell lock my-server --dry-run # Preview hardening steps without applyingMonitor & Debug
kastell monitor my-server # CPU, RAM, disk usage
kastell logs my-server # View platform logs (Coolify or Dokploy)
kastell logs my-server -f # Follow logs
kastell health # Health check all servers
kastell doctor # Check local environmentSupported Providers
Provider | Status | Regions | Starting Price |
Stable | EU, US | ~€4/mo | |
Stable | Global | ~$18/mo | |
Stable | Global | ~$12/mo | |
Beta | Global | ~$12/mo |
Prices reflect the cheapest plan with at least 2 GB RAM (required by Coolify and Dokploy). Bare mode has no minimum requirements -- plans start from ~$2.50/mo depending on provider. You can choose a different size during setup. Linode support is in beta -- community testing welcome.
Supported Platforms
Platform | Mode Flag | Min RAM | Min CPU | Description |
Coolify |
| 2 GB | 2 vCPU | Docker-based PaaS (port 8000) |
Dokploy |
| 2 GB | 2 vCPU | Docker Swarm-based PaaS (port 3000) |
Bare |
| — | — | Generic VPS, no platform overhead |
Kastell uses a PlatformAdapter architecture -- the same commands (update, maintain, logs, health) work across all platforms. The platform is stored in your server record and auto-detected on each command.
Developer Experience
Feature | Command / Flag | Description |
Dry Run |
| Preview destructive commands without executing. Available on: destroy, update, restart, remove, maintain, restore, firewall, domain, backup, snapshot, secure. |
Shell Completions |
| Generate shell completion scripts for tab-completion of commands and options. |
Config Validation |
| Check |
Version Check |
| Shows current version and notifies if a newer version is available on npm. |
YAML Config
Deploy with a single config file:
# kastell.yml
provider: hetzner
region: nbg1
size: cax11
name: my-coolify
fullSetup: true
domain: coolify.example.comkastell init --config kastell.ymlTemplates
Template | Best For | Includes |
| Testing, side projects | 1-2 vCPU, 2-4 GB RAM |
| Live applications | 2-4 vCPU, 4-8 GB RAM, full hardening |
| Development & CI/CD | Same as starter, no hardening |
kastell init --template production --provider hetznerSecurity
Kastell is built with security as a priority -- 12,132 tests across 380 suites, including dedicated security test suites.
API tokens are never stored on disk -- prompted at runtime or via environment variables
SSH keys are auto-generated if needed (Ed25519)
All SSH connections use
StrictHostKeyChecking=accept-newwith IP validation (octet range) and environment filteringShell injection protection on all user-facing inputs (
spawn/spawnSync, noexecSync)Provider error messages are sanitized to prevent token leakage
stderr sanitization redacts IPs, home paths, tokens, and secrets from error output
Config file token detection (22+ key patterns, case-insensitive, nested)
Import/export operations strip sensitive fields and enforce strict file permissions (
0o600)--full-setupenables UFW firewall and SSH hardening automaticallyMCP: SAFE_MODE (default: on) blocks all destructive operations, Zod schema validation on all inputs, path traversal protection on backup restore
Claude Code hooks: destroy-block prevents accidental
kastell destroywithout--force, pre-commit audit guard warns on score dropsZero Telemetry — Kastell collects no usage data, analytics, or telemetry. Your server data never leaves your machine.
Security behavior (v2.3.1)
This section documents security contracts shipped in v2.3.1. Future work is described elsewhere (see CHANGELOG.md for upcoming entries).
KASTELL_STRICT_HOST_KEY=true— when set, Kastell rejects unknown SSH host keys outright. Direct SSH connections (i.e. those that go throughaccept-new) emit a one-time Trust-On-First-Use (TOFU) warning so operators see the risk; combined withKASTELL_STRICT_HOST_KEY=true, the warning is promoted to a hard error.Non-TTY destructive commands — in non-interactive environments (CI, scripts, automation), destructive operations require an explicit
--forceflag or the command's documented opt-in flag. Without one, the command exits with a non-zero status and a clear error.Structured skipped checks — checks that are skipped (e.g. VPS-irrelevant, platform-mismatch, missing prerequisite) appear in audit output as a neutral, visible result rather than being silently dropped. Operators can see exactly which checks did not run and why.
Windows secret files — secret-bearing files written by Kastell on Windows receive restrictive ACLs (owner-only access).
0o600POSIX permissions remain the source of truth on Linux/macOS; Windows uses the equivalent DACL.QuickWin JSON shape —
audit --jsonQuickWin entries now include a stableid(check ID) andseverityfield, in addition to the existingdescriptionandcommands. This makes QuickWins programmatically consumable without parsing the human-readable description.FORBIDDEN previews include reasons — when previewing fixes with
--dry-run(or viaserver_fixMCP dry-run), each FORBIDDEN-tier fix now renders a short reason explaining why the fix is classified FORBIDDEN (e.g. "requires reboot", "disrupts active SSH sessions"). The reason is sourced from the check'sforbiddenReasonfield.
Installation
# Run directly (recommended)
npx kastell <command>
# Or install globally
npm install -g kastell
kastell <command>Requires Node.js 20 or later.
Safety Modes
KASTELL_SAFE_MODE environment variable controls destructive operations:
MCP default:
true—provision,destroy,restoreare blockedCLI default:
false— all operations are enabledOverride:
KASTELL_SAFE_MODE=true kastell destroy <server>→ rejected
Affected commands: init, destroy, backup-restore, snapshot-restore, snapshot-delete, restart, maintain.
Troubleshooting
Server creation fails?
Run kastell doctor --check-tokens to verify your API token and local environment.
Server not responding?
Use kastell status my-server --autostart to check platform status and auto-restart if needed, or kastell health to check all servers at once.
Need to start fresh?
kastell destroy my-server removes the cloud server entirely.
Contributing
See CONTRIBUTING.md for development setup, testing, and contribution guidelines.
Kastell uses 11,206 tests across 344 suites. Run npm test before submitting PRs.
MCP Server (AI Integration)
Kastell includes a built-in Model Context Protocol server for AI-powered server management. Works with Claude Code, Cursor, Windsurf, and other MCP-compatible clients.
{
"mcpServers": {
"kastell": {
"command": "npx",
"args": ["-y", "-p", "kastell", "kastell-mcp"],
"env": {
"HETZNER_TOKEN": "your-token",
"DIGITALOCEAN_TOKEN": "your-token",
"VULTR_TOKEN": "your-token",
"LINODE_TOKEN": "your-token"
}
}
}
}Available tools:
Tool | Actions | Description |
| list, status, health, sizes | Query server information, check cloud provider and platform status |
| logs, monitor | Fetch platform/Docker logs and system metrics via SSH |
| add, remove, destroy | Register, unregister, or destroy cloud servers |
| update, restart, maintain | Update platform, restart servers, run full maintenance |
| secure, firewall, domain | SSH hardening, firewall rules, domain/SSL management (10 subcommands) |
| backup, snapshot | Backup/restore databases and create/manage VPS snapshots |
| create | Provision new servers on cloud providers |
| audit | 449-check security audit with compliance framework filtering; use |
| collect | Collect forensic evidence package with checksums |
| start, stop, status | Manage autonomous security monitoring daemon |
| diagnose | Proactive health analysis with remediation commands |
| harden | 24-step production hardening (SSH, UFW, sysctl, auditd, AIDE, Docker) |
| overview | Fleet-wide health and security posture dashboard |
| fix --safe | Apply safe auto-fixes with backup (SAFE tier only, dryRun default) |
All destructive operations (destroy, restore, snapshot-delete, provision, restart, maintain, snapshot-create) require
SAFE_MODE=falseto execute.
Claude Code Plugin
Kastell is available as a Claude Code plugin for the Anthropic marketplace. The plugin bundles:
4 skills: kastell-ops (architecture reference), kastell-scaffold (component generation), kastell-careful (destructive op guard), kastell-research (codebase exploration)
2 agents: kastell-auditor (parallel audit analyzer), kastell-fixer (worktree-isolated auto-fix)
5 hooks: destroy-block, session-audit, session-log, pre-commit-audit-guard, stop-quality-check
Install via Claude Code plugin manager or use directly with claude --plugin-dir kastell-plugin.
MCP Platform Setup
Platform | Config Location | Guide |
Claude Code |
| |
Claude Desktop |
| |
VS Code / Copilot |
| |
Cursor |
|
More platforms (JetBrains, Windsurf, Gemini, and others) coming in v2.0.
AI Discoverability
Kastell provides llms.txt for AI crawlers and is listed in the MCP Registry as io.github.kastelldev/kastell.
v2.3 Reliability Contracts
These contracts apply to the CLI and the MCP server.
Provisioning behavior
server_provision returns after the provider creates the server and Kastell
durably registers it. readiness.status may be pending; follow with
server_info status or server_info health. The interactive kastell init
command continues waiting through its existing readiness checks.
Automation contracts
Unsupported and failed CLI operations return exit code
1.Valid empty results and user cancellation return
0.Mixed
--allfailures return1.audit --jsonandaudit --cireserve stdout for one JSON payload.
CI/CD Integration
Use kastell audit in your CI pipeline to enforce security baselines:
# .github/workflows/security-audit.yml
name: Security Audit
on:
schedule:
- cron: '0 6 * * 1' # Weekly Monday 6 AM
workflow_dispatch:
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install -g kastell
- run: kastell audit --host root@${{ secrets.SERVER_IP }} --threshold 70 --json > audit-result.json
- uses: actions/upload-artifact@v4
with:
name: audit-report
path: audit-result.jsonThe --threshold flag causes a non-zero exit code when the score falls below the target, failing the CI job automatically.
What's Next
Test Excellence: Mutation testing, coverage gaps, integration tests (v1.14)
Plugin ecosystem with marketplace distribution (v2.0)
Dashboard and managed service (v3.0)
Philosophy
Infrastructure should be boring, predictable, and safe.
Kastell is not a script. It's your DevOps safety layer for self-hosted infrastructure.
License
Apache 2.0 -- see LICENSE
Support
GitHub Issues -- Bug reports and feature requests
Changelog -- Version history
Built by @omrfc
Available Tools
17 toolsserver_auditARead-onlyIdempotent
Run a security audit on a server. Scans 31 categories with 449 checks. Returns score (0-100), per-category scores, and quick wins. Formats: 'summary' (compact text), 'json' (full AuditResult), 'score' (number only). Supports compliance filtering (cis-level1, cis-level2, pci-dss, hipaa), category/severity filtering, snapshot save/compare, threshold gate, and profile filtering. Requires SSH access. For health trends use server_doctor instead.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: summary (default), json (full result), score (number only) | summary |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| compare | No | Compare two snapshots: format before:after (e.g. pre-upgrade:latest) | |
| explain | No | When true, include why + fix explanation for each failing check in summary format output. Capped at 10 checks. | |
| profile | No | Server profile filter (web-server, database, mail-server). | |
| category | No | Filter results to a specific category (e.g. 'SSH', 'Firewall', 'Docker'). | |
| severity | No | Filter checks by severity level. | |
| snapshot | No | Save audit snapshot. true for auto-name, string for custom name. | |
| framework | No | Compliance framework filter. Returns per-control pass/fail summary alongside audit results. | |
| threshold | No | Minimum passing score (1-100). Returns error if score is below threshold. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint false. The description adds valuable context: scans many categories, requires SSH, supports various formats and filters. It does not contradict annotations. Minor gap: no mention of potential performance impact or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Reasonably concise for the amount of detail, with key info front-loaded. Could be slightly shorter (e.g., combine some filtering details), but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 100% schema coverage, and presence of output schema, the description covers all relevant aspects: inputs, outputs, formats, filters, comparisons, prerequisites. It is complete for an audit tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, but the description adds extra context beyond schema: auto-selection of server if only one exists, cap of 10 checks for explain, error on threshold failure. This enhances parameter understanding, though the schema already does a fair job.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: running a security audit, and specifies the scope (31 categories, 449 checks) and outputs (score, per-category scores, quick wins). It also distinguishes itself from sibling tool server_doctor, avoiding redundancy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: requires SSH access, suggests server_doctor for health trends, explains when to use filters (compliance, category, severity), and describes snapshot compare and threshold features. This helps the agent decide when to invoke this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_backupADestructive
Backup and snapshot Kastell servers. Backup: 'backup-create' dumps Coolify DB + config via SSH (Coolify servers) or system config files (bare servers), 'backup-list' shows local backups, 'backup-restore' restores from backup — bare servers restore system config, Coolify servers restore DB+config (SAFE_MODE blocks restore). Snapshot: 'snapshot-create'/'snapshot-list'/'snapshot-delete' manage cloud provider snapshots (requires provider API token). Snapshots not available for manually added servers.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Backup: 'backup-create' dumps Coolify DB+config via SSH (or system config for bare servers), 'backup-list' shows local backups, 'backup-restore' restores (SAFE_MODE blocks). Snapshot: 'snapshot-create'/'snapshot-list'/'snapshot-delete'/'snapshot-restore' manage cloud snapshots (requires API token). snapshot-restore restores server disk from a cloud snapshot (SAFE_MODE blocks, destructive). | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| backupId | No | Backup timestamp folder name (required for backup-restore). | |
| snapshotId | No | Cloud snapshot ID (required for snapshot-delete and snapshot-restore). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint: true, and the description adds important behavioral context: SAFE_MODE blocks restore, snapshots require API token, snapshots unavailable for manually added servers, and backup methods differ by server type. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed and structured with two paragraphs, but it is somewhat lengthy. It front-loads the main purpose but could be more concise without losing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple actions, server types, SAFE_MODE, API tokens), the description covers most aspects. It mentions prerequisites (API token for snapshots) and limitations (SAFE_MODE blocks restore). However, it does not explain what SAFE_MODE is or where backups/snapshots are stored. With output schema present, return values are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes parameters well. The description adds some context (e.g., SAFE_MODE implications) but largely repeats information already in the schema's enum descriptions. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it handles backup and snapshot operations for Kastell servers, with specific details on each action and differentiation between Coolify and bare servers. It is distinct from sibling tools like server_audit or server_fix, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed guidance on which action to use for what (e.g., backup-create vs backup-restore) and notes limitations like SAFE_MODE and API token requirements. However, it does not explicitly compare with sibling tools, though the distinct purpose makes it clear when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_compareARead-onlyIdempotent
Compare two servers side-by-side. Returns category-level score comparison (default) or check-level diff (detail mode). Uses cached snapshots when available, falls back to live SSH audit. Requires two registered servers.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Force live audit instead of using snapshots. Default: false. | |
| detail | No | Return check-level diff instead of category summary. Default: false. | |
| serverA | Yes | First server name or IP. | |
| serverB | Yes | Second server name or IP. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses caching behavior ('Uses cached snapshots when available, falls back to live SSH audit') and output modes. Annotations already provide readOnlyHint, destructiveHint, idempotentHint, so description adds valuable context beyond what annotations say.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, focused sentences. Front-loaded with core purpose, then specifics. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists and annotations are rich, description covers key behaviors (caching, fallback, output modes) and prerequisite. Could mention error handling or unregistered servers, but current info is sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline 3. Description adds meaning by explaining that default output is category-level and detail enables check-level diff, which clarifies how 'detail' affects results. It also implies behavior of 'fresh' via caching mention.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Compare two servers side-by-side' and specifies the resource (two servers). It distinguishes default and detail modes, and implies comparison vs sibling tools like server_audit (single server) or server_fix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use: when comparing two servers. It mentions prerequisite 'Requires two registered servers'. However, it does not explicitly state when not to use or suggest alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_doctorARead-onlyIdempotent
Run proactive health analysis on a server. Detects disk trending full, high swap, stale packages, elevated fail2ban bans, audit regression streaks, old backups, and reclaimable Docker space. Uses cached metrics by default — pass fresh=true to fetch live data via SSH. Returns findings grouped by severity (critical/warning/info) with remediation commands. For a full scored security audit across 27 categories, use server_audit instead.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Skip per-finding confirmation prompts (CI-safe). Requires autoFix: true. | |
| fresh | No | Fetch live data via SSH instead of using cached metrics. Default: false (reads cache only). | |
| dryRun | No | Show what fixes would be applied without executing SSH. Requires autoFix: true. | |
| format | No | Output format: summary (grouped findings with counts), json (full DoctorResult). | summary |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| autoFix | No | Run diagnose->fix chain automatically. Default: false (read-only). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, but the description mentions 'Run diagnose->fix chain automatically' via autoFix parameter, which implies mutation. This is a direct contradiction. Description does not clarify or reconcile this inconsistency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (4 sentences), front-loaded with the tool's primary purpose, and includes necessary details without fluff. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, enum, output schema exists), the description covers all needed context: purpose, function, output grouping, and alternative tool. It is complete for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are fully described in the input schema (100% coverage). The description adds minimal additional semantics beyond the schema (e.g., caching behavior), but does not provide deeper meaning for individual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's purpose ('Run proactive health analysis on a server') and lists specific health categories (disk trending, high swap, etc.). It explicitly distinguishes from the sibling 'server_audit' tool, providing a precise scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use the tool (proactive health checks) and when not (for full security audit, use server_audit). Also explains optional parameters like fresh and autoFix to control behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_evidenceA
Collect forensic evidence package from a server. Gathers firewall rules, auth.log, listening ports, system logs, and optionally Docker info. Writes to ~/.kastell/evidence/{server}/{date}/. Returns manifest with SHA256 checksums per file.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label for the evidence directory (e.g. 'pre-incident'). | |
| force | No | Overwrite existing evidence directory. | |
| lines | No | Number of log lines to collect per file (default: 500). | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| no_docker | No | Skip Docker data collection. | |
| no_sysinfo | No | Skip system information collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it writes to a local directory (~/.kastell/evidence/...) and returns a manifest with SHA256 checksums. It also mentions optional Docker and sysinfo flags. This complements the annotations which lack destructive or idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the core purpose, and contains no redundant or irrelevant information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and an output schema, the description covers key aspects: what it collects, where it writes, and what it returns. It does not mention runtime considerations or prerequisites but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents all parameters. The description adds minimal parameter insight beyond the schema, though it does highlight the output (manifest with checksums).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Collect forensic evidence package from a server.' It lists specific data collected (firewall rules, auth.log, etc.) and distinguishes it from siblings like server_audit or server_logs by focusing on comprehensive evidence gathering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for forensic evidence collection but does not explicitly state when to use this tool versus siblings such as server_audit or server_logs. No alternative tools or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_explainARead-onlyIdempotent
Deep-dive into a single audit check. Returns what it does, why it matters, how to fix it, fix tier (SAFE/GUARDED/FORBIDDEN), and compliance references (CIS/PCI-DSS/HIPAA). No SSH connection required. Supports case-insensitive and fuzzy matching for check IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| checkId | Yes | Audit check ID to explain (e.g. SSH-PASSWORD-AUTH). Case-insensitive, fuzzy matching supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and idempotentHint. Description adds that it returns fix tier and compliance references, and supports fuzzy matching. No contradictions. The description adds useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first states purpose, second details content, third adds useful details (no SSH, matching). Every sentence adds value. No fluff, well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter), rich annotations, and existence of output schema, the description fully covers what an agent needs: purpose, returned data, and special features (fuzzy matching, no SSH). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is fully described in schema. Description reiterates case-insensitive and fuzzy matching (already in schema) and adds no new parameter-specific semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it provides a deep-dive explanation of an audit check, enumerating specific return fields (what it does, why it matters, how to fix, fix tier, compliance references). It distinguishes from sibling tools like server_audit (runs audit) and server_fix (applies fix) by focusing on explanation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies when to use: to get detailed explanation of an audit check. It mentions no SSH required, which is a helpful usage hint. However, it does not explicitly state when not to use or compare with alternatives, though the distinguishing purpose is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_fixCDestructive
Apply safe auto-fixes to a server. Runs audit, filters SAFE tier fixes, creates backup, applies fixes, and re-audits for score delta. dryRun defaults to true (preview only). SAFE_MODE forces preview. SSH/Firewall/Docker fixes are FORBIDDEN and always rejected. Use checks and category params to target specific fixes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant detail beyond annotations: runs audit, creates backup, applies fixes, re-audits, dryRun default, SAFE_MODE behavior, forbidden fixes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Relatively concise but includes inaccurate information about parameters, which harms trust. Structure is acceptable but flawed by the erroneous param mention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers key behavioral aspects but is incomplete due to the inconsistency about parameters. Output schema exists but description doesn't reference it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no properties, yet description claims there are 'checks and category params'. This is misleading and contradicts the schema, adding no value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool applies safe auto-fixes to a server and outlines the process. However, it mentions 'checks and category params' that do not exist in the input schema, causing slight confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides some usage context (dryRun default, SAFE_MODE, forbidden fixes) but also incorrectly references non-existent parameters, and lacks explicit when-not-to-use guidance or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_fleetARead-onlyIdempotent
Get fleet-wide health and security posture for all registered servers. Returns server name, IP, provider, health status (ONLINE/DEGRADED/OFFLINE), cached audit score, and SSH response time. Use sort parameter to order results. For per-server cloud status or available server sizes, use server_info instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort field: score (descending), name (A-Z), provider (A-Z). Default: name. | name |
| categories | No | Include weakest audit category per server. Default: false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds value by detailing the returned fields and the sort functionality, but does not cover potential concerns like pagination or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first outlines purpose and returns, second guides on sort usage, third provides alternative tool. Front-loaded, no redundancy, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, optional parameters, existing output schema, and rich annotations, the description covers all essential aspects: what it does, what it returns, how to customize, and when to use an alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, so baseline is 3. The description adds 'Use sort parameter to order results' which matches the schema, and does not further explain 'categories'. No significant additional meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool retrieves fleet-wide health and security posture for all servers, listing specific returned fields. It distinguishes itself from the sibling tool 'server_info' by noting what server_info does instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using server_info for per-server cloud status or available server sizes, providing a clear alternative. Also mentions using the sort parameter, guiding the agent on how to order results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_guardAIdempotent
Manage autonomous security monitoring daemon on a server. Actions: 'start' installs guard as remote cron (checks disk/RAM/CPU/audit every 5 min), 'stop' removes guard cron entry, 'status' shows whether guard is active with last check time and any threshold breaches. Requires SSH access to target server.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Guard action: 'start' installs guard cron, 'stop' removes it, 'status' shows current state and recent breaches. | |
| server | No | Server name or IP. Auto-selected if only one server exists. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description aligns with annotations (idempotentHint, non-destructive). Adds behavioral context: 'start installs guard as remote cron (checks disk/RAM/CPU/audit every 5 min)', 'stop removes guard cron entry', 'status shows...threshold breaches'. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, efficient and front-loaded. First sentence states purpose, second details actions, third notes prerequisite. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given complexity (2 params, no nested objects, output schema exists), description covers all needed: actions, parameters, preconditions. Output schema reduces need to explain return values, but description still mentions status output details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds value: for 'server' param it notes 'Auto-selected if only one server exists', for 'action' it repeats enum but clarifies outcomes. Provides useful context beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'manage' with specific resource 'autonomous security monitoring daemon'. Lists three actions: start, stop, status. Distinguishes from siblings like server_audit or server_doctor by specifying it's a cron-based guard daemon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Requires SSH access to target server' and describes each action's effect. Implicitly suggests when to use by contrast with siblings, but does not explicitly list when not to use or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoARead-onlyIdempotent
Get information about Kastell-managed servers. Actions: 'list' all servers, 'status' check cloud provider + Coolify/bare status, 'health' check Coolify reachability or SSH access for bare servers, 'sizes' list available server types with prices for a provider+region. Requires provider API tokens as environment variables (HETZNER_TOKEN, DIGITALOCEAN_TOKEN, VULTR_TOKEN, LINODE_TOKEN) for status/sizes checks. Avoid calling repeatedly in short intervals to prevent provider API rate limiting. For fleet-wide health and audit scores across all servers, use server_fleet instead.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Server mode filter for 'sizes' action. Coolify requires min 2GB RAM. Default: coolify | |
| action | Yes | Action to perform: 'list' all servers, 'status' check server/cloud status, 'health' check Coolify reachability (or SSH reachability for bare servers), 'sizes' list available server types with prices for a provider+region | |
| region | No | Region/location ID (required for 'sizes' action, e.g. 'nbg1' for Hetzner, 'fra1' for DigitalOcean) | |
| server | No | Server name or IP. Required for single-server status/health. Omit for all servers. | |
| provider | No | Cloud provider (required for 'sizes' action) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description adds value by specifying required provider tokens and rate limit warnings. Could be more explicit about error behavior if tokens are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: overview, action details, prerequisites/limits, alternative tool. No redundancy, front-loaded with key info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all necessary aspects: actions, parameters, prerequisites, rate limiting, and alternative tool. Output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, but description adds context: action summary, server required for single-server, provider+region for sizes, mode default. Baseline 3 with added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides server information with specific actions (list, status, health, sizes) and distinguishes from sibling tool server_fleet which offers fleet-wide health and audit scores.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use each action, mentions required environment variables, warns against frequent calls for rate limiting, and directs to server_fleet for fleet-wide health.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_lockADestructive
Harden a server to production standard. Applies 24 hardening steps in a single SSH session covering SSH, fail2ban, UFW, sysctl, unattended-upgrades, Docker daemon, auditd, AIDE, and more. Requires production=true (safety gate). Pass dryRun=true to preview. Platform-aware: preserves Coolify/Dokploy ports. Shows audit score before and after. Requires SSH access. For fine-grained SSH/firewall/domain changes use server_secure instead.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force lock even if server already appears hardened. | |
| dryRun | No | Preview changes without applying. Returns what would be done. Bypasses the production safety gate. | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| production | No | Set to true to confirm hardening intent. Required to apply 19 hardening steps (safety gate). Omit or pass false to preview with dryRun=true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds context beyond annotations: mentions 24 hardening steps, platform-awareness (preserving Coolify/Dokploy ports), and shows audit score before/after. Annotations already indicate destructiveHint=true, which aligns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single paragraph front-loaded with main purpose, then specifics. Efficient but could be slightly more concise (e.g., '24 hardening steps' is repeated notion). Still very good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (24 steps), the description covers purpose, usage, parameters, behavior, and prerequisites. Output schema exists so return values are handled. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description enhances understanding: production as safety gate, dryRun previews and bypasses gate, force overrides hardened check. Adds meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool hardens a server to production standard, lists specific components (SSH, fail2ban, UFW, etc.), and distinguishes from sibling tool server_secure by mentioning fine-grained changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (full hardening) and when not (fine-grained changes, use server_secure). Also mentions prerequisites like SSH access and safety gate production=true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_logsARead-onlyIdempotent
Fetch logs and system metrics from Kastell-managed servers via SSH. Actions: 'logs' retrieves recent log lines from Coolify container (Coolify servers only), Docker service, or system journal. Bare servers: use service 'system' or 'docker' (coolify service not available). 'monitor' fetches CPU, RAM, and disk usage metrics (works for all server modes). Requires SSH access to target server (root@ip). Note: live streaming (--follow) is not available via MCP — use the CLI for live log tailing.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of log lines to fetch (only for 'logs' action, default: 50, max: 500) | |
| action | Yes | Action: 'logs' fetch recent log lines, 'monitor' fetch CPU/RAM/Disk metrics | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| service | No | Log source (only for 'logs' action): 'coolify' container (Coolify servers only), 'docker' service journal, 'system' full journal | coolify |
| containers | No | Include Docker container list in metrics (only for 'monitor' action) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only, idempotent, non-destructive. Description adds requirements (SSH access), limitation (no follow), and clarifies actions. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with front-loaded purpose. Each sentence provides distinct info. Slightly verbose but appropriate for the complexity of actions and server modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all parameter defaults (lines 50, containers false), actions, server types, and limitations. Output schema is present, so return values are documented elsewhere. Comprehensive for a log/metrics tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 5 parameters are described in schema (100% coverage). Description adds context: 'coolify' service only for Coolify servers, 'containers' only for monitor action. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it fetches logs and system metrics from Kastell-managed servers via SSH, with specific actions 'logs' and 'monitor'. It distinguishes between Coolify and bare servers, and has no sibling overlap for logs/metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on when to use 'logs' vs 'monitor', notes live streaming not available via MCP, and explains service options for different server types. Lacks explicit mention of when not to use this tool vs alternatives, but siblings are distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_maintainAIdempotent
Maintain Kastell servers. Actions: 'update' runs Coolify update via SSH (Coolify servers only — bare servers are blocked), 'restart' reboots server via cloud provider API (works for both Coolify and bare servers), 'maintain' runs full 5-step maintenance (Coolify servers only — bare servers are blocked). Snapshot not included — use server_backup tool. Requires SSH access for update, provider API tokens for restart/status. Manual servers: restart not available.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'update' runs platform update via SSH (managed servers — Coolify or Dokploy), 'restart' reboots server via cloud provider API (both modes), 'maintain' runs full 5-step maintenance (status → update → health → reboot → final, managed servers only) | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| skipReboot | No | Skip reboot and final check steps (only for 'maintain' action). Useful during business hours. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotent, non-readonly, non-destructive), the description adds valuable behavioral details: which actions are blocked for bare servers, the need for specific credentials, and that snapshot is not included. This provides safety and expectation-setting without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is remarkably concise: three sentences covering the tool's purpose, actions, constraints, prerequisites, and a cross-reference. Every sentence carries essential information, and the structure (purpose -> actions -> exclusions/requirements) is logical and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (not shown), the description adequately covers the tool's behavior, prerequisites, and limitations. It omits details on synchronous vs async execution and error handling, but the output schema likely captures return values. Overall, it is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already describes parameters. The description enhances the 'action' parameter by explaining each enum value's behavior and steps (e.g., 'maintain' runs 5 steps). It does not add value for 'server' or 'skipReboot', but the action enrichment is significant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Maintain Kastell servers' and enumerates three specific actions (update, restart, maintain) with detailed explanations of their scope and limitations. It distinguishes from sibling tools by mentioning the server_backup tool for snapshots, leaving no ambiguity about the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage conditions: actions restricted to Coolify servers vs bare servers, prerequisites (SSH access, API tokens), and the unavailability of restart for manual servers. It also advises using server_backup for snapshots. However, it does not contrast with other sibling tools like server_doctor or server_fix, leaving some usage context implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_manageADestructive
Manage Kastell servers. Actions: 'add' registers an existing Coolify or bare server to local config (validates API token, optionally verifies Coolify via SSH — pass mode:'bare' for servers without Coolify). 'remove' unregisters a server from local config only (cloud server keeps running). 'destroy' PERMANENTLY DELETES the server from the cloud provider and removes from local config. Requires provider API tokens as environment variables. Destroy is blocked when KASTELL_SAFE_MODE=true. Server mode for 'add' action: 'coolify', 'dokploy', or 'bare'. Default: coolify
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Server public IP address (required for 'add' action). If omitted and client supports elicitation, a form will be shown. | |
| mode | No | Server mode for 'add' action: 'coolify', 'dokploy', or 'bare'. Default: coolify | coolify |
| name | No | Server name, 3-63 chars, lowercase alphanumeric and hyphens (required for 'add' action). If omitted and client supports elicitation, a form will be shown. | |
| action | Yes | Action: 'add' register an existing server, 'remove' unregister from local config (server stays running), 'destroy' permanently delete from cloud provider AND local config | |
| server | No | Server name or IP (required for 'remove' and 'destroy' actions) | |
| provider | No | Cloud provider: 'hetzner', 'digitalocean', 'vultr', 'linode' (required for 'add' action). If omitted and client supports elicitation, a form will be shown. | |
| skipVerify | No | Skip Coolify SSH verification when adding a server (only for 'add' action) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true; description adds specific behavioral details: destroy permanently deletes from cloud provider and local config, requires provider API tokens, and is blocked by safe mode. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (4-5 sentences), front-loaded with core purpose, then action details. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, 3 enums, and output schema existence, description thoroughly covers actions, prerequisites (env vars), safety mechanisms, mode options, and action-specific parameter requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. Description adds further meaning: explains mode default and values, skipVerify only for add, server required for remove/destroy, and that some params can be omitted if client supports elicitation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool manages Kastell servers with three actions: add, remove, destroy. It differentiates from sibling server_* tools by being the CRUD management tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use each action (e.g., remove unregisters locally, destroy permanently deletes from cloud), contrasts remove vs destroy, mentions blocked when KASTELL_SAFE_MODE=true, and explains mode options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_pluginARead-onlyIdempotent
Manage kastell plugins. Actions: 'list' shows installed plugins with check counts and status, 'validate' checks manifest integrity and entry point validity. Install/remove not available via MCP — use CLI for security (requires explicit user consent). No SSH connection required.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Plugin name for validate action (validates all if omitted) | |
| action | Yes | Action: 'list' shows installed plugins, 'validate' checks manifest integrity. Install/remove not available via MCP — use CLI for security (requires explicit user consent). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds useful context: install/remove are not available, and no SSH is needed. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with three sentences. It front-loads the purpose, then lists actions, and finishes with important limitations and prerequisites. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters, the description covers purpose, actions, limitations, and prerequisites. It is complete given the tool's complexity and the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds meaning beyond the schema by explaining what 'list' and 'validate' do (e.g., 'shows check counts and status'). The 'name' parameter is explained as optional for validate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage kastell plugins' and enumerates the two specific actions ('list' and 'validate') with their effects. It distinguishes itself from sibling tools that manage other server aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool (list, validate) and when not to (install/remove are not available via MCP, use CLI). It also notes that no SSH connection is required, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_provisionADestructive
Provision a new server on a cloud provider. Default: Coolify auto-install via cloud-init. Pass mode:'bare' for a generic VPS without Coolify (installs UFW and runs system updates only). Requires provider API token as environment variable (HETZNER_TOKEN, DIGITALOCEAN_TOKEN, VULTR_TOKEN, LINODE_TOKEN). WARNING: Creates a billable cloud resource. Blocked when KASTELL_SAFE_MODE=true. Server takes 3-5 minutes to fully initialize after provisioning.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Server mode: 'coolify' installs Coolify, 'dokploy' installs Dokploy, 'bare' provisions generic VPS. Default: coolify | coolify |
| name | No | Server hostname, 3-63 chars, lowercase, starts with letter, only alphanumeric and hyphens, ends with letter or number. If omitted and client supports elicitation, a form will be shown. | |
| size | No | Server type/plan ID (e.g. 'cax11' for Hetzner, 's-2vcpu-2gb' for DigitalOcean). Uses template defaults if omitted | |
| region | No | Region/location ID (e.g. 'nbg1' for Hetzner, 'fra1' for DigitalOcean, 'ewr' for Vultr, 'us-east' for Linode). Uses template defaults if omitted | |
| provider | No | Cloud provider to create server on. If omitted and client supports elicitation, a form will be shown. | |
| template | No | Template for default region/size. 'starter' = cheapest, 'production' = more resources, 'dev' = development. Explicit region/size override template defaults. Default: starter | starter |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), the description warns about creating a billable resource, mentions the 3-5 minute initialization delay, specifies required API tokens, and notes the blocking safe mode. This adds rich behavioral context beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph that front-loads the core purpose, then lists modes, prerequisites, warnings, and timing. Every sentence adds value; no fluff. Capitalization and colons enhance readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, enums, multiple providers, security constraints), the description covers all essential aspects: core function, default behavior, alternatives, prerequisites, risks, and timing. An output schema exists (not shown), so return values need not be explained. Complete for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add parameter-specific details beyond the schema; it only restates defaults and modes. No extra semantic value for individual parameters is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provisions a new server on a cloud provider, with specific verb 'Provision' and resource 'server'. It distinguishes itself from sibling tools like server_audit, server_backup, etc., by being the creation action. The default mode and alternatives are explicitly mentioned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (provisioning a server), provides a blocking condition (KASTELL_SAFE_MODE=true), and describes alternative modes (bare, dokploy) with distinct behaviors. Also gives environment variable requirements, which serve as prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_secureAIdempotent
Secure Kastell servers. Secure: 'secure-setup' applies SSH hardening + fail2ban, 'secure-audit' runs security audit with score. Firewall: 'firewall-setup' installs UFW with Coolify ports, 'firewall-add'/'firewall-remove' manage port rules, 'firewall-status' shows current rules. Domain: 'domain-set'/'domain-remove' manage custom domain with optional SSL, 'domain-check' verifies DNS, 'domain-info' shows current FQDN. All require SSH access to server. For full one-shot hardening (SSH + fail2ban + UFW + sysctl + unattended-upgrades), use server_lock instead.
| Name | Required | Description | Default |
|---|---|---|---|
| ssl | No | Enable SSL (https) for domain. Default: true. | |
| port | No | Port number. Required for firewall-add/remove. Optional SSH port for secure-setup. | |
| action | Yes | Action: Secure: 'secure-setup' hardens SSH + installs fail2ban, 'secure-audit' runs security audit with score. Firewall: 'firewall-setup' installs UFW, 'firewall-add'/'firewall-remove' manage port rules, 'firewall-status' shows rules. Domain: 'domain-set'/'domain-remove' manage FQDN, 'domain-check' verifies DNS, 'domain-info' shows current FQDN. | |
| domain | No | Domain name. Required for domain-set and domain-check. | |
| server | No | Server name or IP. Auto-selected if only one server exists. | |
| protocol | No | Protocol for firewall rules. Default: tcp. | tcp |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotent and non-destructive behavior. The description adds that SSH access is required, which is critical operational context. It does not disclose any potential side effects beyond what is implied, but the annotations carry much of the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient, covering all key actions in a single paragraph without redundancy. It is front-loaded with the primary verb. A more structured layout (e.g., lists) could improve scannability, but current form is adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides a comprehensive overview of available actions and prerequisites. With an output schema present, return value details are not needed. It covers operational constraints (SSH access) and alternatives, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well documented. The description adds context beyond the schema, such as 'Auto-selected if only one server exists' for server and 'Optional SSH port for secure-setup' for port, improving clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool secures Kastell servers and breaks down actions into categories (secure, firewall, domain). It distinguishes from siblings by referencing server_lock for full one-shot hardening, making the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that all actions require SSH access and recommends using server_lock for full hardening, providing both when-to-use and when-not-to-use guidance. This helps the agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v2.3.1- Changed
server_audit1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "format": { - "const": "summary", - "type": "string" - }, - "ip": { - "type": "string" - }, - "overallScore": { - "type": "number" - }, - "server": { - "type": "string" - }, - "skippedCategories": { - "items": { - "type": "string" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "format", - "server", - "ip", - "overallScore" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "baselineRegression": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "categories": { - "items": { - "additionalProperties": false, - "properties": { - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "category": { - "type": "string" - }, - "currentValue": { - "type": "string" - }, - "details": { - "type": "string" - }, - "expectedValue": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "passed": { - "type": "boolean" - }, - "severity": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "category", - "severity" - ], - "type": "object" - }, - "type": "array" - }, - "maxScore": { - "type": "number" - }, - "name": { - "type": "string" - }, - "score": { - "type": "number" - } - }, - "required": [ - "name", - "score", - "maxScore" - ], - "type": "object" - }, - "type": "array" - }, - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "category": { - "type": "string" - }, - "currentValue": { - "type": "string" - }, - "details": { - "type": "string" - }, - "expectedValue": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "passed": { - "type": "boolean" - }, - "severity": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "category", - "severity" - ], - "type": "object" - }, - "type": "array" - }, - "complianceDetail": { - "items": { - "additionalProperties": false, - "properties": { - "controls": { - "items": { - "additionalProperties": false, - "properties": { - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "required": [ - "id", - "description", - "status" - ], - "type": "object" - }, - "type": "array" - }, - "framework": { - "type": "string" - }, - "passRate": { - "type": "number" - }, - "passedControls": { - "type": "number" - }, - "totalControls": { - "type": "number" - } - }, - "required": [ - "framework", - "passedControls", - "totalControls", - "passRate", - "controls" - ], - "type": "object" - }, - "type": "array" - }, - "format": { - "const": "json", - "type": "string" - }, - "ip": { - "type": "string" - }, - "overallScore": { - "type": "number" - }, - "server": { - "type": "string" - }, - "skippedCategories": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "format", - "server", - "ip", - "overallScore", - "categories" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "format": { - "const": "score", - "type": "string" - }, - "ip": { - "type": "string" - }, - "overallScore": { - "type": "number" - }, - "server": { - "type": "string" - } - }, - "required": [ - "format", - "server", - "ip", - "overallScore" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "format": { + "const": "summary", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "server": { + "type": "string" + }, + "skippedCategories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "categories": { + "items": { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "currentValue": { + "type": "string" + }, + "details": { + "type": "string" + }, + "expectedValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "passed": { + "type": "boolean" + }, + "severity": { + "type": "string" + }, + "skip": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "apiVersion": { + "const": "2", + "type": "string" + }, + "code": { + "const": "legacy-mutating", + "type": "string" + }, + "kind": { + "enum": [ + "mutate-local", + "mutate-global" + ], + "type": "string" + } + }, + "required": [ + "code", + "apiVersion", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "apiVersion": { + "const": "3", + "type": "string" + }, + "code": { + "const": "active-probe", + "type": "string" + } + }, + "required": [ + "code", + "apiVersion" + ], + "type": "object" + } + ] + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "maxScore": { + "type": "number" + }, + "name": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "name", + "score", + "maxScore" + ], + "type": "object" + }, + "type": "array" + }, + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "currentValue": { + "type": "string" + }, + "details": { + "type": "string" + }, + "expectedValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "passed": { + "type": "boolean" + }, + "severity": { + "type": "string" + }, + "skip": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "apiVersion": { + "const": "2", + "type": "string" + }, + "code": { + "const": "legacy-mutating", + "type": "string" + }, + "kind": { + "enum": [ + "mutate-local", + "mutate-global" + ], + "type": "string" + } + }, + "required": [ + "code", + "apiVersion", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "apiVersion": { + "const": "3", + "type": "string" + }, + "code": { + "const": "active-probe", + "type": "string" + } + }, + "required": [ + "code", + "apiVersion" + ], + "type": "object" + } + ] + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "complianceDetail": { + "items": { + "additionalProperties": false, + "properties": { + "controls": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "id", + "description", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "framework": { + "type": "string" + }, + "passRate": { + "type": "number" + }, + "passedControls": { + "type": "number" + }, + "totalControls": { + "type": "number" + } + }, + "required": [ + "framework", + "passedControls", + "totalControls", + "passRate", + "controls" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "json", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "quickWins": { + "items": { + "additionalProperties": false, + "properties": { + "commands": { + "items": { + "type": "string" + }, + "type": "array" + }, + "currentScore": { + "type": "number" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "projectedScore": { + "type": "number" + }, + "severity": { + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + } + }, + "required": [ + "id", + "severity", + "commands", + "currentScore", + "projectedScore", + "description" + ], + "type": "object" + }, + "type": "array" + }, + "server": { + "type": "string" + }, + "skippedCategories": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore", + "categories" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "format": { + "const": "score", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "server": { + "type": "string" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore" + ], + "type": "object" + } +]
- Changed
server_compare1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "categories": { - "items": { - "additionalProperties": false, - "properties": { - "category": { - "type": "string" - }, - "delta": { - "type": "number" - }, - "scoreAfter": { - "type": "number" - }, - "scoreBefore": { - "type": "number" - } - }, - "required": [ - "category", - "scoreBefore", - "scoreAfter", - "delta" - ], - "type": "object" - }, - "type": "array" - }, - "format": { - "const": "category", - "type": "string" - }, - "overallA": { - "type": "number" - }, - "overallB": { - "type": "number" - }, - "overallDelta": { - "type": "number" - }, - "serverA": { - "type": "string" - }, - "serverB": { - "type": "string" - } - }, - "required": [ - "format", - "serverA", - "serverB", - "categories", - "overallA", - "overallB", - "overallDelta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "after": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "before": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "A_better", - "B_better", - "both_pass", - "both_fail" - ], - "type": "string" - } - }, - "required": [ - "id", - "name", - "status", - "before", - "after" - ], - "type": "object" - }, - "type": "array" - }, - "format": { - "const": "check", - "type": "string" - }, - "serverA": { - "type": "string" - }, - "serverB": { - "type": "string" - } - }, - "required": [ - "format", - "serverA", - "serverB", - "checks" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "categories": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "delta": { + "type": "number" + }, + "scoreAfter": { + "type": "number" + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "category", + "scoreBefore", + "scoreAfter", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "category", + "type": "string" + }, + "overallA": { + "type": "number" + }, + "overallB": { + "type": "number" + }, + "overallDelta": { + "type": "number" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "categories", + "overallA", + "overallB", + "overallDelta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "after": { + "anyOf": [ + { + "enum": [ + "passed", + "failed", + "skipped" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "before": { + "anyOf": [ + { + "enum": [ + "passed", + "failed", + "skipped" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "A_better", + "B_better", + "both_pass", + "both_fail", + "A_skip", + "B_skip", + "both_skip" + ], + "type": "string" + } + }, + "required": [ + "id", + "name", + "status", + "before", + "after" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "check", + "type": "string" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "checks" + ], + "type": "object" + } +]
- Changed
server_provision5 fields changed- removed
Output schema / properties / result / additionalPropertiesRemoved value: -false - added
Output schema / properties / result / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "hint": { + "type": "string" + }, + "kind": { + "const": "created-persisted", + "type": "string" + }, + "message": { + "type": "string" + }, + "readiness": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "status": { + "enum": [ + "pending", + "ready", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "replacedStaleServer": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "provider", + "ip", + "region", + "size", + "mode", + "createdAt" + ], + "type": "object" + }, + "server": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "provider", + "ip", + "region", + "size", + "mode", + "createdAt" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "server" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ip": { + "type": "string" + }, + "kind": { + "const": "created-orphan", + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "enum": [ + "hetzner", + "digitalocean", + "vultr", + "linode" + ], + "type": "string" + }, + "providerId": { + "type": "string" + }, + "suggestedCommand": { + "type": "string" + } + }, + "required": [ + "kind", + "provider", + "providerId", + "name", + "ip", + "suggestedCommand" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "cancelled", + "type": "string" + }, + "message": { + "type": "string" + }, + "status": { + "const": "cancelled", + "type": "string" + } + }, + "required": [ + "kind", + "status", + "message" + ], + "type": "object" + } +] - removed
Output schema / properties / result / propertiesRemoved value: -{ - "hint": { - "type": "string" - }, - "message": { - "type": "string" - }, - "readiness": { - "additionalProperties": false, - "properties": { - "message": { - "type": "string" - }, - "status": { - "enum": [ - "pending", - "ready", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "server": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "string" - }, - "id": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "size": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "provider", - "ip", - "region", - "size", - "mode", - "createdAt" - ], - "type": "object" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } -} - removed
Output schema / properties / result / requiredRemoved value: -[ - "success", - "message", - "server", - "readiness", - "suggested_actions" -] - removed
Output schema / properties / result / typeRemoved value: -"object"
6 tool updates
v2.3.0- Changed
server_compare2 fields changed- removed
Output schema / properties / result / anyOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "categories": { - "items": { - "additionalProperties": false, - "properties": { - "delta": { - "type": "number" - }, - "name": { - "type": "string" - }, - "scoreA": { - "type": "number" - }, - "scoreB": { - "type": "number" - } - }, - "required": [ - "name", - "scoreA", - "scoreB", - "delta" - ], - "type": "object" - }, - "type": "array" - }, - "format": { - "const": "category", - "type": "string" - }, - "overallA": { - "type": "number" - }, - "overallB": { - "type": "number" - }, - "overallDelta": { - "type": "number" - }, - "serverA": { - "type": "string" - }, - "serverB": { - "type": "string" - } - }, - "required": [ - "format", - "serverA", - "serverB", - "categories", - "overallA", - "overallB", - "overallDelta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "scoreA": { - "type": "number" - }, - "scoreB": { - "type": "number" - }, - "status": { - "enum": [ - "same", - "A_better", - "B_better", - "both_fail", - "both_pass" - ], - "type": "string" - } - }, - "required": [ - "id", - "name", - "status", - "scoreA", - "scoreB" - ], - "type": "object" - }, - "type": "array" - }, - "format": { - "const": "check", - "type": "string" - }, - "serverA": { - "type": "string" - }, - "serverB": { - "type": "string" - } - }, - "required": [ - "format", - "serverA", - "serverB", - "checks" - ], - "type": "object" - } -] - added
Output schema / properties / result / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "categories": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "delta": { + "type": "number" + }, + "scoreAfter": { + "type": "number" + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "category", + "scoreBefore", + "scoreAfter", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "category", + "type": "string" + }, + "overallA": { + "type": "number" + }, + "overallB": { + "type": "number" + }, + "overallDelta": { + "type": "number" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "categories", + "overallA", + "overallB", + "overallDelta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "after": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "before": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "A_better", + "B_better", + "both_pass", + "both_fail" + ], + "type": "string" + } + }, + "required": [ + "id", + "name", + "status", + "before", + "after" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "check", + "type": "string" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "checks" + ], + "type": "object" + } +]
- Changed
server_fix15 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / actionRemoved value: -{ - "default": "apply", - "description": "apply: run fixes (default), rollback: restore single fix, rollback-all: revert all applied fixes, rollback-to: revert down to specific fix-id, history: list fix operations", - "enum": [ - "apply", - "rollback", - "history", - "rollback-all", - "rollback-to" - ], - "type": "string" -} - removed
Input schema / properties / categoryRemoved value: -{ - "description": "Category name to filter fixes (e.g. 'Kernel'). AND-filtered with checks if both provided.", - "type": "string" -} - removed
Input schema / properties / checksRemoved value: -{ - "description": "Specific check IDs to fix (e.g. ['KERN-SYNCOOKIES']). AND-filtered with category if both provided.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / diffRemoved value: -{ - "default": false, - "description": "Include per-fix diff preview in results", - "type": "boolean" -} - removed
Input schema / properties / dryRunRemoved value: -{ - "default": true, - "description": "Preview fixes without applying. Defaults to true. Forced to true when KASTELL_SAFE_MODE=true.", - "type": "boolean" -} - removed
Input schema / properties / forceRemoved value: -{ - "default": false, - "description": "Bypass regression gate and force baseline update", - "type": "boolean" -} - removed
Input schema / properties / profileRemoved value: -{ - "description": "Server profile to filter applicable checks (built-in: web-server, database, mail-server; or custom profile name)", - "type": "string" -} - removed
Input schema / properties / reportRemoved value: -{ - "default": false, - "description": "Generate markdown fix report file in current directory", - "type": "boolean" -} - removed
Input schema / properties / rollbackIdRemoved value: -{ - "description": "Fix ID to rollback (e.g. fix-2026-03-29-001) or 'last'", - "type": "string" -} - removed
Input schema / properties / serverRemoved value: -{ - "description": "Server name or IP. Auto-selected if only one server exists.", - "type": "string" -} - removed
Input schema / properties / targetRemoved value: -{ - "description": "Apply SAFE fixes until score reaches this value (1-100). Requires action:'apply'. Mutually exclusive with top.", - "maximum": 100, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / topRemoved value: -{ - "description": "Apply top N highest-impact SAFE fixes. Requires action:'apply'. Mutually exclusive with target.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" -} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "apply", + "type": "string" + }, + "applied": { + "items": { + "type": "string" + }, + "type": "array" + }, + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "dryRun": { + "const": true, + "type": "boolean" + }, + "forbiddenCount": { + "type": "number" + }, + "guardedCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "preview": { + "additionalProperties": false, + "properties": { + "groups": { + "items": { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "severity", + "checks" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "groups" + ], + "type": "object" + }, + "regressionWarning": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "regressions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreRegressed": { + "type": "boolean" + } + }, + "required": [ + "regressions", + "scoreRegressed", + "message" + ], + "type": "object" + }, + "rejectedChecks": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "id", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "safeModeForcedDryRun": { + "type": "boolean" + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "action", + "dryRun", + "rejectedChecks", + "guardedCount", + "forbiddenCount", + "scoreBefore" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "apply", + "type": "string" + }, + "applied": { + "items": { + "type": "string" + }, + "type": "array" + }, + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "diffSummary": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dryRun": { + "const": false, + "type": "boolean" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "regressionWarning": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "regressions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreRegressed": { + "type": "boolean" + } + }, + "required": [ + "regressions", + "scoreRegressed", + "message" + ], + "type": "object" + }, + "rejectedChecks": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "id", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "reportFile": { + "type": "string" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "scoreBefore": { + "type": "number" + }, + "targetWarning": { + "type": "string" + } + }, + "required": [ + "action", + "dryRun", + "applied", + "errors", + "rejectedChecks", + "scoreBefore", + "scoreAfter" + ], + "type": "object" + } + ] + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "history", + "type": "string" + }, + "entries": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "server": { + "additionalProperties": false, + "properties": { + "ip": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "ip" + ], + "type": "object" + }, + "totalEntries": { + "type": "number" + } + }, + "required": [ + "action", + "server", + "entries", + "totalEntries" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "fixId": { + "type": "string" + }, + "restored": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "action", + "fixId", + "restored", + "errors", + "scoreBefore", + "scoreAfter" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback-all", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rolledBack": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "action", + "rolledBack", + "errors", + "scoreAfter" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback-to", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rolledBack": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "targetFixId": { + "type": "string" + } + }, + "required": [ + "action", + "targetFixId", + "rolledBack", + "errors", + "scoreAfter" + ], + "type": "object" + } +] - removed
Output schema / properties / result / oneOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "apply", - "type": "string" - }, - "baselineRegression": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "dryRun": { - "type": "boolean" - }, - "forbiddenCount": { - "type": "number" - }, - "guardedCount": { - "type": "number" - }, - "preview": { - "additionalProperties": false, - "properties": { - "groups": { - "items": { - "additionalProperties": false, - "properties": { - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "category": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "severity": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "category", - "severity" - ], - "type": "object" - }, - "type": "array" - }, - "severity": { - "type": "string" - } - }, - "required": [ - "severity", - "checks" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "groups" - ], - "type": "object" - }, - "regressionWarning": { - "additionalProperties": false, - "properties": { - "message": { - "type": "string" - }, - "regressions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scoreRegressed": { - "type": "boolean" - } - }, - "required": [ - "regressions", - "scoreRegressed", - "message" - ], - "type": "object" - }, - "rejectedChecks": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "id", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "safeModeForcedDryRun": { - "type": "boolean" - }, - "scoreBefore": { - "type": "number" - } - }, - "required": [ - "action", - "dryRun", - "preview", - "rejectedChecks", - "guardedCount", - "forbiddenCount", - "scoreBefore" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "apply", - "type": "string" - }, - "applied": { - "items": { - "type": "string" - }, - "type": "array" - }, - "baselineRegression": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "diffSummary": { - "items": { - "type": "string" - }, - "type": "array" - }, - "dryRun": { - "type": "boolean" - }, - "errors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "regressionWarning": { - "additionalProperties": false, - "properties": { - "message": { - "type": "string" - }, - "regressions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scoreRegressed": { - "type": "boolean" - } - }, - "required": [ - "regressions", - "scoreRegressed", - "message" - ], - "type": "object" - }, - "rejectedChecks": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "id", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "reportFile": { - "type": "string" - }, - "scoreAfter": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "scoreBefore": { - "type": "number" - }, - "targetWarning": { - "type": "string" - } - }, - "required": [ - "action", - "dryRun", - "applied", - "errors", - "rejectedChecks", - "scoreBefore", - "scoreAfter" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "history", - "type": "string" - }, - "entries": { - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "server": { - "additionalProperties": false, - "properties": { - "ip": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "name", - "ip" - ], - "type": "object" - }, - "totalEntries": { - "type": "number" - } - }, - "required": [ - "action", - "server", - "entries", - "totalEntries" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "rollback", - "type": "string" - }, - "errors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fixId": { - "type": "string" - }, - "restored": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scoreAfter": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "scoreBefore": { - "type": "number" - } - }, - "required": [ - "action", - "fixId", - "restored", - "errors", - "scoreBefore", - "scoreAfter" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "rollback-all", - "type": "string" - }, - "errors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rolledBack": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scoreAfter": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "action", - "rolledBack", - "errors", - "scoreAfter" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "rollback-to", - "type": "string" - }, - "errors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rolledBack": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scoreAfter": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "targetFixId": { - "type": "string" - } - }, - "required": [ - "action", - "targetFixId", - "rolledBack", - "errors", - "scoreAfter" - ], - "type": "object" - } -]
- Changed
server_info1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "list", - "type": "string" - }, - "message": { - "type": "string" - }, - "servers": { - "items": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "string" - }, - "id": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "size": { - "type": "string" - } - }, - "required": [ - "name", - "ip", - "provider", - "region", - "size", - "id", - "mode", - "createdAt" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "total": { - "type": "number" - } - }, - "required": [ - "action", - "servers", - "total", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "status", - "type": "string" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "platformStatus": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "serverStatus": { - "type": "string" - }, - "size": { - "type": "string" - } - }, - "required": [ - "name", - "ip", - "provider", - "region", - "size", - "mode", - "serverStatus", - "platformStatus" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "additionalProperties": false, - "properties": { - "errors": { - "type": "number" - }, - "notReachable": { - "type": "number" - }, - "running": { - "type": "number" - }, - "total": { - "type": "number" - } - }, - "required": [ - "total", - "running", - "notReachable", - "errors" - ], - "type": "object" - } - }, - "required": [ - "action", - "results", - "summary", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "health", - "type": "string" - }, - "results": { - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "additionalProperties": false, - "properties": { - "bare": { - "type": "number" - }, - "notReachable": { - "type": "number" - }, - "running": { - "type": "number" - }, - "total": { - "type": "number" - } - }, - "required": [ - "total", - "running", - "notReachable", - "bare" - ], - "type": "object" - } - }, - "required": [ - "action", - "results", - "summary", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "sizes", - "type": "string" - }, - "mode": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "sizes": { - "items": { - "additionalProperties": false, - "properties": { - "disk": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "price": { - "type": "string" - }, - "ram": { - "type": "string" - }, - "vcpu": { - "type": "number" - } - }, - "required": [ - "id", - "name", - "vcpu", - "ram", - "disk", - "price" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "total": { - "type": "number" - } - }, - "required": [ - "action", - "provider", - "region", - "mode", - "sizes", - "total", - "suggested_actions" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "list", + "type": "string" + }, + "message": { + "type": "string" + }, + "servers": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "id", + "mode", + "createdAt" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "servers", + "total", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "status", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "platformStatus": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverStatus": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "mode", + "serverStatus", + "platformStatus" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "errors": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "errors" + ], + "type": "object" + } + }, + "required": [ + "action", + "results", + "summary", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "health", + "type": "string" + }, + "coolifyUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "dokployUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hostKeyMismatch": { + "type": "boolean" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "platformStatus": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "server": { + "type": "string" + }, + "sshReachable": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "bare": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "bare" + ], + "type": "object" + } + }, + "required": [ + "action", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "sizes", + "type": "string" + }, + "mode": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "sizes": { + "items": { + "additionalProperties": false, + "properties": { + "disk": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "ram": { + "type": "string" + }, + "vcpu": { + "type": "number" + } + }, + "required": [ + "id", + "name", + "vcpu", + "ram", + "disk", + "price" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "provider", + "region", + "mode", + "sizes", + "total", + "suggested_actions" + ], + "type": "object" + } +]
- Changed
server_maintain1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "update", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "restart", - "type": "string" - }, - "finalStatus": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "finalStatus", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "maintain", - "type": "string" - }, - "ip": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "server": { - "type": "string" - }, - "steps": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "message": { - "type": "string" - }, - "status": { - "type": "string" - }, - "step": { - "type": "string" - } - }, - "required": [ - "step", - "status" - ], - "type": "object" - }, - "type": "array" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "additionalProperties": false, - "properties": { - "failure": { - "type": "number" - }, - "skipped": { - "type": "number" - }, - "success": { - "type": "number" - }, - "total": { - "type": "number" - } - }, - "required": [ - "total", - "success", - "failure", - "skipped" - ], - "type": "object" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "provider", - "steps", - "summary", - "suggested_actions" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "update", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "restart", + "type": "string" + }, + "finalStatus": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "finalStatus", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "maintain", + "type": "string" + }, + "ip": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "server": { + "type": "string" + }, + "steps": { + "items": { + "additionalProperties": false, + "properties": { + "detail": { + "type": "string" + }, + "error": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "step": { + "type": "number" + } + }, + "required": [ + "step", + "name", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "failure": { + "type": "number" + }, + "skipped": { + "type": "number" + }, + "success": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "success", + "failure", + "skipped" + ], + "type": "object" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "provider", + "steps", + "summary", + "suggested_actions" + ], + "type": "object" + } +]
- Changed
server_provision2 fields changed- added
Output schema / properties / result / properties / readinessAdded value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "status": { + "enum": [ + "pending", + "ready", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +} - changed
Output schema / properties / result / requiredPrevious value: -[ - "success", - "message", - "server", - "suggested_actions" -]New value: +[ + "success", + "message", + "server", + "readiness", + "suggested_actions" +]
- Changed
server_secure2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "secure-setup", - "secure-audit", - "firewall-setup", - "firewall-add", - "firewall-remove", - "firewall-status", - "domain-set", - "domain-remove", - "domain-check", - "domain-info" -]New value: +[ + "audit", + "secure-setup", + "secure-audit", + "firewall-setup", + "firewall-add", + "firewall-remove", + "firewall-status", + "domain-set", + "domain-remove", + "domain-check", + "domain-info" +] - changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "secure-setup", - "type": "string" - }, - "fail2ban": { - "type": "boolean" - }, - "hint": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "sshHardening": { - "type": "boolean" - }, - "sshKeyCount": { - "type": "number" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "sshHardening", - "fail2ban", - "sshKeyCount", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "secure-audit", - "type": "string" - }, - "checks": { - "additionalProperties": false, - "properties": { - "fail2ban": { - "type": "boolean" - }, - "passwordAuth": { - "type": "boolean" - }, - "rootLogin": { - "type": "boolean" - }, - "sshPort": { - "type": "boolean" - } - }, - "required": [ - "passwordAuth", - "rootLogin", - "fail2ban", - "sshPort" - ], - "type": "object" - }, - "ip": { - "type": "string" - }, - "maxScore": { - "type": "number" - }, - "score": { - "type": "number" - }, - "server": { - "type": "string" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "server", - "ip", - "score", - "maxScore", - "checks", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "firewall-setup", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "firewall-add", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "firewall-remove", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "firewall-status", - "type": "string" - }, - "active": { - "type": "boolean" - }, - "ip": { - "type": "string" - }, - "ruleCount": { - "type": "number" - }, - "rules": { - "items": { - "type": "string" - }, - "type": "array" - }, - "server": { - "type": "string" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "server", - "ip", - "active", - "rules", - "ruleCount", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "domain-set", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "url": { - "type": "string" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "url", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "domain-remove", - "type": "string" - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "url": { - "type": "string" - } - }, - "required": [ - "action", - "success", - "server", - "ip", - "message", - "url", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "domain-check", - "type": "string" - }, - "domain": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "match": { - "type": "boolean" - }, - "resolvedIp": { - "type": "string" - }, - "server": { - "type": "string" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "server", - "ip", - "domain", - "resolvedIp", - "match", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "domain-info", - "type": "string" - }, - "fqdn": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ip": { - "type": "string" - }, - "message": { - "type": "string" - }, - "server": { - "type": "string" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "server", - "ip", - "fqdn", - "message", - "suggested_actions" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "secure-setup", + "type": "string" + }, + "fail2ban": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "sshHardening": { + "type": "boolean" + }, + "sshKeyCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "sshHardening", + "fail2ban", + "sshKeyCount", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "audit", + "type": "string" + }, + "checks": { + "additionalProperties": false, + "properties": { + "fail2ban": { + "type": "boolean" + }, + "passwordAuth": { + "type": "boolean" + }, + "rootLogin": { + "type": "boolean" + }, + "sshPort": { + "type": "boolean" + } + }, + "required": [ + "passwordAuth", + "rootLogin", + "fail2ban", + "sshPort" + ], + "type": "object" + }, + "ip": { + "type": "string" + }, + "maxScore": { + "type": "number" + }, + "score": { + "type": "number" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "score", + "maxScore", + "checks", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "secure-audit", + "type": "string" + }, + "checks": { + "additionalProperties": false, + "properties": { + "fail2ban": { + "type": "boolean" + }, + "passwordAuth": { + "type": "boolean" + }, + "rootLogin": { + "type": "boolean" + }, + "sshPort": { + "type": "boolean" + } + }, + "required": [ + "passwordAuth", + "rootLogin", + "fail2ban", + "sshPort" + ], + "type": "object" + }, + "ip": { + "type": "string" + }, + "maxScore": { + "type": "number" + }, + "score": { + "type": "number" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "score", + "maxScore", + "checks", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-setup", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-add", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-remove", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-status", + "type": "string" + }, + "active": { + "type": "boolean" + }, + "ip": { + "type": "string" + }, + "ruleCount": { + "type": "number" + }, + "rules": { + "items": { + "additionalProperties": false, + "properties": { + "action": { + "type": "string" + }, + "from": { + "type": "string" + }, + "port": { + "type": "string" + }, + "proto": { + "type": "string" + } + }, + "required": [ + "port", + "proto", + "action", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "active", + "rules", + "ruleCount", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-set", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "url", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-remove", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "url", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-check", + "type": "string" + }, + "domain": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "match": { + "type": "boolean" + }, + "resolvedIp": { + "type": "string" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "domain", + "resolvedIp", + "match", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-info", + "type": "string" + }, + "fqdn": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "fqdn", + "message", + "suggested_actions" + ], + "type": "object" + } +]
3 tool updates
v2.2.6- Changed
server_manage3 fields changed- changed
Input schema / properties / ip / descriptionPrevious value: -"Server public IP address (required for 'add' action)"New value: +"Server public IP address (required for 'add' action). If omitted and client supports elicitation, a form will be shown." - changed
Input schema / properties / name / descriptionPrevious value: -"Server name, 3-63 chars, lowercase alphanumeric and hyphens (required for 'add' action)"New value: +"Server name, 3-63 chars, lowercase alphanumeric and hyphens (required for 'add' action). If omitted and client supports elicitation, a form will be shown." - changed
Input schema / properties / provider / descriptionPrevious value: -"Cloud provider: 'hetzner', 'digitalocean', 'vultr', 'linode' (required for 'add' action)"New value: +"Cloud provider: 'hetzner', 'digitalocean', 'vultr', 'linode' (required for 'add' action). If omitted and client supports elicitation, a form will be shown."
- Changed
server_plugin1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "list", - "type": "string" - }, - "count": { - "type": "number" - }, - "plugins": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "status": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "status" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "plugins", - "count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "validate", - "type": "string" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "errors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "valid": { - "type": "boolean" - } - }, - "required": [ - "name", - "valid" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "action", - "results" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "list", + "type": "string" + }, + "count": { + "type": "number" + }, + "plugins": { + "items": { + "additionalProperties": false, + "properties": { + "checks": { + "type": "number" + }, + "commandCount": { + "type": "number" + }, + "mcpToolCount": { + "type": "number" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "status" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "plugins", + "count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "validate", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + }, + "required": [ + "name", + "valid" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "results" + ], + "type": "object" + } +]
- Changed
server_provision3 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Server hostname, 3-63 chars, lowercase, starts with letter, only alphanumeric and hyphens, ends with letter or number"New value: +"Server hostname, 3-63 chars, lowercase, starts with letter, only alphanumeric and hyphens, ends with letter or number. If omitted and client supports elicitation, a form will be shown." - changed
Input schema / properties / provider / descriptionPrevious value: -"Cloud provider to create server on"New value: +"Cloud provider to create server on. If omitted and client supports elicitation, a form will be shown." - removed
Input schema / requiredRemoved value: -[ - "provider", - "name" -]
1 tool update
v2.2.5- Changed
server_info1 field changed- changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "list", - "type": "string" - }, - "message": { - "type": "string" - }, - "servers": { - "items": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "string" - }, - "id": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "size": { - "type": "string" - } - }, - "required": [ - "name", - "ip", - "provider", - "region", - "size", - "id", - "mode", - "createdAt" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "total": { - "type": "number" - } - }, - "required": [ - "action", - "servers", - "total", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "status", - "type": "string" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "ip": { - "type": "string" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "platformStatus": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "serverStatus": { - "type": "string" - }, - "size": { - "type": "string" - } - }, - "required": [ - "name", - "ip", - "provider", - "region", - "size", - "mode", - "serverStatus", - "platformStatus" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "additionalProperties": false, - "properties": { - "errors": { - "type": "number" - }, - "notReachable": { - "type": "number" - }, - "running": { - "type": "number" - }, - "total": { - "type": "number" - } - }, - "required": [ - "total", - "running", - "notReachable", - "errors" - ], - "type": "object" - } - }, - "required": [ - "action", - "results", - "summary", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "health", - "type": "string" - }, - "results": { - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "additionalProperties": false, - "properties": { - "bare": { - "type": "number" - }, - "notReachable": { - "type": "number" - }, - "running": { - "type": "number" - }, - "total": { - "type": "number" - } - }, - "required": [ - "total", - "running", - "notReachable", - "bare" - ], - "type": "object" - } - }, - "required": [ - "action", - "results", - "summary", - "suggested_actions" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "sizes", - "type": "string" - }, - "mode": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "sizes": { - "items": { - "additionalProperties": false, - "properties": { - "disk": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "price": { - "type": "number" - }, - "ram": { - "type": "string" - }, - "vcpu": { - "type": "number" - } - }, - "required": [ - "id", - "name", - "vcpu", - "ram", - "disk", - "price" - ], - "type": "object" - }, - "type": "array" - }, - "suggested_actions": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "command", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "total": { - "type": "number" - } - }, - "required": [ - "action", - "provider", - "region", - "mode", - "sizes", - "total", - "suggested_actions" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "list", + "type": "string" + }, + "message": { + "type": "string" + }, + "servers": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "id", + "mode", + "createdAt" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "servers", + "total", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "status", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "platformStatus": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverStatus": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "mode", + "serverStatus", + "platformStatus" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "errors": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "errors" + ], + "type": "object" + } + }, + "required": [ + "action", + "results", + "summary", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "health", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "bare": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "bare" + ], + "type": "object" + } + }, + "required": [ + "action", + "results", + "summary", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "sizes", + "type": "string" + }, + "mode": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "sizes": { + "items": { + "additionalProperties": false, + "properties": { + "disk": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "ram": { + "type": "string" + }, + "vcpu": { + "type": "number" + } + }, + "required": [ + "id", + "name", + "vcpu", + "ram", + "disk", + "price" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "provider", + "region", + "mode", + "sizes", + "total", + "suggested_actions" + ], + "type": "object" + } +]
17 tool updates
v2.2.4- Changed
server_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "format": { + "const": "summary", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "server": { + "type": "string" + }, + "skippedCategories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "categories": { + "items": { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "currentValue": { + "type": "string" + }, + "details": { + "type": "string" + }, + "expectedValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "passed": { + "type": "boolean" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "maxScore": { + "type": "number" + }, + "name": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "name", + "score", + "maxScore" + ], + "type": "object" + }, + "type": "array" + }, + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "currentValue": { + "type": "string" + }, + "details": { + "type": "string" + }, + "expectedValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "passed": { + "type": "boolean" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "complianceDetail": { + "items": { + "additionalProperties": false, + "properties": { + "controls": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "id", + "description", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "framework": { + "type": "string" + }, + "passRate": { + "type": "number" + }, + "passedControls": { + "type": "number" + }, + "totalControls": { + "type": "number" + } + }, + "required": [ + "framework", + "passedControls", + "totalControls", + "passRate", + "controls" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "json", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "server": { + "type": "string" + }, + "skippedCategories": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore", + "categories" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "format": { + "const": "score", + "type": "string" + }, + "ip": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "server": { + "type": "string" + } + }, + "required": [ + "format", + "server", + "ip", + "overallScore" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_backup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "backup-create", + "type": "string" + }, + "backupPath": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "manifest": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "backupPath", + "manifest", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "backup-list", + "type": "string" + }, + "backupCount": { + "type": "number" + }, + "backups": { + "items": { + "additionalProperties": false, + "properties": { + "backupId": { + "type": "string" + }, + "coolifyVersion": { + "type": "string" + }, + "files": { + "type": "number" + }, + "status": { + "type": "string" + }, + "timestamp": { + "type": "string" + } + }, + "required": [ + "backupId" + ], + "type": "object" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "backupCount", + "backups", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "backup-restore", + "type": "string" + }, + "backupId": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "server": { + "type": "string" + }, + "steps": { + "items": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "status", + "message" + ], + "type": "object" + }, + "type": "array" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "backupId", + "steps", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "snapshot-create", + "type": "string" + }, + "costEstimate": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "server": { + "type": "string" + }, + "snapshot": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "createdAt" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "snapshot", + "costEstimate", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "snapshot-list", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "snapshotCount": { + "type": "number" + }, + "snapshots": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "createdAt" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "snapshotCount", + "snapshots", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "snapshot-delete", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "snapshotId": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "snapshotId", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "snapshot-restore", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "snapshotId": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "snapshotId", + "message", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_compare1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "categories": { + "items": { + "additionalProperties": false, + "properties": { + "delta": { + "type": "number" + }, + "name": { + "type": "string" + }, + "scoreA": { + "type": "number" + }, + "scoreB": { + "type": "number" + } + }, + "required": [ + "name", + "scoreA", + "scoreB", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "category", + "type": "string" + }, + "overallA": { + "type": "number" + }, + "overallB": { + "type": "number" + }, + "overallDelta": { + "type": "number" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "categories", + "overallA", + "overallB", + "overallDelta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scoreA": { + "type": "number" + }, + "scoreB": { + "type": "number" + }, + "status": { + "enum": [ + "same", + "A_better", + "B_better", + "both_fail", + "both_pass" + ], + "type": "string" + } + }, + "required": [ + "id", + "name", + "status", + "scoreA", + "scoreB" + ], + "type": "object" + }, + "type": "array" + }, + "format": { + "const": "check", + "type": "string" + }, + "serverA": { + "type": "string" + }, + "serverB": { + "type": "string" + } + }, + "required": [ + "format", + "serverA", + "serverB", + "checks" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_doctor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "critical": { + "type": "number" + }, + "findings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "info": { + "type": "number" + }, + "ranAt": { + "type": "string" + }, + "score": { + "type": "number" + }, + "server": { + "type": "string" + }, + "total": { + "type": "number" + }, + "usedFreshData": { + "type": "boolean" + }, + "warning": { + "type": "number" + } + }, + "required": [ + "server", + "total", + "critical", + "warning", + "info", + "score", + "ranAt", + "usedFreshData", + "findings" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_evidence1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "collectedAt": { + "type": "string" + }, + "evidenceDir": { + "type": "string" + }, + "manifestPath": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "serverIp": { + "type": "string" + }, + "serverName": { + "type": "string" + }, + "skippedFiles": { + "type": "number" + }, + "totalFiles": { + "type": "number" + } + }, + "required": [ + "evidenceDir", + "serverName", + "serverIp", + "platform", + "collectedAt", + "totalFiles", + "skippedFiles", + "manifestPath" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_explain1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "compliance": { + "items": { + "additionalProperties": false, + "properties": { + "controlId": { + "type": "string" + }, + "description": { + "type": "string" + }, + "framework": { + "type": "string" + } + }, + "required": [ + "framework", + "controlId", + "description" + ], + "type": "object" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "fix": { + "type": "string" + }, + "fixTier": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "severity": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "category", + "severity", + "description", + "fix", + "why", + "fixTier" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_fix1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "apply", + "type": "string" + }, + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "dryRun": { + "type": "boolean" + }, + "forbiddenCount": { + "type": "number" + }, + "guardedCount": { + "type": "number" + }, + "preview": { + "additionalProperties": false, + "properties": { + "groups": { + "items": { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "category": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "category", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "severity": { + "type": "string" + } + }, + "required": [ + "severity", + "checks" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "groups" + ], + "type": "object" + }, + "regressionWarning": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "regressions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreRegressed": { + "type": "boolean" + } + }, + "required": [ + "regressions", + "scoreRegressed", + "message" + ], + "type": "object" + }, + "rejectedChecks": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "id", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "safeModeForcedDryRun": { + "type": "boolean" + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "action", + "dryRun", + "preview", + "rejectedChecks", + "guardedCount", + "forbiddenCount", + "scoreBefore" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "apply", + "type": "string" + }, + "applied": { + "items": { + "type": "string" + }, + "type": "array" + }, + "baselineRegression": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "diffSummary": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dryRun": { + "type": "boolean" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "regressionWarning": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "regressions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreRegressed": { + "type": "boolean" + } + }, + "required": [ + "regressions", + "scoreRegressed", + "message" + ], + "type": "object" + }, + "rejectedChecks": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "id", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "reportFile": { + "type": "string" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "scoreBefore": { + "type": "number" + }, + "targetWarning": { + "type": "string" + } + }, + "required": [ + "action", + "dryRun", + "applied", + "errors", + "rejectedChecks", + "scoreBefore", + "scoreAfter" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "history", + "type": "string" + }, + "entries": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "server": { + "additionalProperties": false, + "properties": { + "ip": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "ip" + ], + "type": "object" + }, + "totalEntries": { + "type": "number" + } + }, + "required": [ + "action", + "server", + "entries", + "totalEntries" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "fixId": { + "type": "string" + }, + "restored": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "scoreBefore": { + "type": "number" + } + }, + "required": [ + "action", + "fixId", + "restored", + "errors", + "scoreBefore", + "scoreAfter" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback-all", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rolledBack": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "action", + "rolledBack", + "errors", + "scoreAfter" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "rollback-to", + "type": "string" + }, + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rolledBack": { + "items": { + "type": "string" + }, + "type": "array" + }, + "scoreAfter": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "targetFixId": { + "type": "string" + } + }, + "required": [ + "action", + "targetFixId", + "rolledBack", + "errors", + "scoreAfter" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_fleet1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "servers": { + "items": { + "additionalProperties": false, + "properties": { + "auditScore": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "ip": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "responseTime": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ONLINE", + "DEGRADED", + "OFFLINE" + ], + "type": "string" + }, + "weakestCategory": { + "type": "string" + }, + "weakestCategoryScore": { + "type": "number" + } + }, + "required": [ + "name", + "ip", + "provider", + "status", + "auditScore", + "responseTime" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "servers", + "total" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_guard1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "breaches": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "installedAt": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "lastRunAt": { + "type": "string" + }, + "logTail": { + "items": { + "type": "string" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "list", + "type": "string" + }, + "message": { + "type": "string" + }, + "servers": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "id", + "mode", + "createdAt" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "servers", + "total", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "status", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "platformStatus": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverStatus": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "region", + "size", + "mode", + "serverStatus", + "platformStatus" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "errors": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "errors" + ], + "type": "object" + } + }, + "required": [ + "action", + "results", + "summary", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "health", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "bare": { + "type": "number" + }, + "notReachable": { + "type": "number" + }, + "running": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "running", + "notReachable", + "bare" + ], + "type": "object" + } + }, + "required": [ + "action", + "results", + "summary", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "sizes", + "type": "string" + }, + "mode": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "sizes": { + "items": { + "additionalProperties": false, + "properties": { + "disk": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number" + }, + "ram": { + "type": "string" + }, + "vcpu": { + "type": "number" + } + }, + "required": [ + "id", + "name", + "vcpu", + "ram", + "disk", + "price" + ], + "type": "object" + }, + "type": "array" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "action", + "provider", + "region", + "mode", + "sizes", + "total", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_lock1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "scoreAfter": { + "type": "number" + }, + "scoreBefore": { + "type": "number" + }, + "stepErrors": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "steps": { + "type": "number" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "steps", + "scoreBefore", + "scoreAfter" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_logs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "logs", + "type": "string" + }, + "ip": { + "type": "string" + }, + "lines": { + "type": "number" + }, + "logs": { + "type": "string" + }, + "server": { + "type": "string" + }, + "service": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "service", + "lines", + "logs", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "monitor", + "type": "string" + }, + "containers": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "ip": { + "type": "string" + }, + "metrics": { + "additionalProperties": false, + "properties": { + "cpu": { + "additionalProperties": false, + "properties": { + "percent": { + "type": "number" + } + }, + "required": [ + "percent" + ], + "type": "object" + }, + "disk": { + "additionalProperties": false, + "properties": { + "percent": { + "type": "number" + }, + "total": { + "type": "number" + }, + "used": { + "type": "number" + } + }, + "required": [ + "percent", + "total", + "used" + ], + "type": "object" + }, + "mem": { + "additionalProperties": false, + "properties": { + "percent": { + "type": "number" + }, + "total": { + "type": "number" + }, + "used": { + "type": "number" + } + }, + "required": [ + "percent", + "total", + "used" + ], + "type": "object" + } + }, + "required": [ + "cpu", + "mem", + "disk" + ], + "type": "object" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "metrics", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_maintain1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "update", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "restart", + "type": "string" + }, + "finalStatus": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "finalStatus", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "maintain", + "type": "string" + }, + "ip": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "server": { + "type": "string" + }, + "steps": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "message": { + "type": "string" + }, + "status": { + "type": "string" + }, + "step": { + "type": "string" + } + }, + "required": [ + "step", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "failure": { + "type": "number" + }, + "skipped": { + "type": "number" + }, + "success": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "success", + "failure", + "skipped" + ], + "type": "object" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "provider", + "steps", + "summary", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_manage1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "add", + "type": "string" + }, + "message": { + "type": "string" + }, + "platformStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "server": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider", + "id", + "mode" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "message", + "server", + "platformStatus", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "remove", + "type": "string" + }, + "message": { + "type": "string" + }, + "note": { + "type": "string" + }, + "server": { + "additionalProperties": false, + "properties": { + "ip": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "message", + "note", + "server", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "destroy", + "type": "string" + }, + "cloudDeleted": { + "type": "boolean" + }, + "localRemoved": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "note": { + "type": "string" + }, + "server": { + "additionalProperties": false, + "properties": { + "ip": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "name", + "ip", + "provider" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "message", + "cloudDeleted", + "localRemoved", + "server", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_plugin1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "list", + "type": "string" + }, + "count": { + "type": "number" + }, + "plugins": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "status" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "plugins", + "count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "validate", + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + }, + "required": [ + "name", + "valid" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "results" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_provision1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "additionalProperties": false, + "properties": { + "hint": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "region": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "provider", + "ip", + "region", + "size", + "mode", + "createdAt" + ], + "type": "object" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "success", + "message", + "server", + "suggested_actions" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Changed
server_secure1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "secure-setup", + "type": "string" + }, + "fail2ban": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "sshHardening": { + "type": "boolean" + }, + "sshKeyCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "sshHardening", + "fail2ban", + "sshKeyCount", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "secure-audit", + "type": "string" + }, + "checks": { + "additionalProperties": false, + "properties": { + "fail2ban": { + "type": "boolean" + }, + "passwordAuth": { + "type": "boolean" + }, + "rootLogin": { + "type": "boolean" + }, + "sshPort": { + "type": "boolean" + } + }, + "required": [ + "passwordAuth", + "rootLogin", + "fail2ban", + "sshPort" + ], + "type": "object" + }, + "ip": { + "type": "string" + }, + "maxScore": { + "type": "number" + }, + "score": { + "type": "number" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "score", + "maxScore", + "checks", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-setup", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-add", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-remove", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "firewall-status", + "type": "string" + }, + "active": { + "type": "boolean" + }, + "ip": { + "type": "string" + }, + "ruleCount": { + "type": "number" + }, + "rules": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "active", + "rules", + "ruleCount", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-set", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "url", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-remove", + "type": "string" + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "required": [ + "action", + "success", + "server", + "ip", + "message", + "url", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-check", + "type": "string" + }, + "domain": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "match": { + "type": "boolean" + }, + "resolvedIp": { + "type": "string" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "domain", + "resolvedIp", + "match", + "suggested_actions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "domain-info", + "type": "string" + }, + "fqdn": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ip": { + "type": "string" + }, + "message": { + "type": "string" + }, + "server": { + "type": "string" + }, + "suggested_actions": { + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "command", + "reason" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "action", + "server", + "ip", + "fqdn", + "message", + "suggested_actions" + ], + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object" +}
1 tool update
v2.2.0- Added
server_audit
1 tool update
v1.0.2- Removed
server_audit
1 tool update
v1.2.0- Added
server_manage
2 tool updates
v1.13.0- Added
server_doctor - Removed
server_manage
2 tool updates
v1.8.1- Added
server_audit - Removed
server_doctor
1 tool update
v1.8.2- Removed
server_audit
1 tool update
v1.0.0- Added
server_audit
1 tool update
v1.0.1- Removed
server_audit
1 tool update
v1.0.4- Added
server_audit
TDQS
Each tool has a distinct purpose with detailed descriptions and cross-references. Even overlapping areas like security (audit, lock, secure) are clearly differentiated by scope and usage.
All 17 tools follow the consistent 'server_<action>' pattern in snake_case, making the tool set predictable and easy to navigate.
17 tools cover the broad domain of server management without being excessive. While slightly above the 3-15 ideal range, each tool earns its place with well-defined functionality.
The tool set covers provisioning, lifecycle management, security auditing and hardening, health monitoring, backup, logging, and fleet management. No obvious gaps for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
Scan any MCP server for tool-poisoning, security, auth & license. Trust score before install.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProfessional security testing server with 50+ integrated tools for web application vulnerability scanning, reconnaissance, fuzzing, and API testing. Enables comprehensive bug bounty hunting workflows including subdomain enumeration, XSS/SQLi detection, and automated security assessments.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables automated security detection and compliance auditing for cloud hosts and servers, including threat detection, baseline security checks, cryptocurrency miner detection, log analysis, and real-time monitoring through API and web dashboard.1-
- AlicenseNot gradedqualityNot gradedmaintenanceProvides tools for managing Docker containers, Compose stacks, and system resources on Hetzner servers via SSH. It also includes capabilities for reloading Caddy configurations and managing Cloudflare DNS records.-
- AlicenseNot gradedqualityDmaintenanceThis is a Linux OS hardening tool. Take a fresh install and immediately harden the heck out of it using just your favourite LLM agent and natural language prompts. "Make my system secure" or "Do a full security audit of my system."191MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/kastelldev/kastell'
If you have feedback or need assistance with the MCP directory API, please join our Discord server