adapter_status ) { return; } if ( ! $this->has_any_enabled_server() ) { $this->adapter_status = 'disabled'; return; } if ( ! class_exists( '\WP\MCP\Plugin' ) ) { $this->adapter_status = 'not-found'; return; } try { add_action( 'mcp_adapter_init', array( $this, 'register_database_servers' ), 11 ); \WP\MCP\Plugin::instance(); $this->adapter_status = 'running'; } catch ( \Throwable $e ) { $this->adapter_status = 'error'; if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { do_action( 'acrossai_mcp_manager_adapter_init_error', $e ); } } } /** * Register enabled database-sourced MCP servers with the adapter. * * Hooked on `mcp_adapter_init` (priority 11 — after DefaultServerFactory). * Each enabled row where `registered_from = 'database'` gets its own MCP * server instance via `$adapter->create_server()`. * * @param \WP\MCP\Core\McpAdapter $adapter The MCP Adapter singleton * instance passed by the action. */ public function register_database_servers( $adapter ): void { $servers = $this->get_enabled_database_servers(); if ( empty( $servers ) ) { return; } foreach ( $servers as $server ) { $slug = (string) $server->server_slug; if ( '' === $slug ) { continue; } $namespace = '' !== $server->server_route_namespace ? $server->server_route_namespace : 'mcp'; $route = '' !== $server->server_route ? $server->server_route : $slug; $version = '' !== $server->server_version ? $server->server_version : 'v1.0.0'; $result = $adapter->create_server( $slug, $namespace, $route, $server->server_name, $server->description, $version, array( HttpTransport::class ), ErrorLogMcpErrorHandler::class, NullMcpObservabilityHandler::class, array( 'mcp-adapter/discover-abilities', 'mcp-adapter/get-ability-info', 'mcp-adapter/execute-ability', ), array(), array() ); if ( is_wp_error( $result ) ) { _doing_it_wrong( __METHOD__, esc_html( sprintf( /* translators: 1: server slug, 2: error message, 3: error code */ 'AcrossAI MCP Manager: Failed to create database server "%1$s". Error: %2$s (Code: %3$s)', $slug, (string) $result->get_error_message(), (string) $result->get_error_code() ) ), '0.0.1' ); } } } /** * Return the current adapter status string. If `initialize_adapter()` * hasn't run yet, run it lazily so callers always see the up-to-date * state derived from the current DB contents. */ public function get_adapter_status(): string { if ( null === $this->adapter_status ) { $this->initialize_adapter(); } return $this->adapter_status ?? 'unknown'; } /** * Fast-path check for "is at least one server row enabled". Uses the * BerlinDB-style Query with `number => 1` so the SQL uses `LIMIT 1` * rather than scanning the full table. */ private function has_any_enabled_server(): bool { $rows = MCPServerQuery::instance()->query( array( 'is_enabled' => 1, 'number' => 1, ) ); return ! empty( $rows ); } /** * Return all enabled server rows whose `registered_from = 'database'`. * Used by `register_database_servers` — plugin-registered rows are handled * by the adapter's DefaultServerFactory on priority 10. * * @return array */ private function get_enabled_database_servers(): array { return MCPServerQuery::instance()->query( array( 'is_enabled' => 1, 'registered_from' => 'database', ) ); } }