qualys-mcp 2.1.9__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qualys-mcp
3
- Version: 2.1.9
3
+ Version: 2.2.0
4
4
  Summary: MCP server for Qualys security APIs - natural language interaction with vulnerability, asset, and cloud security data
5
5
  Project-URL: Homepage, https://github.com/nelssec/qualys-mcp
6
6
  Project-URL: Repository, https://github.com/nelssec/qualys-mcp
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "qualys-mcp"
7
- version = "2.1.9"
7
+ version = "2.2.0"
8
8
  description = "MCP server for Qualys security APIs - natural language interaction with vulnerability, asset, and cloud security data"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -543,7 +543,8 @@ def get_tech_debt(days_until_eol: int = 0) -> dict:
543
543
  'currentEOL': [],
544
544
  'currentEOS': [],
545
545
  'approachingEOL': [],
546
- 'byOS': []
546
+ 'byOS': [],
547
+ 'debug': {'stages_seen': set(), 'parse_errors': 0}
547
548
  }
548
549
 
549
550
  assets = get_eol_assets("EOL,EOL/EOS,EOS", 500)
@@ -557,22 +558,26 @@ def get_tech_debt(days_until_eol: int = 0) -> dict:
557
558
  for a in assets:
558
559
  os_info = a.get('operatingSystem', {})
559
560
  if not isinstance(os_info, dict):
561
+ result['debug']['parse_errors'] += 1
560
562
  continue
561
563
 
562
- os_name = os_info.get('osName', 'Unknown')
564
+ os_name = os_info.get('osName', '') or 'Unknown'
563
565
  lc = os_info.get('lifecycle', {})
564
566
  if not isinstance(lc, dict):
567
+ result['debug']['parse_errors'] += 1
565
568
  continue
566
569
 
567
- stage = lc.get('stage', '')
568
- eol_date = lc.get('eolDate', '')
569
- eos_date = lc.get('eosDate', '')
570
+ stage = (lc.get('stage', '') or '').upper()
571
+ result['debug']['stages_seen'].add(stage)
572
+ eol_date = lc.get('eolDate', '') or ''
573
+ eos_date = lc.get('eosDate', '') or ''
570
574
 
571
575
  asset_info = {
572
576
  'assetId': a.get('assetId'),
573
577
  'ip': a.get('address', ''),
574
578
  'hostname': a.get('dnsName', ''),
575
579
  'os': os_name,
580
+ 'stage': stage,
576
581
  'eolDate': eol_date,
577
582
  'eosDate': eos_date
578
583
  }
@@ -580,12 +585,12 @@ def get_tech_debt(days_until_eol: int = 0) -> dict:
580
585
  if os_name not in os_data:
581
586
  os_data[os_name] = {'eol': 0, 'eos': 0, 'approaching': 0, 'eolDate': eol_date, 'eosDate': eos_date}
582
587
 
583
- if stage == 'EOL':
588
+ if 'EOL' in stage and 'EOS' not in stage:
584
589
  result['stats']['currentEOL'] += 1
585
590
  os_data[os_name]['eol'] += 1
586
591
  if len(result['currentEOL']) < 20:
587
592
  result['currentEOL'].append(asset_info)
588
- elif stage in ('EOS', 'EOL/EOS'):
593
+ elif 'EOS' in stage or 'EOL/EOS' in stage:
589
594
  result['stats']['currentEOS'] += 1
590
595
  os_data[os_name]['eos'] += 1
591
596
  if len(result['currentEOS']) < 20:
@@ -610,6 +615,7 @@ def get_tech_debt(days_until_eol: int = 0) -> dict:
610
615
  if v['eol'] + v['eos'] + v['approaching'] > 0
611
616
  ]
612
617
 
618
+ result['debug']['stages_seen'] = list(result['debug']['stages_seen'])
613
619
  return result
614
620
 
615
621
 
File without changes
File without changes
File without changes