qualys-mcp 2.1.8__py3-none-any.whl → 2.2.0__py3-none-any.whl
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.
- {qualys_mcp-2.1.8.dist-info → qualys_mcp-2.2.0.dist-info}/METADATA +1 -1
- qualys_mcp-2.2.0.dist-info/RECORD +6 -0
- qualys_mcp.py +17 -8
- qualys_mcp-2.1.8.dist-info/RECORD +0 -6
- {qualys_mcp-2.1.8.dist-info → qualys_mcp-2.2.0.dist-info}/WHEEL +0 -0
- {qualys_mcp-2.1.8.dist-info → qualys_mcp-2.2.0.dist-info}/entry_points.txt +0 -0
- {qualys_mcp-2.1.8.dist-info → qualys_mcp-2.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qualys-mcp
|
|
3
|
-
Version: 2.
|
|
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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
qualys_mcp.py,sha256=1RNCIorwyenlNpxZ0K1nC7Uo3oeyvTnYUn147bDgoxQ,33033
|
|
2
|
+
qualys_mcp-2.2.0.dist-info/METADATA,sha256=-OtX5IZBLBie8-S847DANTnjvoG_ETCxiMheA53uPmE,3295
|
|
3
|
+
qualys_mcp-2.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
4
|
+
qualys_mcp-2.2.0.dist-info/entry_points.txt,sha256=Dc8X0AhJDjGaZOJ0SNpWDWjEX4sYzrYa9FZEbggX0Rs,47
|
|
5
|
+
qualys_mcp-2.2.0.dist-info/licenses/LICENSE,sha256=dW3nC4AX_VbxPAgneSDR-miZPiHgAYw5JhPtdbUEt_E,1091
|
|
6
|
+
qualys_mcp-2.2.0.dist-info/RECORD,,
|
qualys_mcp.py
CHANGED
|
@@ -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
|
-
|
|
569
|
-
|
|
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
|
|
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
|
|
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
|
|
|
@@ -862,7 +868,10 @@ def debug_api(endpoint: str = "eol") -> dict:
|
|
|
862
868
|
result['has_assetListData'] = 'assetListData' in data
|
|
863
869
|
result['asset_count'] = len(data.get('assetListData', {}).get('asset', []))
|
|
864
870
|
if result['asset_count'] > 0:
|
|
865
|
-
result['
|
|
871
|
+
result['sample_asset_raw'] = data['assetListData']['asset'][0]
|
|
872
|
+
parsed = get_eol_assets("EOL,EOL/EOS,EOS", 5)
|
|
873
|
+
result['parsed_count'] = len(parsed)
|
|
874
|
+
result['sample_asset_parsed'] = parsed[0] if parsed else None
|
|
866
875
|
except Exception as e:
|
|
867
876
|
result['error'] = str(e)
|
|
868
877
|
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
qualys_mcp.py,sha256=_mcV-BunK0Y74D5nrQaVIfBdrVyKQMXB8Cc3RlpWI8k,32448
|
|
2
|
-
qualys_mcp-2.1.8.dist-info/METADATA,sha256=u5F5XF6o_5hVxfdm2IFMujfvjer6qPOZTIePi11ID4w,3295
|
|
3
|
-
qualys_mcp-2.1.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
4
|
-
qualys_mcp-2.1.8.dist-info/entry_points.txt,sha256=Dc8X0AhJDjGaZOJ0SNpWDWjEX4sYzrYa9FZEbggX0Rs,47
|
|
5
|
-
qualys_mcp-2.1.8.dist-info/licenses/LICENSE,sha256=dW3nC4AX_VbxPAgneSDR-miZPiHgAYw5JhPtdbUEt_E,1091
|
|
6
|
-
qualys_mcp-2.1.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|