{"serverId":"mcp-registry/io.kernelscan/kernelscan","tools":[{"name":"create_product","fixed":{"name":"create_product","description":"Create a new product, run analysis, and return its initial stats.\n\n        ``config_upload_id`` references a previously-staged .config that the\n        caller POSTed to ``/api/configs/uploads`` over plain HTTP — the LLM\n        does NOT emit the config text itself (a real kernel .config is\n        ~100–200 KB and exceeds a single tool-call output budget). Workflow:\n\n        1. Caller / wrapper script:\n           ``curl -H \"Authorization: Bearer ks_live_...\" \\\n                  -F \"config_file=@.","inputSchema":{"type":"object","title":"create_productArguments","required":["name","kernel_version","arch","config_upload_id"],"properties":{"arch":{"type":"string","title":"Arch"},"name":{"type":"string","title":"Name"},"factor_ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Factor Ids","default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null},"kernel_version":{"type":"string","title":"Kernel Version"},"config_upload_id":{"type":"string","title":"Config Upload Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":312,"tokensAfter":312},{"name":"get_cve","fixed":{"name":"get_cve","description":"Fetch a single Linux kernel CVE by ID (e.g. ``CVE-2024-12345``).\n\n        No API key required: keyless callers get the public representation of a\n        CVE, but only for CVEs in the public set (recent high-severity); any\n        other id returns ``not found``. Free *keyed* callers get a 404 for CVEs\n        published more than 60 days ago. AI risk-summary / analysis fields are\n        included for any keyed user on CVEs in the public set, and for pro /\n        enterprise on every assessed CVE.","inputSchema":{"type":"object","title":"get_cveArguments","required":["cve_id"],"properties":{"cve_id":{"type":"string","title":"Cve Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":190,"tokensAfter":190},{"name":"get_product","fixed":{"name":"get_product","description":"Fetch one product owned by the caller, including the CVE breakdown.\n\n        Returns 404 (not 403) if the product belongs to another user, so\n        product existence isn't leaked across accounts.\n        ","inputSchema":{"type":"object","title":"get_productArguments","required":["product_id"],"properties":{"product_id":{"type":"string","title":"Product Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"get_product_vex","fixed":{"name":"get_product_vex","description":"Return the VEX MANIFEST for one of the caller's products — metadata,\n        not the document.\n\n        Multi-megabyte CycloneDX documents (up to 8,000+ vulnerability entries)\n        are not safe model-context payloads, so this tool returns a bounded\n        manifest: CycloneDX format/spec version, product id, generated/expires\n        timestamps, the VEX hash and the composite ETag identity, the\n        uncompressed size in bytes, total + per-status vulnerability counts,\n        and the authen","inputSchema":{"type":"object","title":"get_product_vexArguments","required":["product_id"],"properties":{"product_id":{"type":"string","title":"Product Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":198,"tokensAfter":198},{"name":"list_product_vex_entries","fixed":{"name":"list_product_vex_entries","description":"Page through the VEX vulnerability entries of one of the caller's products.\n\n        Returns COMPLETE CycloneDX vulnerability objects for one bounded page\n        — never the root document, never all entries — plus ``returned``,\n        ``total_matching``, and a ``next_cursor`` to continue with. Every\n        result is bounded to 256 KiB: the page stops before the byte limit and\n        returns a cursor when necessary. Entries are ordered by CVE id\n        (ascending) and carry the same live ``k","inputSchema":{"type":"object","title":"list_product_vex_entriesArguments","required":["product_id"],"properties":{"kev":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kev","default":null},"limit":{"type":"integer","title":"Limit","default":25},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","default":null},"cve_ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Cve Ids","default":null},"statuses":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Statuses","default":null},"product_id":{"type":"string","title":"Product Id"},"severities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Severities","default":null},"exploit_maturity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exploit Maturity","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":392,"tokensAfter":392},{"name":"list_products","fixed":{"name":"list_products","description":"List the calling user's products with denormalized analysis stats.\n\n        Paid plans only (basic / pro / enterprise). Free callers get a clear\n        upgrade message.\n        ","inputSchema":{"type":"object","title":"list_productsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":85,"tokensAfter":85},{"name":"search_cves","fixed":{"name":"search_cves","description":"Search Linux kernel CVEs.\n\n        No API key required: keyless callers get the free public tier — recent\n        high-severity Linux kernel CVEs (capped at 25 results). Free *keyed*\n        callers see only CVEs published in the last 60 days; basic+ keyed\n        callers get the full corpus.\n        ``query`` matches against CVE id and description (case-insensitive).\n        ``severity`` filters by effective severity (``critical``/``high``/``medium``/``low``).\n        ``cvss_min`` filters by ef","inputSchema":{"type":"object","title":"search_cvesArguments","properties":{"limit":{"type":"integer","title":"Limit","default":25},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","default":null},"cvss_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cvss Min","default":null},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity","default":null},"published_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published After","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":293,"tokensAfter":293},{"name":"submit_support_report","fixed":{"name":"submit_support_report","description":"Send a support / dispute report to KernelScan staff.\n\n        Use this when an automated CVE or factor assessment looks wrong, or\n        when you need to hand human-needed context back to the team. The\n        caller's API-key user is attached automatically (id, email, plan)\n        so support can look the account up.\n\n        ``category`` should be one of:\n        - ``cve_assessment`` — wrong AI verdict / CVSS / CWE on a CVE\n        - ``factor_assessment`` — wrong factor verdict for a product\n","inputSchema":{"type":"object","title":"submit_support_reportArguments","required":["category","subject","message"],"properties":{"cve_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cve Id","default":null},"message":{"type":"string","title":"Message"},"subject":{"type":"string","title":"Subject"},"category":{"type":"string","title":"Category"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id","default":null},"assessment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assessment Id","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":310,"tokensAfter":310},{"name":"update_product","fixed":{"name":"update_product","description":"Update a product owned by the caller. Re-runs analysis if the\n        kernel_version, arch, or referenced .config changed.\n\n        To change the .config, first POST the new file to\n        ``/api/configs/uploads`` (see ``create_product`` for the curl recipe)\n        and pass the returned ``config_upload_id`` here. Leave\n        ``config_upload_id`` as ``None`` to keep the existing .config.\n        ``factor_ids=None`` leaves factor selections untouched; an empty\n        list clears them. Same ti","inputSchema":{"type":"object","title":"update_productArguments","required":["product_id"],"properties":{"arch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arch","default":null},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":null},"factor_ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Factor Ids","default":null},"product_id":{"type":"string","title":"Product Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null},"kernel_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kernel Version","default":null},"config_upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Upload Id","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":362,"tokensAfter":362}],"toolsChanged":9,"tokensSaved":0,"todo":[{"tool":"create_product","params":["arch","name","factor_ids","description","kernel_version","config_upload_id"]},{"tool":"get_cve","params":["cve_id"]},{"tool":"get_product","params":["product_id"]},{"tool":"get_product_vex","params":["product_id"]},{"tool":"list_product_vex_entries","params":["kev","limit","cursor","cve_ids","statuses","product_id","severities","exploit_maturity"]},{"tool":"request_access","params":["name","email","reason"]},{"tool":"search_cves","params":["limit","query","cvss_min","severity","published_after"]},{"tool":"submit_support_report","params":["cve_id","message","subject","category","product_id","assessment_id"]},{"tool":"update_product","params":["arch","name","factor_ids","product_id","description","kernel_version","config_upload_id"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}