Skip to content

Abilities API: callbacks crash with ArgumentCountError when input_schema is empty #76

@sabiertas

Description

@sabiertas

Description

WindPress registers several abilities (e.g., windpress/get-config, windpress/get-volume-entries, windpress/get-volume-handlers) with 'input_schema' => [] (empty array).

The WordPress Abilities API (WP_Ability::invoke_callback() in wp-includes/abilities-api/class-wp-ability.php, lines 505-512) checks:

if ( ! empty( $this->get_input_schema() ) ) {
    $args[] = $input;
}
return $callback( ...$args );

When input_schema is empty, no argument is passed to the callback. But WindPress ability classes declare $input as a required parameter without a default value:

// windpress/src/Abilities/Abilities/GetConfig.php:35
public static function execute($input): array

This causes:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function
WindPress\WindPress\Abilities\Abilities\GetConfig::execute(),
0 passed in .../class-wp-ability.php on line 511 and exactly 1 expected

Affected abilities

All abilities registered without input_schema (or with 'input_schema' => []):

  • windpress/get-config (Loader.php:175)
  • windpress/get-volume-entries (Loader.php:218)
  • windpress/get-volume-handlers (Loader.php:336)

Steps to reproduce

$ability = wp_get_ability('windpress/get-config');
$result = $ability->execute(null); // Crashes with ArgumentCountError

Or via WP-CLI:

wp eval "\$a = wp_get_ability('windpress/get-config'); var_dump(\$a->execute(null));" --user=1

Suggested fix

Option A — Add default value to all ability callback signatures:

- public static function execute($input): array
+ public static function execute($input = []): array

This applies to: GetConfig.php, GetVolumeEntries.php, GetVolumeHandlers.php, GetVolumeEntry.php, SaveVolumeEntry.php, SaveVolumeEntries.php, DeleteVolumeEntry.php, ResetVolumeEntry.php.

Option B — Register abilities that don't need input with a proper empty JSON Schema object instead of an empty array:

- 'input_schema' => [],
+ 'input_schema' => ['type' => 'object', 'properties' => new \stdClass()],

Option A is the minimal fix. Option B is more correct per JSON Schema spec.

Environment

  • WordPress: 6.9.3
  • WindPress: latest (installed from wp.org)
  • MCP Adapter: 0.4.1
  • PHP: 8.3

Context

Discovered while building an AI assistant that auto-discovers WordPress abilities via wp_get_abilities() and exposes them as tools. The core abilities (core/get-site-info, core/get-user-info, core/get-environment-info) work correctly — their callbacks use $input = array() as default.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions