{
  "serverInfo": {
    "name": "stackfacts",
    "title": "Stack Facts",
    "version": "0.5.0",
    "description": "Check a package before install: malware, known vulnerabilities (OSV), exploited CVEs (CISA KEV) and end-of-life, plus LLM prices; signed answers, pay per call in USDC, no account or API key."
  },
  "authentication": {
    "required": false
  },
  "tools": [
    {
      "name": "stackfacts_eol_product",
      "description": "List every release cycle of a product (Node.js, Python, Ubuntu…) and if it is still supported: EOL (end-of-life) date, support status, LTS, latest version.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product": {
            "type": "string",
            "description": "endoflife.date product id or alias, e.g. nodejs, python, ubuntu (GET /v1/eol/index lists them)",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "product"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "EOL",
          "end-of-life dates",
          "support status",
          "is <product> <version> still supported",
          "release cycles",
          "LTS",
          "endoflife.date"
        ]
      }
    },
    {
      "name": "stackfacts_eol_cycle",
      "description": "Check if a version is still supported (is python 3.12 still supported?): one release cycle, its EOL (end-of-life) date, support status, LTS, latest patch.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product": {
            "type": "string",
            "description": "endoflife.date product id or alias, e.g. nodejs, python, ubuntu (GET /v1/eol/index lists them)",
            "minLength": 1,
            "maxLength": 200
          },
          "cycle": {
            "type": "string",
            "description": "Release cycle, e.g. 3.12, 22 or 24.04",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "product",
          "cycle"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "is <product> <version> still supported",
          "EOL",
          "end-of-life date",
          "support status",
          "support until",
          "latest patch version",
          "LTS"
        ]
      }
    },
    {
      "name": "stackfacts_eol_check",
      "description": "Check dependencies, runtimes and OS versions for EOL: is each still supported? Up to 50 product@version pairs to cycle, end-of-life date and support status.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "description": "The versions to check, in order",
            "items": {
              "type": "object",
              "properties": {
                "product": {
                  "type": "string",
                  "description": "endoflife.date product id or alias, e.g. nodejs, python, ubuntu (GET /v1/eol/index lists them)",
                  "minLength": 1,
                  "maxLength": 200
                },
                "version": {
                  "type": "string",
                  "description": "Version string, e.g. 18.19.0 (send \"3.10\" as a string, not a number)",
                  "minLength": 1,
                  "maxLength": 200
                }
              },
              "required": [
                "product",
                "version"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "items"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "check my stack for end-of-life versions",
          "is <product> <version> still supported",
          "EOL",
          "support status",
          "dependency EOL audit",
          "batch end-of-life check"
        ]
      }
    },
    {
      "name": "stackfacts_eol_image",
      "description": "Check a container image for EOL: is node:18-alpine still supported? Maps its runtime, Java and base OS to end-of-life date and support status.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "image": {
            "type": "string",
            "description": "Image reference or a whole Dockerfile FROM line (FROM, --platform and AS name are dropped), e.g. node:18-alpine3.19, python:3.12-slim-bookworm, gcr.io/distroless/nodejs20-debian12, FROM --platform=linux/amd64 ubuntu:22.04 AS build",
            "minLength": 1,
            "maxLength": 256
          }
        },
        "required": [
          "image"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "is my docker image end-of-life",
          "container base image EOL",
          "is <product> <version> still supported",
          "Dockerfile FROM audit",
          "EOL",
          "support status",
          "base OS end-of-life"
        ]
      }
    },
    {
      "name": "stackfacts_eol_snapshot",
      "description": "Download the signed EOL (end-of-life) snapshot (endoflife.date, MIT): support status of every product and cycle, still supported or not, plus its manifest.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "EOL",
          "end-of-life dataset download",
          "support status",
          "is <product> <version> still supported",
          "endoflife.date bulk",
          "signed snapshot"
        ]
      }
    },
    {
      "name": "stackfacts_kev_lookup",
      "description": "Check if a CVE is actively exploited (CISA KEV): in_kev, date added, remediation due date, required action and known ransomware use.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cve": {
            "type": "string",
            "description": "CVE id, e.g. CVE-2021-44228",
            "pattern": "^[Cc][Vv][Ee]-\\d{4}-\\d{4,}$",
            "maxLength": 32
          }
        },
        "required": [
          "cve"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "check if a CVE is actively exploited (CISA KEV)",
          "known exploited vulnerability",
          "CISA KEV lookup",
          "CVE exploited in the wild"
        ]
      }
    },
    {
      "name": "stackfacts_kev_check",
      "description": "Check up to 100 CVEs at once against CISA KEV (known exploited vulnerabilities); returns in_kev and the KEV details for each one.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cves": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "string",
              "description": "CVE id, e.g. CVE-2021-44228",
              "pattern": "^[Cc][Vv][Ee]-\\d{4}-\\d{4,}$",
              "maxLength": 32
            },
            "description": "CVE ids; duplicates are merged"
          }
        },
        "required": [
          "cves"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "check if a CVE is actively exploited (CISA KEV)",
          "batch CVE check",
          "vulnerability scan triage",
          "known exploited vulnerabilities"
        ]
      }
    },
    {
      "name": "stackfacts_kev_changes",
      "description": "List CVEs added to, removed from or changed in CISA KEV since a snapshot_id, so an agent can poll for newly exploited vulnerabilities.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "since": {
            "type": "string",
            "description": "meta.snapshot_id of an earlier kev answer, e.g. kev-20261009T060000Z-1a2b3c4d; kept for 30 snapshots",
            "pattern": "^kev-\\d{8}T\\d{6}Z-[0-9a-f]{8}$",
            "maxLength": 64
          }
        },
        "required": [
          "since"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "new CISA KEV entries",
          "newly exploited vulnerabilities",
          "KEV change feed",
          "check if a CVE is actively exploited (CISA KEV)"
        ]
      }
    },
    {
      "name": "stackfacts_kev_snapshot",
      "description": "Download the full signed CISA KEV snapshot: every known exploited vulnerability, with a manifest to verify the sha256 and signature.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "CISA KEV download",
          "known exploited vulnerabilities catalog",
          "signed snapshot"
        ]
      }
    },
    {
      "name": "stackfacts_models_lookup",
      "description": "Get an LLM model's price per million tokens (input, output, cached), context window, max output, capabilities and model deprecation date.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "description": "Provider, e.g. openai, anthropic, google (GET /v1/models/index lists them)",
            "minLength": 1,
            "maxLength": 100
          },
          "model": {
            "type": "string",
            "description": "Model id at the provider, e.g. gpt-4o",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "provider",
          "model"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "price per million tokens",
          "context window",
          "model deprecation date",
          "LLM pricing",
          "max output tokens"
        ]
      }
    },
    {
      "name": "stackfacts_models_estimate",
      "description": "Estimate the USD cost of an LLM call from input, output and cached token counts, exact to the micro-dollar, with the price lines used.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "description": "provider/model id, e.g. openai/gpt-4o",
            "minLength": 1,
            "maxLength": 200
          },
          "input_tokens": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000,
            "description": "Uncached input tokens"
          },
          "output_tokens": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000,
            "description": "Output tokens"
          },
          "cached_tokens": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000,
            "description": "Cached input tokens (cache reads)"
          }
        },
        "required": [
          "model"
        ],
        "anyOf": [
          {
            "required": [
              "input_tokens"
            ]
          },
          {
            "required": [
              "output_tokens"
            ]
          },
          {
            "required": [
              "cached_tokens"
            ]
          }
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "LLM cost estimate",
          "price per million tokens",
          "token cost calculator",
          "how much will this prompt cost"
        ]
      }
    },
    {
      "name": "stackfacts_models_cheapest",
      "description": "Find the cheapest model with tools and 128k context, or any limits you set: ranks the 10 cheapest LLMs by blended price per million tokens.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "min_context": {
            "type": "integer",
            "minimum": 1,
            "description": "Minimum context window in tokens"
          },
          "tools": {
            "type": "boolean",
            "description": "Require tool calling"
          },
          "vision": {
            "type": "boolean",
            "description": "Require image input"
          },
          "max_usd_per_mtok": {
            "type": "number",
            "minimum": 0,
            "description": "Max blended USD per million tokens (3:1 input:output)"
          },
          "providers": {
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "items": {
              "type": "string",
              "maxLength": 40
            },
            "description": "Only these providers"
          },
          "include_deprecated": {
            "type": "boolean",
            "description": "Keep deprecated models (default false)"
          },
          "include_free": {
            "type": "boolean",
            "description": "Keep models priced 0/0 (default false)"
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "cheapest model with tools and 128k context",
          "cheapest LLM",
          "price per million tokens",
          "context window",
          "model comparison"
        ]
      }
    },
    {
      "name": "stackfacts_models_changes",
      "description": "List LLM models added, removed or changed (price per million tokens, context window, model deprecation date) since a snapshot_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "since": {
            "type": "string",
            "description": "meta.snapshot_id of an earlier models answer, e.g. models-20261009T060000Z-1a2b3c4d; kept for 30 snapshots",
            "pattern": "^models-\\d{8}T\\d{6}Z-[0-9a-f]{8}$",
            "maxLength": 64
          }
        },
        "required": [
          "since"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "LLM price changes",
          "model deprecation date",
          "new LLM models",
          "price per million tokens"
        ]
      }
    },
    {
      "name": "stackfacts_models_snapshot",
      "description": "Download the full signed LLM model catalogue (LiteLLM + models.dev, MIT): prices, limits and capabilities, with a verifiable manifest.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "LLM pricing dataset",
          "price per million tokens",
          "context window",
          "signed snapshot"
        ]
      }
    },
    {
      "name": "stackfacts_stack_check",
      "description": "Check dependencies, runtimes and OS versions in one call: OSV advisories for up to 50 package purls, EOL status for 50 product@version pairs, CISA KEV hits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "minItems": 0,
            "maxItems": 50,
            "description": "The versions to check, in order: \"product@version\" strings or {product, version} objects. Needed unless packages is sent",
            "items": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "product@version, e.g. nodejs@18.19.0 (GET /v1/eol/index lists products)",
                  "pattern": "^[^@]+@.+$",
                  "minLength": 3,
                  "maxLength": 401
                },
                {
                  "type": "object",
                  "properties": {
                    "product": {
                      "type": "string",
                      "description": "endoflife.date product id or alias, e.g. nodejs, python, ubuntu (GET /v1/eol/index lists them)",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "version": {
                      "type": "string",
                      "description": "Version string, e.g. 18.19.0 (send \"3.10\" as a string, not a number)",
                      "minLength": 1,
                      "maxLength": 200
                    }
                  },
                  "required": [
                    "product",
                    "version"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "cves": {
            "type": "array",
            "minItems": 0,
            "maxItems": 100,
            "items": {
              "type": "string",
              "description": "CVE id, e.g. CVE-2021-44228",
              "pattern": "^[Cc][Vv][Ee]-\\d{4}-\\d{4,}$",
              "maxLength": 32
            },
            "description": "Optional CVE ids to check against CISA KEV; duplicates are merged. Leave out (or send []) to check versions only"
          },
          "packages": {
            "type": "array",
            "minItems": 0,
            "maxItems": 50,
            "description": "Optional package URLs with versions, answered as POST /v1/osv/check answers them (advisories, fixed versions, KEV flag). Types: npm, pypi, golang, cargo, maven (nuget, gem and composer are answered as ecosystem_unavailable until imported)",
            "items": {
              "type": "string",
              "description": "purl with a version, e.g. pkg:npm/lodash@4.17.20 or pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1",
              "pattern": "^pkg:",
              "minLength": 7,
              "maxLength": 512
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "check my stack for end-of-life versions and exploited CVEs",
          "stack audit",
          "EOL, package vulnerabilities and KEV in one call",
          "is <product> <version> still supported",
          "dependency risk check",
          "known exploited vulnerabilities"
        ]
      }
    },
    {
      "name": "stackfacts_osv_check",
      "description": "Check dependencies for known vulnerabilities: up to 50 package purls (npm, PyPI, Go, crates.io, Maven) against OSV.dev, with fixed versions and CISA KEV flags.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "packages": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "description": "Package URLs with versions, in order. Types: npm, pypi, golang, cargo, maven (nuget, gem and composer are answered as ecosystem_unavailable until imported)",
            "items": {
              "type": "string",
              "description": "purl with a version, e.g. pkg:npm/lodash@4.17.20 or pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1",
              "pattern": "^pkg:",
              "minLength": 7,
              "maxLength": 512
            }
          }
        },
        "required": [
          "packages"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "check my dependencies for known vulnerabilities",
          "is <package> <version> vulnerable",
          "OSV",
          "purl",
          "npm PyPI Go crates.io Maven advisories",
          "GHSA",
          "fixed version",
          "known exploited vulnerabilities",
          "malicious package check"
        ]
      }
    },
    {
      "name": "stackfacts_preflight",
      "description": "Call before installing a package an LLM suggested: one npm, PyPI or purl version against OSV, CISA KEV and EOL data. Returns ok, warn or block with reasons.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "package": {
            "type": "string",
            "description": "Package URL with a version, e.g. pkg:npm/lodash@4.17.20 or pkg:pypi/jinja2@2.11.2. Types: npm, pypi, golang, cargo, maven (nuget, gem and composer are refused until imported). Send this, or ecosystem, name and version",
            "pattern": "^pkg:",
            "minLength": 7,
            "maxLength": 512
          },
          "ecosystem": {
            "type": "string",
            "description": "npm, pypi, golang, cargo or maven (with name and version, instead of package)",
            "maxLength": 200
          },
          "name": {
            "type": "string",
            "description": "Package name as the registry spells it, e.g. lodash, @babel/traverse, jinja2, org.apache.logging.log4j:log4j-core",
            "maxLength": 200
          },
          "version": {
            "type": "string",
            "description": "Exact version, e.g. 4.17.20",
            "maxLength": 200
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "call before installing a package an LLM suggested",
          "npm install check",
          "pip install check",
          "package preflight",
          "malicious package check",
          "known exploited vulnerabilities",
          "OSV",
          "purl"
        ]
      }
    },
    {
      "name": "stackfacts_cve_lookup",
      "description": "Get any CVE: its CISA KEV entry, if exploited, plus every OSV advisory aliased to it, with affected packages (purls), fixed versions and CVSS.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "CVE id, e.g. CVE-2021-44228",
            "pattern": "^[Cc][Vv][Ee]-\\d{4}-\\d{4,}$",
            "maxLength": 32
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "get a CVE",
          "CVE lookup",
          "CVE details",
          "CVE fixed version",
          "CVE affected packages",
          "CVSS score",
          "OSV",
          "CISA KEV"
        ]
      }
    },
    {
      "name": "stackfacts_stack_watch",
      "description": "Check dependencies, runtimes and OS versions for what changed since your last call: EOL passed or near, new OSV advisories, new CISA KEV hits. Returns a token.",
      "inputSchema": {
        "type": "object",
        "description": "Send either the stack (items, cves, packages, warn_days: starts a watch) or a token from the last answer (token, full: a re-check), not both",
        "properties": {
          "items": {
            "type": "array",
            "minItems": 0,
            "maxItems": 50,
            "description": "The versions to check, in order: \"product@version\" strings or {product, version} objects. Needed unless packages is sent",
            "items": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "product@version, e.g. nodejs@18.19.0 (GET /v1/eol/index lists products)",
                  "pattern": "^[^@]+@.+$",
                  "minLength": 3,
                  "maxLength": 401
                },
                {
                  "type": "object",
                  "properties": {
                    "product": {
                      "type": "string",
                      "description": "endoflife.date product id or alias, e.g. nodejs, python, ubuntu (GET /v1/eol/index lists them)",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "version": {
                      "type": "string",
                      "description": "Version string, e.g. 18.19.0 (send \"3.10\" as a string, not a number)",
                      "minLength": 1,
                      "maxLength": 200
                    }
                  },
                  "required": [
                    "product",
                    "version"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "cves": {
            "type": "array",
            "minItems": 0,
            "maxItems": 100,
            "items": {
              "type": "string",
              "description": "CVE id, e.g. CVE-2021-44228",
              "pattern": "^[Cc][Vv][Ee]-\\d{4}-\\d{4,}$",
              "maxLength": 32
            },
            "description": "Optional CVE ids to check against CISA KEV; duplicates are merged. Leave out (or send []) to check versions only"
          },
          "packages": {
            "type": "array",
            "minItems": 0,
            "maxItems": 50,
            "description": "Optional package URLs with versions, answered as POST /v1/osv/check answers them (advisories, fixed versions, KEV flag). Types: npm, pypi, golang, cargo, maven (nuget, gem and composer are answered as ecosystem_unavailable until imported)",
            "items": {
              "type": "string",
              "description": "purl with a version, e.g. pkg:npm/lodash@4.17.20 or pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1",
              "pattern": "^pkg:",
              "minLength": 7,
              "maxLength": 512
            }
          },
          "warn_days": {
            "type": "integer",
            "minimum": 0,
            "maximum": 365,
            "description": "Start only: report an item as due soon when its EOL date is this many days away or fewer (default 90, 0 = off). Kept in the token"
          },
          "token": {
            "type": "string",
            "description": "Re-check only: data.watch.token from your last answer. Nothing else with it but full. It holds your stack in readable form; keep it as you would the stack",
            "pattern": "^sfw1\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]{43}$",
            "maxLength": 48000
          },
          "full": {
            "type": "boolean",
            "description": "Re-check only: also return data.check, the full current stack answer, at the same price (default false)"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "watch my stack for end-of-life and new exploited CVEs",
          "Use when you need to know what changed in a stack since your last check",
          "stack monitor",
          "dependency monitor",
          "what changed since my last check",
          "alert when a version reaches end of life",
          "new vulnerabilities in my packages"
        ]
      }
    },
    {
      "name": "stackfacts_preview",
      "description": "Preview a dataset for free: sample end-of-life products, the newest CISA KEV entries or LLM prices, signed like the paid answers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "Dataset: eol (software end-of-life), kev (CISA known exploited vulnerabilities) or models (LLM prices)",
            "enum": [
              "eol",
              "kev",
              "models"
            ]
          }
        },
        "required": [
          "dataset"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "free sample",
          "end-of-life dates",
          "CISA KEV",
          "price per million tokens"
        ]
      }
    },
    {
      "name": "stackfacts_try",
      "description": "Try a paid answer for free on a fixed example: nodejs end-of-life cycles, CVE-2021-44228 in CISA KEV, or openai/gpt-4o prices.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "Dataset: eol (software end-of-life), kev (CISA known exploited vulnerabilities) or models (LLM prices)",
            "enum": [
              "eol",
              "kev",
              "models"
            ]
          }
        },
        "required": [
          "dataset"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "free example",
          "try before paying",
          "check if a CVE is actively exploited (CISA KEV)"
        ]
      }
    },
    {
      "name": "stackfacts_index",
      "description": "List the valid ids for free: end-of-life product names and aliases, or LLM provider/model ids, so a paid call never misses.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "eol (product ids and aliases) or models (provider/model ids)",
            "enum": [
              "eol",
              "models"
            ]
          }
        },
        "required": [
          "dataset"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "product list",
          "model list",
          "valid ids",
          "aliases"
        ]
      }
    },
    {
      "name": "stackfacts_validate",
      "description": "Validate an id for free before paying: whether a product, product/cycle or provider/model exists, or a CVE id is well formed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "Dataset: eol (software end-of-life), kev (CISA known exploited vulnerabilities) or models (LLM prices)",
            "enum": [
              "eol",
              "kev",
              "models"
            ]
          },
          "id": {
            "type": "string",
            "description": "Id to check: nodejs, nodejs/22, CVE-2021-44228 or openai/gpt-4o",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "dataset",
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "validate id",
          "check before paying",
          "product exists"
        ]
      }
    },
    {
      "name": "stackfacts_manifest",
      "description": "Get the signed manifest of a dataset's latest snapshot for free: snapshot_id, sha256, record count, source, licence and signature.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": "string",
            "description": "Dataset: eol (software end-of-life), kev (CISA known exploited vulnerabilities) or models (LLM prices)",
            "enum": [
              "eol",
              "kev",
              "models"
            ]
          }
        },
        "required": [
          "dataset"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "signed manifest",
          "snapshot_id",
          "data freshness",
          "provenance"
        ]
      }
    },
    {
      "name": "stackfacts_keys",
      "description": "Get the Ed25519 public keys (JWK) that verify the signature on every answer and snapshot manifest.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "stackfacts/keywords": [
          "public key",
          "verify signature",
          "JWKS",
          "Ed25519"
        ]
      }
    }
  ],
  "resources": [],
  "prompts": []
}
