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
- 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.
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
- 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.
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
- ToolTransform has duplicate target name {target!r}: both {se
- Cannot resolve tool reference: {fn!r}
- Cannot determine tool name for {fn!r}
- File {name!r} not found. Available: {available}
- File {f.get('name', '?')!r} exceeds max size ({_format_size(
AI-assisted analysis of PrefectHQ/fastmcp@1f02114297 (2026-08-29).
Data as JSON: /api/errors/825846dbb4f0713f.
Report an issue: GitHub.