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

  1. Remove required=True and provide default= or default_factory= along with hide=True.
  2. If the client must supply the value, don't hide it (remove hide=True).
  3. 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

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


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