@rad-security/mcp-server 0.0.26 → 0.0.30-2.g4ae51ae

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.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # RAD Security MCP Server
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@rad-security/mcp-server)](https://npmjs.com/package/@rad-security/mcp-server)
4
+
3
5
  A Model Context Protocol (MCP) server for RAD Security, providing AI-powered security insights for Kubernetes and cloud environments.
4
6
 
5
7
  <a href="https://glama.ai/mcp/servers/@rad-security/mcp-server">
@@ -46,13 +48,10 @@ Available toolkits:
46
48
  - `clusters` - Kubernetes cluster operations
47
49
  - `identities` - Identity management operations
48
50
  - `audit` - Audit log operations
49
- - `cloud_inventory` - Cloud resource inventory
50
51
  - `images` - Container image operations
51
52
  - `kubeobject` - Kubernetes resource operations
52
53
  - `misconfigs` - Misconfiguration detection
53
54
  - `runtime` - Runtime analysis operations
54
- - `runtime_network` - Network traffic analysis
55
- - `threats` - Threat vector operations
56
55
  - `findings` - Security findings operations
57
56
  - `cves` - CVE database operations
58
57
  - `inbox` - Inbox item operations
@@ -72,8 +71,8 @@ INCLUDE_TOOLKITS="containers,images"
72
71
  # Exclude workflow toolkit (enable all others)
73
72
  EXCLUDE_TOOLKITS="workflows"
74
73
 
75
- # Exclude runtime and threat toolkits
76
- EXCLUDE_TOOLKITS="runtime,threats"
74
+ # Exclude runtime toolkit
75
+ EXCLUDE_TOOLKITS="runtime"
77
76
  ```
78
77
 
79
78
  Note: If `INCLUDE_TOOLKITS` is set, `EXCLUDE_TOOLKITS` is ignored.
@@ -220,10 +219,6 @@ docker run \
220
219
  - List Kubernetes resources*
221
220
  - List Kubernetes resource misconfiguration policies*
222
221
 
223
- - Threat Vector
224
- - List threat vectors*
225
- - Get details of a specific threat vector*
226
-
227
222
  - CVEs
228
223
  - List CVEs
229
224
  - Get details of a specific CVE
@@ -257,4 +252,4 @@ npm run build
257
252
 
258
253
  ## License
259
254
 
260
- MIT License - see the [LICENSE](LICENSE) file for details
255
+ MIT License - see the [LICENSE](LICENSE) file for details
package/dist/index.js CHANGED
@@ -13,15 +13,13 @@ import express from "express";
13
13
  import { RadSecurityClient } from "./client.js";
14
14
  import * as containers from "./operations/containers.js";
15
15
  import * as audit from "./operations/audit.js";
16
- import * as cloudInventory from "./operations/cloud-inventory.js";
17
16
  import * as clusters from "./operations/clusters.js";
18
17
  import * as identities from "./operations/identities.js";
19
18
  import * as images from "./operations/images.js";
19
+ import * as cveDispositions from "./operations/cve-dispositions.js";
20
20
  import * as kubeobject from "./operations/kubeobject.js";
21
21
  import * as misconfigs from "./operations/misconfigs.js";
22
22
  import * as runtime from "./operations/runtime.js";
23
- import * as runtimeNetwork from "./operations/runtime_network.js";
24
- import * as threats from "./operations/threats.js";
25
23
  import * as findings from "./operations/findings.js";
26
24
  import * as cves from "./operations/cves.js";
27
25
  import * as inbox from "./operations/inbox.js";
@@ -29,8 +27,8 @@ import * as workflows from "./operations/workflows.js";
29
27
  import * as customWorkflows from "./operations/custom-workflows.js";
30
28
  import * as knowledgeBase from "./operations/knowledge-base.js";
31
29
  import * as radql from "./operations/radql.js";
32
- import * as cloudCompliance from "./operations/cloud-compliance.js";
33
30
  import * as dashboards from "./operations/dashboards.js";
31
+ import * as integrations from "./operations/integrations.js";
34
32
  import { VERSION } from "./version.js";
35
33
  import { logger } from "./logger.js";
36
34
  // Parse toolkit filters from environment variables
@@ -139,66 +137,6 @@ async function newServer() {
139
137
  },
140
138
  ]
141
139
  : []),
142
- // Cloud Inventory tools
143
- ...(isToolkitEnabled("cloud_inventory", toolkitFilters)
144
- ? [
145
- {
146
- name: "list_cloud_resources",
147
- description: "List cloud resources for a specific provider with optional filtering",
148
- inputSchema: zodToJsonSchema(cloudInventory.ListCloudResourcesSchema),
149
- },
150
- {
151
- name: "get_cloud_resource_details",
152
- description: "Get detailed information about a specific cloud resource",
153
- inputSchema: zodToJsonSchema(cloudInventory.GetCloudResourceDetailsSchema),
154
- },
155
- {
156
- name: "get_cloud_resource_facets",
157
- description: "Get available facets for filtering cloud resources from a provider",
158
- inputSchema: zodToJsonSchema(cloudInventory.GetCloudResourceFacetsSchema),
159
- },
160
- {
161
- name: "get_cloud_resource_facet_value",
162
- description: "Get values for a specific facet from a cloud provider",
163
- inputSchema: zodToJsonSchema(cloudInventory.GetCloudResourceFacetValuesSchema),
164
- },
165
- ]
166
- : []),
167
- // Cloud Compliance tools
168
- ...(isToolkitEnabled("cloud_compliance", toolkitFilters)
169
- ? [
170
- {
171
- name: "list_compliance_frameworks",
172
- description: "List all compliance frameworks available for cloud resources (e.g., CIS, SOC2, PCI-DSS)",
173
- inputSchema: zodToJsonSchema(cloudCompliance.ListComplianceFrameworksSchema),
174
- },
175
- {
176
- name: "list_framework_requirements",
177
- description: "List all requirements for a specific compliance framework",
178
- inputSchema: zodToJsonSchema(cloudCompliance.ListFrameworkRequirementsSchema),
179
- },
180
- {
181
- name: "list_requirement_controls",
182
- description: "List controls associated with a specific requirement within a compliance framework",
183
- inputSchema: zodToJsonSchema(cloudCompliance.ListRequirementControlsSchema),
184
- },
185
- {
186
- name: "list_compliance_controls",
187
- description: "List all compliance control summaries for the account",
188
- inputSchema: zodToJsonSchema(cloudCompliance.ListComplianceControlsSchema),
189
- },
190
- {
191
- name: "get_compliance_control",
192
- description: "Get detailed information about a specific compliance control",
193
- inputSchema: zodToJsonSchema(cloudCompliance.GetComplianceControlSchema),
194
- },
195
- {
196
- name: "list_control_resources",
197
- description: "List cloud resources associated with a specific compliance control",
198
- inputSchema: zodToJsonSchema(cloudCompliance.ListControlResourcesSchema),
199
- },
200
- ]
201
- : []),
202
140
  // Image tools
203
141
  ...(isToolkitEnabled("images", toolkitFilters)
204
142
  ? [
@@ -222,6 +160,21 @@ async function newServer() {
222
160
  description: "Get the SBOM of a container image",
223
161
  inputSchema: zodToJsonSchema(images.GetImageSBOMSchema),
224
162
  },
163
+ {
164
+ name: "ignore_cve",
165
+ description: "Ignore a CVE for this account so it no longer appears in vulnerability reporting. Use for confirmed false positives, accepted risks, or won't-fix decisions. Do NOT use for remediated CVEs — those drop off automatically on the next scan.",
166
+ inputSchema: zodToJsonSchema(cveDispositions.ignoreCveSchema),
167
+ },
168
+ {
169
+ name: "unignore_cve",
170
+ description: "Remove an account-wide CVE disposition, restoring the CVE to vulnerability reporting.",
171
+ inputSchema: zodToJsonSchema(cveDispositions.unignoreCveSchema),
172
+ },
173
+ {
174
+ name: "list_cve_dispositions",
175
+ description: "List active CVE dispositions (ignored / false positive) for this account, with reason and author.",
176
+ inputSchema: zodToJsonSchema(cveDispositions.listCveDispositionsSchema),
177
+ },
225
178
  ]
226
179
  : []),
227
180
  // Kubernetes Object tools
@@ -279,36 +232,6 @@ async function newServer() {
279
232
  },
280
233
  ]
281
234
  : []),
282
- // Runtime Network tools
283
- ...(isToolkitEnabled("runtime_network", toolkitFilters)
284
- ? [
285
- {
286
- name: "list_http_requests",
287
- description: "List HTTP requests insights with optional filtering by method, path, source and destination workloads, and PII detection",
288
- inputSchema: zodToJsonSchema(runtimeNetwork.listHttpRequestsSchema),
289
- },
290
- {
291
- name: "list_network_connections",
292
- description: "List network connections with optional filtering",
293
- inputSchema: zodToJsonSchema(runtimeNetwork.listNetworkConnectionsSchema),
294
- },
295
- {
296
- name: "list_network_connection_srcs",
297
- description: "List network connection sources with optional filtering by source and destination workloads",
298
- inputSchema: zodToJsonSchema(runtimeNetwork.listNetworkConnectionSourcesSchema),
299
- },
300
- ]
301
- : []),
302
- // Threat Vectors tools
303
- ...(isToolkitEnabled("threats", toolkitFilters)
304
- ? [
305
- {
306
- name: "list_threat_vectors",
307
- description: "List threat vectors",
308
- inputSchema: zodToJsonSchema(threats.listThreatVectorsSchema),
309
- },
310
- ]
311
- : []),
312
235
  // Findings tools
313
236
  ...(isToolkitEnabled("findings", toolkitFilters)
314
237
  ? [
@@ -463,7 +386,7 @@ async function newServer() {
463
386
  ? [
464
387
  {
465
388
  name: "radql_list_data_types",
466
- description: "List all available RadQL data types (discovery). ALWAYS call this FIRST before using other RadQL tools to discover what data is available to query. Returns data types like 'containers', 'kubernetes_resources', 'inbox_items', 'vulnerabilities', etc. with descriptions.",
389
+ description: "List all available RadQL data types (discovery). ALWAYS call this FIRST before using other RadQL tools to discover what data is available to query. Returns data types like 'containers', 'kubernetes_resources', 'inbox_items', 'cloud_resources', 'cloud_benchmarks', 'cloud_benchmark_summaries', etc. with descriptions.",
467
390
  inputSchema: zodToJsonSchema(radql.RadQLListDataTypesSchema),
468
391
  },
469
392
  {
@@ -487,7 +410,7 @@ containers: name, image_name, image_repo, owner_kind, cluster_id, created_at
487
410
  Example: image_name:*nginx* AND owner_kind:Pod
488
411
 
489
412
  finding_groups: type, source_kind, source_name, rule_title, severity, event_timestamp
490
- Types: k8s_misconfiguration, k8s_audit_logs_anomaly, threat_vector
413
+ Types: k8s_misconfiguration, k8s_audit_logs_anomaly
491
414
  Example: type:k8s_misconfiguration AND severity:critical
492
415
 
493
416
  inbox_items: severity (High|Medium|Low), type, title, archived, false_positive, created_at
@@ -496,6 +419,16 @@ inbox_items: severity (High|Medium|Low), type, title, archived, false_positive,
496
419
  kubernetes_resources: kind, name, namespace, cluster_id, owner_kind, created_at
497
420
  Example: kind:Deployment AND namespace:production
498
421
 
422
+ CLOUD RESOURCES & COMPLIANCE (use these RadQL data types instead of dedicated cloud tools):
423
+ cloud_resources: cloud_provider, cloud_account_id, resource_type, resource_name, resource_id, resource_json, last_seen_at
424
+ Example: cloud_provider:aws AND resource_type:aws_iam_policy
425
+
426
+ cloud_benchmark_summaries: cloud_provider, cloud_account_id, benchmark_id, title, description, fail_count, pass_count, total_count, last_seen_at
427
+ Example: cloud_provider:aws AND fail_count>0
428
+
429
+ cloud_benchmarks: cloud_provider, cloud_account_id, benchmark_id, control_id, control_title, severity, status, reason, resource_id, last_seen_at
430
+ Example: status:fail AND benchmark_id:*cis*
431
+
499
432
  CRITICAL QUOTING RULES:
500
433
  MUST quote when value contains:
501
434
  - Dates/timestamps: created_at>"2024-01-01" (NOT created_at>2024-01-01)
@@ -561,6 +494,16 @@ For complete schema: call radql_get_type_metadata with target data_type`,
561
494
  },
562
495
  ]
563
496
  : []),
497
+ // Integrations tools
498
+ ...(isToolkitEnabled("integrations", toolkitFilters)
499
+ ? [
500
+ {
501
+ name: "list_external_integrations",
502
+ description: "List external integrations configured for the tenant (e.g., Slack, AWS CloudTrail, Okta). Returns integration details including capabilities, configuration, mcp support and sync status.",
503
+ inputSchema: zodToJsonSchema(integrations.ListExternalIntegrationsSchema),
504
+ },
505
+ ]
506
+ : []),
564
507
  ];
565
508
  return {
566
509
  tools: allTools,
@@ -642,128 +585,63 @@ For complete schema: call radql_get_type_metadata with target data_type`,
642
585
  ],
643
586
  };
644
587
  }
645
- // Cloud Inventory tools
646
- case "list_cloud_resources": {
647
- const args = cloudInventory.ListCloudResourcesSchema.parse(request.params.arguments);
648
- const response = await cloudInventory.listCloudResources(client, args.provider, args.filters, args.offset, args.limit, args.q);
649
- return {
650
- content: [
651
- { type: "text", text: JSON.stringify(response, null, 2) },
652
- ],
653
- };
654
- }
655
- case "get_cloud_resource_details": {
656
- const args = cloudInventory.GetCloudResourceDetailsSchema.parse(request.params.arguments);
657
- const response = await cloudInventory.getCloudResourceDetails(client, args.provider, args.resource_type, args.resource_id);
658
- return {
659
- content: [
660
- { type: "text", text: JSON.stringify(response, null, 2) },
661
- ],
662
- };
663
- }
664
- case "get_cloud_resource_facets": {
665
- const args = cloudInventory.GetCloudResourceFacetsSchema.parse(request.params.arguments);
666
- const response = await cloudInventory.getCloudResourceFacets(client, args.provider);
667
- return {
668
- content: [
669
- { type: "text", text: JSON.stringify(response, null, 2) },
670
- ],
671
- };
672
- }
673
- case "get_cloud_resource_facet_value": {
674
- const args = cloudInventory.GetCloudResourceFacetValuesSchema.parse(request.params.arguments);
675
- const response = await cloudInventory.getCloudResourceFacetValues(client, args.provider, args.facet_id);
676
- return {
677
- content: [
678
- { type: "text", text: JSON.stringify(response, null, 2) },
679
- ],
680
- };
681
- }
682
- // Cloud Compliance tools
683
- case "list_compliance_frameworks": {
684
- const args = cloudCompliance.ListComplianceFrameworksSchema.parse(request.params.arguments);
685
- const response = await cloudCompliance.listComplianceFrameworks(client, args.datasource_ids, args.page, args.page_size);
686
- return {
687
- content: [
688
- { type: "text", text: JSON.stringify(response, null, 2) },
689
- ],
690
- };
691
- }
692
- case "list_framework_requirements": {
693
- const args = cloudCompliance.ListFrameworkRequirementsSchema.parse(request.params.arguments);
694
- const response = await cloudCompliance.listFrameworkRequirements(client, args.framework_name, args.datasource_ids, args.page, args.page_size);
695
- return {
696
- content: [
697
- { type: "text", text: JSON.stringify(response, null, 2) },
698
- ],
699
- };
700
- }
701
- case "list_requirement_controls": {
702
- const args = cloudCompliance.ListRequirementControlsSchema.parse(request.params.arguments);
703
- const response = await cloudCompliance.listRequirementControls(client, args.framework_name, args.requirement_id, args.datasource_ids, args.page, args.page_size);
588
+ // Image tools
589
+ case "list_images": {
590
+ const args = images.ListImagesSchema.parse(request.params.arguments);
591
+ const response = await images.listImages(client, args.limit, args.offset, args.sort, args.filters, args.q);
704
592
  return {
705
593
  content: [
706
594
  { type: "text", text: JSON.stringify(response, null, 2) },
707
595
  ],
708
596
  };
709
597
  }
710
- case "list_compliance_controls": {
711
- const args = cloudCompliance.ListComplianceControlsSchema.parse(request.params.arguments);
712
- const response = await cloudCompliance.listComplianceControls(client, args.status, args.providers, args.page, args.page_size);
598
+ case "list_image_vulnerabilities": {
599
+ const args = images.ListImageVulnerabilitiesSchema.parse(request.params.arguments);
600
+ const response = await images.listImageVulnerabilities(client, args.digest, args.severities, args.page, args.page_size);
713
601
  return {
714
602
  content: [
715
603
  { type: "text", text: JSON.stringify(response, null, 2) },
716
604
  ],
717
605
  };
718
606
  }
719
- case "get_compliance_control": {
720
- const args = cloudCompliance.GetComplianceControlSchema.parse(request.params.arguments);
721
- const response = await cloudCompliance.getComplianceControl(client, args.control_name, args.datasource_ids);
607
+ case "get_top_vulnerable_images": {
608
+ const response = await images.getTopVulnerableImages(client);
722
609
  return {
723
610
  content: [
724
611
  { type: "text", text: JSON.stringify(response, null, 2) },
725
612
  ],
726
613
  };
727
614
  }
728
- case "list_control_resources": {
729
- const args = cloudCompliance.ListControlResourcesSchema.parse(request.params.arguments);
730
- const response = await cloudCompliance.listControlResources(client, args.control_name, args.datasource_ids, args.page, args.page_size);
615
+ case "get_image_sbom": {
616
+ const args = images.GetImageSBOMSchema.parse(request.params.arguments);
617
+ const response = await images.getImageSBOM(client, args.digest);
731
618
  return {
732
619
  content: [
733
620
  { type: "text", text: JSON.stringify(response, null, 2) },
734
621
  ],
735
622
  };
736
623
  }
737
- // Image tools
738
- case "list_images": {
739
- const args = images.ListImagesSchema.parse(request.params.arguments);
740
- const response = await images.listImages(client, args.limit, args.offset, args.sort, args.filters, args.q);
624
+ case "ignore_cve": {
625
+ const args = cveDispositions.ignoreCveSchema.parse(request.params.arguments);
626
+ const response = await cveDispositions.ignoreCve(client, args.cve_name, args.disposition, args.reason);
741
627
  return {
742
628
  content: [
743
629
  { type: "text", text: JSON.stringify(response, null, 2) },
744
630
  ],
745
631
  };
746
632
  }
747
- case "list_image_vulnerabilities": {
748
- const args = images.ListImageVulnerabilitiesSchema.parse(request.params.arguments);
749
- const response = await images.listImageVulnerabilities(client, args.digest, args.severities, args.page, args.page_size);
633
+ case "unignore_cve": {
634
+ const args = cveDispositions.unignoreCveSchema.parse(request.params.arguments);
635
+ const response = await cveDispositions.unignoreCve(client, args.cve_name);
750
636
  return {
751
637
  content: [
752
638
  { type: "text", text: JSON.stringify(response, null, 2) },
753
639
  ],
754
640
  };
755
641
  }
756
- case "get_top_vulnerable_images": {
757
- const response = await images.getTopVulnerableImages(client);
758
- return {
759
- content: [
760
- { type: "text", text: JSON.stringify(response, null, 2) },
761
- ],
762
- };
763
- }
764
- case "get_image_sbom": {
765
- const args = images.GetImageSBOMSchema.parse(request.params.arguments);
766
- const response = await images.getImageSBOM(client, args.digest);
642
+ case "list_cve_dispositions": {
643
+ cveDispositions.listCveDispositionsSchema.parse(request.params.arguments);
644
+ const response = await cveDispositions.listCveDispositions(client);
767
645
  return {
768
646
  content: [
769
647
  { type: "text", text: JSON.stringify(response, null, 2) },
@@ -844,44 +722,6 @@ For complete schema: call radql_get_type_metadata with target data_type`,
844
722
  ],
845
723
  };
846
724
  }
847
- // Runtime Network tools
848
- case "list_http_requests": {
849
- const args = runtimeNetwork.listHttpRequestsSchema.parse(request.params.arguments);
850
- const response = await runtimeNetwork.listHttpRequests(client, args);
851
- return {
852
- content: [
853
- { type: "text", text: JSON.stringify(response, null, 2) },
854
- ],
855
- };
856
- }
857
- case "list_network_connections": {
858
- const args = runtimeNetwork.listNetworkConnectionsSchema.parse(request.params.arguments);
859
- const response = await runtimeNetwork.listNetworkConnections(client, args);
860
- return {
861
- content: [
862
- { type: "text", text: JSON.stringify(response, null, 2) },
863
- ],
864
- };
865
- }
866
- case "list_network_connection_srcs": {
867
- const args = runtimeNetwork.listNetworkConnectionSourcesSchema.parse(request.params.arguments);
868
- const response = await runtimeNetwork.listNetworkConnectionSources(client, args);
869
- return {
870
- content: [
871
- { type: "text", text: JSON.stringify(response, null, 2) },
872
- ],
873
- };
874
- }
875
- // Threat Vectors tools
876
- case "list_threat_vectors": {
877
- const args = threats.listThreatVectorsSchema.parse(request.params.arguments);
878
- const response = await threats.listThreatVectors(client, args.clustersIds, args.namespaces, args.resource_uid, args.page, args.page_size);
879
- return {
880
- content: [
881
- { type: "text", text: JSON.stringify(response, null, 2) },
882
- ],
883
- };
884
- }
885
725
  // Findings tools
886
726
  case "list_security_findings": {
887
727
  const args = findings.listFindingsSchema.parse(request.params.arguments);
@@ -1212,6 +1052,16 @@ For complete schema: call radql_get_type_metadata with target data_type`,
1212
1052
  ],
1213
1053
  };
1214
1054
  }
1055
+ // Integrations tools
1056
+ case "list_external_integrations": {
1057
+ const args = integrations.ListExternalIntegrationsSchema.parse(request.params.arguments);
1058
+ const response = await integrations.listExternalIntegrations(client, args.offset, args.limit);
1059
+ return {
1060
+ content: [
1061
+ { type: "text", text: JSON.stringify(response, null, 2) },
1062
+ ],
1063
+ };
1064
+ }
1215
1065
  default:
1216
1066
  throw new Error(`Unknown tool: ${toolName}`);
1217
1067
  }