Skip to main content
Glama
kastelldev

Kastell

Official
by kastelldev

server_secure

Idempotent

Apply SSH hardening, fail2ban, UFW firewall, and custom domain management. Run security audits with scoring to identify vulnerabilities.

Instructions

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sslNoEnable SSL (https) for domain. Default: true.
portNoPort number. Required for firewall-add/remove. Optional SSH port for secure-setup.
actionYesAction: 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.
domainNoDomain name. Required for domain-set and domain-check.
serverNoServer name or IP. Auto-selected if only one server exists.
protocolNoProtocol for firewall rules. Default: tcp.tcp

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed2 schema fields changedv2.3.0
    • changedInput schema / properties / action / enum
      Previous 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"
      +]
    • changedOutput schema / properties / result / oneOf
      Previous 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"
      +  }
      +]
  2. Changed1 schema field changedv2.2.4
    • changedOutput 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"
      +}
  3. First observedv1.14.0

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Latest Blog Posts

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