PrefectHQ/fastmcp · error
Cannot specify both 'hide=True' and 'required=True'. Hidden
Error message
Cannot specify both 'hide=True' and 'required=True'. Hidden parameters cannot be required since clients cannot provide them.
What it means
ArgTransform rejects hide=True together with required=True: a hidden parameter is removed from the transformed schema, so clients can never provide it, making a 'required hidden' parameter impossible. __post_init__ raises ValueError.
Source
Thrown at fastmcp_slim/fastmcp/tools/tool_transform.py:207
"Cannot specify both 'default' and 'default_factory' in ArgTransform. "
"Use either 'default' for a static value or 'default_factory' for a callable."
)
if has_factory and not self.hide:
raise ValueError(
"default_factory can only be used with hide=True. "
"Visible parameters must use static 'default' values since JSON schema "
"cannot represent dynamic factories."
)
if self.required is True and (has_default or has_factory):
raise ValueError(
"Cannot specify 'required=True' with 'default' or 'default_factory'. "
"Required parameters cannot have defaults."
)
if self.hide and self.required is True:
raise ValueError(
"Cannot specify both 'hide=True' and 'required=True'. "
"Hidden parameters cannot be required since clients cannot provide them."
)
if self.required is False:
raise ValueError(
"Cannot specify 'required=False'. Set a default value instead."
)
class ArgTransformConfig(FastMCPBaseModel):
"""A model for requesting a single argument transform."""
name: str | None = Field(default=None, description="The new name for the argument.")
description: str | None = Field(
default=None, description="The new description for the argument."
)
default: str | int | float | bool | None = Field(View on GitHub (pinned to 1f02114297)
Solutions
- Remove required=True and provide default= or default_factory= along with hide=True.
- If the client must supply the value, don't hide it (remove hide=True).
- Supply the value in the replacement function body instead of declaring it required.
Example fix
// before ArgTransform(name="secret", hide=True, required=True) // after ArgTransform(name="secret", hide=True, default="from-env")
Defensive patterns
Strategy: validation
Validate before calling
def check_hidden_required(t: ArgTransform) -> None:
if t.hide and t.required is True:
raise ValueError("Hidden params cannot be required") Try / catch
try:
t = ArgTransform(hide=True, required=True)
except ValueError:
t = ArgTransform(hide=True, default="injected-value") Prevention
- Hidden params always need a default or default_factory — plan for it when hiding.
- If clients must supply the value, it cannot be hidden.
- Audit hide=True transforms against the parent tool's required params.
When it happens
Trigger: ArgTransform(hide=True, required=True).
Common situations: Hiding an internal/credential parameter that the parent tool marks as required, without realizing the transform must supply a default instead.
Related errors
- Cannot specify both 'default' and 'default_factory' in ArgTr
- default_factory can only be used with hide=True. Visible par
- Cannot specify 'required=True' with 'default' or 'default_fa
- Cannot specify 'required=False'. Set a default value instead
- Unknown arguments in transform_args: {', '.join(sorted(unkno
AI-assisted analysis of PrefectHQ/fastmcp@1f02114297 (2026-08-29).
Data as JSON: /api/errors/94f4bb734dfb1668.
Report an issue: GitHub.