Skip to main content
Glama

JFrog MCP Server

Official
by jfrog
security.ts3.11 kB
import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; import { jfrogRequest } from "../common/utils.js"; import { GetArtifactsSummaryInput, GetArtifactsSummaryInputSchema, GetArtifactsSummaryOutputSchema, ArtifactsSummarySchema, ArtifactsSummaryOutput } from "../schemas/security.js"; /* Api Calls Section */ export async function getArtifactSummary(paths: GetArtifactsSummaryInput): Promise<ArtifactsSummaryOutput> { const full_paths = paths.paths.map(el => "default/" + el); const response: any = await jfrogRequest( "xray/api/v1/summary/artifact", { method: "POST", body: JSON.stringify({ paths: full_paths, }) } ); // Debugging: Log the raw response console.log("Raw response from JFrog Xray API:", GetArtifactsSummaryOutputSchema.parse(response)); // Validate response before parsing if (!response || !response.artifacts || response.artifacts.length === 0) { console.warn("Invalid or missing data in API response:", response); return { artifacts_summary: [] }; } const apiResult = GetArtifactsSummaryOutputSchema.parse(response); const severities_map = new Map<string, Array<number>>(); for (const artifact of apiResult.artifacts) { const artifact_severities = [0, 0, 0, 0, 0]; if (artifact.issues) { for (const issue of artifact.issues) { switch (issue.severity) { case "Critical": artifact_severities![0]++; break; case "High": artifact_severities![1]++; break; case "Medium": artifact_severities![2]++; break; case "Low": artifact_severities![3]++; break; case "Unknown": artifact_severities![4]++; break; } } } severities_map.set(artifact.general.path, artifact_severities); } const artifacts_summary = apiResult.artifacts.map((artifact) => { return { artifact_name: artifact.general.path, artifact_issue_count: artifact.issues ? artifact.issues.length : 0, artifact_critical_count: severities_map.get(artifact.general.path)![0], artifact_high_count: severities_map.get(artifact.general.path)![1], artifact_medium_count: severities_map.get(artifact.general.path)![2], artifact_low_count: severities_map.get(artifact.general.path)![3], artifact_unknown_count: severities_map.get(artifact.general.path)![4], }; }); return { artifacts_summary: artifacts_summary }; } /* End of Api Calls Section */ /* Tools Section */ const getArtifactsSummaryTool = { name: "jfrog_get_artifacts_summary", description: "Get the summary of artifacts, one or many", inputSchema: zodToJsonSchema(GetArtifactsSummaryInputSchema), //outputSchema: zodToJsonSchema(ArtifactsSummarySchema), handler: async (args: any) => { const parsedArgs = GetArtifactsSummaryInputSchema.parse(args); return await getArtifactSummary(parsedArgs); } }; /* End of Tools creation Section */ export const ArtifactSecurityTools = [ getArtifactsSummaryTool ];

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/jfrog/mcp-jfrog'

If you have feedback or need assistance with the MCP directory API, please join our Discord server