PrefectHQ/fastmcp · error

Hidden parameter '{old_name}' has no default value in parent

Error message

Hidden parameter '{old_name}' has no default value in parent tool and no default or default_factory provided in ArgTransform. Either provide a default or default_factory in ArgTransform or don't hide required parameters.

What it means

When _create_forwarding_transform hides a parameter, that parameter can never be supplied by clients, so it needs a value at call time. If the parent tool marks it required and the ArgTransform supplies neither default nor default_factory, there is no way to fill it, so ValueError is raised explaining the options.

Source

Thrown at fastmcp_slim/fastmcp/tools/tool_transform.py:675

        hidden_defaults = {}  # Track hidden parameters with constant values

        for old_name, old_schema in parent_props.items():
            # Check if parameter is in transform_args
            if transform_args and old_name in transform_args:
                transform = transform_args[old_name]
            else:
                # Default behavior - pass through (no transformation)
                transform = ArgTransform()  # Default ArgTransform with no changes

            # Handle hidden parameters with defaults
            if transform.hide:
                # Validate that hidden parameters without user defaults have parent defaults
                has_user_default = (
                    transform.default is not NotSet
                    or transform.default_factory is not NotSet
                )
                if not has_user_default and old_name in parent_required:
                    raise ValueError(
                        f"Hidden parameter '{old_name}' has no default value in parent tool "
                        f"and no default or default_factory provided in ArgTransform. Either provide a default "
                        f"or default_factory in ArgTransform or don't hide required parameters."
                    )
                if has_user_default:
                    # Store info for later factory calling or direct value
                    hidden_defaults[old_name] = transform
                # Skip adding to schema (not exposed to clients)
                continue

            transform_result = cls._apply_single_transform(
                old_name,
                old_schema,
                transform,
                old_name in parent_required,
            )

            if transform_result:

View on GitHub (pinned to 1f02114297)

Solutions

  1. Provide default=<static value> (or default_factory=<callable>) in the ArgTransform alongside hide=True.
  2. Read the value from config/env when building the transform: ArgTransform(hide=True, default=os.environ["API_KEY"]).
  3. Don't hide the parameter if clients should supply it.
  4. Supply it inside the replacement function via forward_raw if the value is computed at call time.

Example fix

// before
ArgTransform(name="api_key", hide=True)  # parent requires api_key

// after
ArgTransform(name="api_key", hide=True, default_factory=lambda: os.environ["API_KEY"])
Defensive patterns

Strategy: validation

Validate before calling

def check_hidden_has_value(tool, transform_args: dict) -> None:
    required = set(tool.parameters.get("required", []))
    for name, t in transform_args.items():
        if t.hide and name in required and t.default is NotSet and t.default_factory is NotSet:
            raise ValueError(f"Hidden required param '{name}' needs default or default_factory")

Try / catch

try:
    t = ParentTool.from_tool(tool, transform_args=ta)
except ValueError as e:
    if "has no default value" in str(e):
        log.error("Provide default/default_factory for hidden required params: %s", e)
    raise

Prevention

When it happens

Trigger: ArgTransform(hide=True) on a parameter listed in the parent tool's required properties, without default= or default_factory=.

Common situations: Hiding a required API-key/token param from the exposed schema but forgetting to inject its value; hiding required params after a parent tool change made them required.

Related errors


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