dhcp_lease_delete
Delete DHCP leases by hostname, IP, or MAC address to manage and clean up stale lease entries.
Instructions
Delete DHCP leases by hostname, IP, or MAC address
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | No | Hostname to search for | |
| ip | No | IP address to delete | |
| mac | No | MAC address to search for |
Implementation Reference
- The main execute method that finds matching DHCP leases (both IPv4 and IPv6) and deletes them via the OPNsense API client. Returns a result dict with deleted_leases, status, and errors.
async def execute(self, params: dict[str, Any]) -> dict[str, Any]: """ Execute DHCP lease deletion. Args: params: Execution parameters containing hostname, ip, or mac. Returns: Dictionary containing deletion results. """ try: if not self.client: return { "status": "error", "error": "No client available", "deleted_leases": [], } # Parse parameters hostname = params.get("hostname") ip = params.get("ip") mac = params.get("mac") if not any([hostname, ip, mac]): return { "status": "error", "error": "Must provide hostname, ip, or mac parameter", "deleted_leases": [], } deleted_leases = [] errors = [] # Get current leases to find matches dhcpv4_leases = await self.client.get_dhcpv4_leases() dhcpv6_leases = await self.client.get_dhcpv6_leases() # Find matching IPv4 leases matching_v4 = self._find_lease_by_criteria(dhcpv4_leases, hostname, ip, mac) # Find matching IPv6 leases matching_v6 = self._find_lease_by_criteria(dhcpv6_leases, hostname, ip, mac) # Delete matching IPv4 leases for lease in matching_v4: lease_ip = lease.get("ip") or lease.get("address") if lease_ip: try: # Delete IPv4 lease response = await self.client.delete_dhcpv4_lease(lease_ip) deleted_leases.append( { "ip": lease_ip, "mac": lease.get("mac"), "hostname": lease.get("hostname"), "type": "IPv4", "status": "deleted", } ) logger.info(f"Deleted IPv4 lease for IP: {lease_ip}") except Exception as e: error_msg = f"Failed to delete IPv4 lease {lease_ip}: {str(e)}" errors.append(error_msg) logger.error(error_msg) # Delete matching IPv6 leases for lease in matching_v6: lease_ip = lease.get("ip") or lease.get("address") if lease_ip: try: # Delete IPv6 lease response = await self.client.delete_dhcpv6_lease(lease_ip) deleted_leases.append( { "ip": lease_ip, "mac": lease.get("mac"), "hostname": lease.get("hostname"), "type": "IPv6", "status": "deleted", } ) logger.info(f"Deleted IPv6 lease for IP: {lease_ip}") except Exception as e: error_msg = f"Failed to delete IPv6 lease {lease_ip}: {str(e)}" errors.append(error_msg) logger.error(error_msg) # Return results result = { "status": "success" if deleted_leases else "no_matches", "deleted_leases": deleted_leases, "total_deleted": len(deleted_leases), "search_criteria": {"hostname": hostname, "ip": ip, "mac": mac}, } if errors: result["errors"] = errors result["status"] = "partial_success" if deleted_leases else "error" return result except Exception as e: logger.exception("Failed to delete DHCP leases") return { "status": "error", "error": str(e), "deleted_leases": [], } - Pydantic model DHCPLeaseDeleteParams (hostname, ip, mac) and the class-level input_schema dict used for tool definition with anyOf validation requiring at least one parameter.
class DHCPLeaseDeleteParams(BaseModel): """Parameters for DHCP lease deletion.""" hostname: str | None = None ip: str | None = None mac: str | None = None class DHCPLeaseDeleteTool: """Tool for deleting DHCP leases from OPNsense.""" name = "dhcp_lease_delete" description = "Delete DHCP leases by hostname, IP, or MAC address" input_schema = { "type": "object", "properties": { "hostname": {"type": "string", "description": "Hostname to search for"}, "ip": {"type": "string", "description": "IP address to delete"}, "mac": {"type": "string", "description": "MAC address to search for"}, }, "anyOf": [ {"required": ["hostname"]}, {"required": ["ip"]}, {"required": ["mac"]}, ], } - opnsense_mcp/server.py:298-326 (schema)Tool registration in the tools/list response: defines name 'dhcp_lease_delete', description, and inputSchema with hostname/ip/mac properties and anyOf constraint.
{ "name": "dhcp_lease_delete", "description": "Delete DHCP leases by hostname, IP, or MAC address", "inputSchema": { "type": "object", "properties": { "hostname": { "type": "string", "description": "Hostname to search for", "optional": True, }, "ip": { "type": "string", "description": "IP address to delete", "optional": True, }, "mac": { "type": "string", "description": "MAC address to search for", "optional": True, }, }, "anyOf": [ {"required": ["hostname"]}, {"required": ["ip"]}, {"required": ["mac"]}, ], }, }, - opnsense_mcp/tools/__init__.py:18-22 (registration)TOOL_CLASSES registry mapping 'dhcp_lease_delete' -> DHCPLeaseDeleteTool class (used by execute_tool helper).
TOOL_CLASSES = { "arp": ARPTool, "system": SystemTool, "dhcp": DHCPTool, "dhcp_lease_delete": DHCPLeaseDeleteTool, - opnsense_mcp/server.py:788-794 (registration)Dispatch in handle_message for tools/call: routes tool name 'dhcp_lease_delete' to dhcp_lease_delete_tool.execute(arguments).
if tool_name == "dhcp_lease_delete": result = await dhcp_lease_delete_tool.execute(arguments) return { "jsonrpc": "2.0", "id": msg_id, "result": {"content": [{"type": "text", "text": str(result)}]}, }