{"record":{"id":"825846dbb4f0713f","repo":"PrefectHQ/fastmcp","slug":"at-least-one-of-version-gte-or-version-lt-must-be","errorCode":null,"errorMessage":"At least one of version_gte or version_lt must be specified","messagePattern":"At least one of version_gte or version_lt must be specified","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/transforms/version_filter.py","lineNumber":58,"sourceCode":"\n    Works with any version string - PEP 440 (1.0, 2.0) or dates (2025-01-01).\n\n    Args:\n        version_gte: Versions >= this value pass through.\n        version_lt: Versions < this value pass through.\n        include_unversioned: Whether unversioned components (``version=None``)\n            should pass through the filter. Defaults to True.\n    \"\"\"\n\n    def __init__(\n        self,\n        *,\n        version_gte: str | None = None,\n        version_lt: str | None = None,\n        include_unversioned: bool = True,\n    ) -> None:\n        if version_gte is None and version_lt is None:\n            raise ValueError(\n                \"At least one of version_gte or version_lt must be specified\"\n            )\n        self.version_gte = version_gte\n        self.version_lt = version_lt\n        self.include_unversioned = include_unversioned\n        self._spec = VersionSpec(gte=version_gte, lt=version_lt)\n\n    def __repr__(self) -> str:\n        parts = []\n        if self.version_gte:\n            parts.append(f\"version_gte={self.version_gte!r}\")\n        if self.version_lt:\n            parts.append(f\"version_lt={self.version_lt!r}\")\n        if not self.include_unversioned:\n            parts.append(\"include_unversioned=False\")\n        return f\"VersionFilter({', '.join(parts)})\"\n\n    # -------------------------------------------------------------------------","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/transforms/version_filter.py#L40-L76","documentation":"VersionFilter is a tool/component filter that includes components based on a client-reported version range. A range needs at least one bound: `version_gte` (include versions >= this) and/or `version_lt` (include versions < this). Constructing it with both None would include everything or nothing, so the constructor raises ValueError to force an explicit range.","triggerScenarios":"`VersionFilter()` with neither keyword argument supplied, or passing explicit `version_gte=None, version_lt=None`.","commonSituations":"Building the filter from config/CLI flags where neither flag was parsed; copying a filter snippet and deleting both bounds; conditional construction logic that ends up not setting either bound.","solutions":["Pass `version_gte=\"...\"` to include only versions at or above a bound.","Pass `version_lt=\"...\"` to include only versions below a bound.","Pass both to define a bounded range, e.g. `VersionFilter(version_gte=\"2.0\", version_lt=\"3.0\")`.","If you truly want no filtering, don't attach a VersionFilter at all."],"exampleFix":"# before\nflt = VersionFilter()  # no bounds\n# after\nflt = VersionFilter(version_gte=\"2.0\", version_lt=\"3.0\")","handlingStrategy":"validation","validationCode":"def safe_version_filter(version_gte=None, version_lt=None, **kw):\n    if version_gte is None and version_lt is None:\n        raise ValueError(\"Provide version_gte and/or version_lt\")\n    return VersionFilter(version_gte=version_gte, version_lt=version_lt, **kw)","typeGuard":null,"tryCatchPattern":"try:\n    flt = VersionFilter(version_gte=cfg.get(\"gte\"), version_lt=cfg.get(\"lt\"))\nexcept ValueError:\n    flt = VersionFilter(version_gte=\"0.0.0\")  # explicit fallback range","preventionTips":["Never construct VersionFilter with all-None bounds; skip attaching it instead.","Validate config keys before passing them as bounds.","Add a unit test that every filter in your server config has at least one bound."],"tags":["python","valueerror","version-filter","missing-argument","config"],"backgroundTag":"missing-required-parameter","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}