PrefectHQ/fastmcp · error

At least one of version_gte or version_lt must be specified

Error message

At least one of version_gte or version_lt must be specified

What it means

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.

Source

Thrown at fastmcp_slim/fastmcp/server/transforms/version_filter.py:58

    Works with any version string - PEP 440 (1.0, 2.0) or dates (2025-01-01).

    Args:
        version_gte: Versions >= this value pass through.
        version_lt: Versions < this value pass through.
        include_unversioned: Whether unversioned components (``version=None``)
            should pass through the filter. Defaults to True.
    """

    def __init__(
        self,
        *,
        version_gte: str | None = None,
        version_lt: str | None = None,
        include_unversioned: bool = True,
    ) -> None:
        if version_gte is None and version_lt is None:
            raise ValueError(
                "At least one of version_gte or version_lt must be specified"
            )
        self.version_gte = version_gte
        self.version_lt = version_lt
        self.include_unversioned = include_unversioned
        self._spec = VersionSpec(gte=version_gte, lt=version_lt)

    def __repr__(self) -> str:
        parts = []
        if self.version_gte:
            parts.append(f"version_gte={self.version_gte!r}")
        if self.version_lt:
            parts.append(f"version_lt={self.version_lt!r}")
        if not self.include_unversioned:
            parts.append("include_unversioned=False")
        return f"VersionFilter({', '.join(parts)})"

    # -------------------------------------------------------------------------

View on GitHub (pinned to 1f02114297)

Solutions

  1. Pass `version_gte="..."` to include only versions at or above a bound.
  2. Pass `version_lt="..."` to include only versions below a bound.
  3. Pass both to define a bounded range, e.g. `VersionFilter(version_gte="2.0", version_lt="3.0")`.
  4. If you truly want no filtering, don't attach a VersionFilter at all.

Example fix

# before
flt = VersionFilter()  # no bounds
# after
flt = VersionFilter(version_gte="2.0", version_lt="3.0")
Defensive patterns

Strategy: validation

Validate before calling

def safe_version_filter(version_gte=None, version_lt=None, **kw):
    if version_gte is None and version_lt is None:
        raise ValueError("Provide version_gte and/or version_lt")
    return VersionFilter(version_gte=version_gte, version_lt=version_lt, **kw)

Try / catch

try:
    flt = VersionFilter(version_gte=cfg.get("gte"), version_lt=cfg.get("lt"))
except ValueError:
    flt = VersionFilter(version_gte="0.0.0")  # explicit fallback range

Prevention

When it happens

Trigger: `VersionFilter()` with neither keyword argument supplied, or passing explicit `version_gte=None, version_lt=None`.

Common situations: 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.

Understand the failure class

Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.

Related errors


AI-assisted analysis of PrefectHQ/fastmcp@1f02114297 (2026-08-29). Data as JSON: /api/errors/825846dbb4f0713f. Report an issue: GitHub.