'LIT MCP', 'description' => 'Website-Pflege für WordPress, Divi und Pods über MCP.', ]); } public function registerAbilities(): void { foreach ($this->registry->abilities() as $ability) { wp_register_ability($ability->name(), $this->argsFor($ability)); } } /** @return array */ public function argsFor(Ability $ability): array { $args = [ 'label' => $ability->label(), 'description' => $ability->description(), 'category' => self::CATEGORY, 'input_schema' => $ability->inputSchema(), 'permission_callback' => static function (mixed $input = null) use ($ability): bool|WP_Error { if (! Access::currentUserMayUse()) { return Errors::forbidden('Dein Benutzerkonto ist für LIT MCP nicht freigegeben.'); } if (! RequestContext::isOAuthServerRequest()) { return Errors::forbidden('LIT MCP ist nur über den OAuth-geschützten MCP-Server nutzbar.'); } try { return $ability->permission(is_array($input) ? $input : []); } catch (Throwable $e) { $message = sprintf('[wp-lit-mcp] %s failed: %s', $ability->name(), $e); error_log($message); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log return Errors::internal(); } }, 'execute_callback' => static function (mixed $input = null) use ($ability): mixed { try { return $ability->execute(is_array($input) ? $input : []); } catch (WriteFailed $e) { $message = sprintf('[wp-lit-mcp] %s failed: %s', $ability->name(), $e); error_log($message); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log return $e->toError(); } catch (Throwable $e) { $message = sprintf('[wp-lit-mcp] %s failed: %s', $ability->name(), $e); error_log($message); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log return Errors::internal(); } }, 'meta' => [ 'annotations' => $ability->annotations(), 'show_in_rest' => false, 'mcp' => ['public' => true, 'type' => 'tool'], ], ]; $output = $ability->outputSchema(); if ($output !== null) { $args['output_schema'] = $output; } return $args; } }