'object', 'properties' => $props ?: new \stdClass()]; if ($required) $schema['required'] = $required; return ['name' => $name, 'description' => $desc, 'scope' => $scope, 'handler' => 'AskTamMCP\\Extensions\\Batch59::' . $method, 'inputSchema' => $schema]; }; $registry->register($def('fluentsmtp_detect', 'Report whether FluentSMTP is active and its version.', [], [], 'read', 'detect')); $registry->register($def('fluentsmtp_list_connections', 'List configured FluentSMTP sender connections (provider, sender name/email, host/port/encryption). Credentials are redacted.', [], [], 'read', 'listConnections')); $registry->register($def('fluentsmtp_list_logs', 'List recent FluentSMTP email-log rows (id, to, subject, status, source, time). Body is not returned. Optionally filter by status (sent/failed/resent).', ['status' => ['type' => 'string'], 'per_page' => ['type' => 'integer', 'default' => 50]], [], 'read', 'listLogs')); $registry->register($def('fluentsmtp_stats', 'FluentSMTP email counts grouped by status, plus total.', [], [], 'read', 'stats')); $registry->register($def('fluentsmtp_send_test', 'Send a test email through the active FluentSMTP connection (routes via wp_mail). Returns whether wp_mail accepted it.', ['to' => ['type' => 'string'], 'subject' => ['type' => 'string'], 'body' => ['type' => 'string']], ['to'], 'write', 'sendTest')); } public static function detect(array $args): array { return ['active' => defined('FLUENTMAIL_PLUGIN_VERSION'), 'version' => defined('FLUENTMAIL_PLUGIN_VERSION') ? FLUENTMAIL_PLUGIN_VERSION : null]; } private static function logTable(): string { global $wpdb; return $wpdb->prefix . 'fsmpt_email_logs'; } private static function hasLog(): bool { global $wpdb; $t = self::logTable(); return $wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $t)) === $t; } public static function listConnections(array $args): array { $s = get_option('fluentmail-settings'); if (!is_array($s) || empty($s['connections']) || !is_array($s['connections'])) { return ['supported' => false, 'note' => 'No FluentSMTP connections configured.', 'connections' => []]; } $maps = (isset($s['mappings']) && is_array($s['mappings'])) ? $s['mappings'] : []; $byKey = []; foreach ($maps as $email => $key) { $byKey[$key][] = $email; } $out = []; foreach ($s['connections'] as $key => $c) { $ps = (is_array($c) && isset($c['provider_settings']) && is_array($c['provider_settings'])) ? $c['provider_settings'] : []; $out[] = [ 'id' => $key, 'title' => is_array($c) ? ($c['title'] ?? '') : '', 'provider' => $ps['provider'] ?? '', 'sender_name' => $ps['sender_name'] ?? '', 'sender_email' => $ps['sender_email'] ?? '', 'host' => $ps['host'] ?? '', 'port' => $ps['port'] ?? '', 'encryption' => $ps['encryption'] ?? '', 'maps_from' => $byKey[$key] ?? [], ]; } return ['supported' => true, 'count' => count($out), 'connections' => $out]; } public static function listLogs(array $args): array { global $wpdb; if (!self::hasLog()) return ['supported' => false, 'note' => 'fsmpt_email_logs table not found (logging may be off).', 'logs' => []]; $t = self::logTable(); $per = max(1, min(500, (int) ($args['per_page'] ?? 50))); $where = ''; if (!empty($args['status'])) $where = $wpdb->prepare('WHERE status = %s', (string) $args['status']); $rows = $wpdb->get_results("SELECT id, `to`, subject, status, source, retries, created_at FROM `{$t}` {$where} ORDER BY id DESC LIMIT {$per}", ARRAY_A); $out = []; foreach ((array) $rows as $r) { $to = $r['to']; $dec = json_decode($to, true); if (is_array($dec)) $to = implode(', ', array_map(function ($x) { return is_array($x) ? ($x['email'] ?? reset($x)) : $x; }, $dec)); $out[] = ['id' => (int) $r['id'], 'to' => $to, 'subject' => $r['subject'], 'status' => $r['status'], 'source' => $r['source'], 'retries' => (int) $r['retries'], 'created_at' => $r['created_at']]; } return ['supported' => true, 'count' => count($out), 'logs' => $out]; } public static function stats(array $args): array { global $wpdb; if (!self::hasLog()) return ['supported' => false, 'note' => 'fsmpt_email_logs table not found (logging may be off).', 'by_status' => [], 'total' => 0]; $t = self::logTable(); $rows = $wpdb->get_results("SELECT status, COUNT(*) AS c FROM `{$t}` GROUP BY status", ARRAY_A); $by = []; $total = 0; foreach ((array) $rows as $r) { $by[$r['status']] = (int) $r['c']; $total += (int) $r['c']; } return ['supported' => true, 'by_status' => $by, 'total' => $total]; } public static function sendTest(array $args): array { $to = isset($args['to']) ? sanitize_email((string) $args['to']) : ''; if (!$to || !is_email($to)) return ['sent' => false, 'error' => 'A valid "to" email address is required.']; $subject = isset($args['subject']) && $args['subject'] !== '' ? (string) $args['subject'] : 'FluentSMTP test — Advanced MCP'; $body = isset($args['body']) && $args['body'] !== '' ? (string) $args['body'] : 'This is a test email sent via FluentSMTP by the Advanced MCP plugin.'; $sent = wp_mail($to, $subject, $body); return ['sent' => (bool) $sent, 'to' => $to, 'subject' => $subject, 'note' => $sent ? 'wp_mail accepted the message (routed through FluentSMTP). Check fluentsmtp_list_logs for delivery status.' : 'wp_mail returned false.']; } }