HandL AI Connector Access Control
Know when your WordPress plugins use AI. See activity. Control access. Track estimated spend. Avoid surprise AI bills See estimated spend by plugin. Add your own provider rates. Estimates are not bills. This plugin does not sell AI usage or add AI charges. Your AI provider controls actual billing. What it does Shows which plugin made each AI Client request. Shows whether each request was allowed or blocked. Shows the AI task, provider, model, tokens, and estimated spend. Lets you allow or deny each plugin. Lets you control text, image, speech, and video separately. Includes Learn mode so you can watch first. Includes Emergency stop for urgent shutdowns. Who it is for WordPress site owners. WordPress administrators. Multisite teams that manage rules one site at a time. No developer experience is required. How it works Install the plugin. Open Settings → HandL AI Connector Access Control. Turn on Learn mode. Review Activity. Add rules after you know which plugins need AI. Everyday controls Plugin rules: Allow, deny, or use the site default. Temporary allow: Optional expiry on Allow rules (auto-reverts to the site default). AI type rules: Control text, image, speech, and video separately. Learn mode: Record activity without enforcing deny rules. Emergency stop: Block AI Client calls across the site. Blocked AI tools: Stop prompts that offer blocked tools. Role gate: Choose which WordPress roles may start AI operations. More controls Denial alerts: Get an optional email when a request is blocked. Weekly report: Review activity, denials, and estimated spend by email. Estimated spend: Use token counts and your provider rates. Plugin AI profile: Open a plugin from Activity or Dashboard estimated spend to see its usage, incidents, estimated spend alerts, and current rules in one read-only view. Rule changes and CSV exports stay on their existing screens. Rules transfer: Export or import rules as JSON. Activity limits: Control how many entries are saved and for how long. Audit report: Print a governance summary (rules + activity) as PDF from your browser. Multisite overview: View status and activity for each site. WP-CLI: List and update AI type rules from the command line. Important limits AI Client calls are allowed by default until you change a rule. This plugin governs calls made through the WordPress AI Client. Version 1.2.0 can observe some direct AI connections. It does not block them. The known-provider list is not complete. Caller identification is best effort. Experimental model force is not a spending guarantee. Activity may be empty when WordPress disables AI site-wide. Privacy Activity stays on your WordPress site by default. Logging, denial alerts, and webhooks are optional. The weekly report is selected by default. It sends only while logging or Learn mode is on. See Privacy / Data below for every stored or transmitted field. Privacy / Data By default, this plugin does not send data to HandL Digital. Features that send data outside your site are optional and require an explicit setting or onboarding choice. The weekly report uses your site’s configured email system and runs only while logging or Learn mode is on. If you enable recent-call logging in Settings → HandL AI Connector Access Control, it stores a local log in the WordPress options table containing: Timestamp Allow/deny decision (AI Client rows) or observe (direct-HTTP AI observations) AI Client operation (e.g. generate_text, is_supported_for_text_generation) — or direct_http for shadow observations Capability family (text / image / speech / tts / video / unknown) for AI Client rows Provider and model when set on the prompt builder (or model preferences) In learn mode: whether a configured model pin matched, and the provider/model you pinned Truncated prompt preview and selected generation config (best-effort; AI Client rows only) Input and output token counts when the AI Client completes a generation (best-effort) Best-effort calling plugin (plugin basename) and source file Current user id and display name Initiating WordPress role slug(s) when a user context exists (role gate / audit; no usernames beyond display name already listed) Full request URI (including query string, kept only on this site) for AI Client admin-request context For direct-HTTP AI observations only: request host and path (query string stripped). No request body, no Authorization headers, no API keys. Channel label direct_http and matched provider id when known. Logs are kept as a single shared entry-based ring buffer (default 200 entries, configurable 20–1000) for both AI Client rows and direct-HTTP AI observations. An optional maximum log age (days) setting also drops rows older than the threshold on the next read or append; when both the count cap and the time-based TTL apply, the stricter limit wins. Leave maximum age empty for entry-count-only retention. Repeated direct-HTTP calls from the same attributed plugin + host (or the same unattributed file + host) that stay active within ~5 minutes of idle time are collapsed into one row whose count is the number of HTTP calls (same unit as AI Client rows). Active clusters move to the newest slot so a chatty bypass does not erase the rest of the log, and the log does not drop the chatty cluster ahead of idle rows. If you set an estimated spend alert threshold (Activity → Estimated spend alerts), the plugin may send a message via WordPress wp_mail when the retained log’s estimated total first crosses that amount (site-wide or per-plugin). The email includes the threshold, current estimated total, dated log window, and (for per-plugin alerts) the plugin name. It states that the figure is estimated (token × rate placeholder), not billing. No prompt text or user identity is included. Empty thresholds never send mail. Delivery failures are contained and never change allow/deny. If you enable denial email alerts, the plugin sends a message via WordPress wp_mail when enforcement blocks a prompt (immediate rate-limited mail, or an hourly digest). The recipient is the address you configure, or the site admin_email if left empty — that may be any address you enter, and mail is delivered through whatever transport your site uses (core PHP mail or an SMTP / transactional-mail plugin). Alert messages include: Timestamp Calling plugin (best-effort basename) AI Client operation and capability family Denial reason and any matched blocked tools Provider and model when known (may be labeled inferred) Request path only (query string is stripped before mail; full URI stays in the local log if logging is enabled) Alert mail does not include prompt preview or user identity. Digest rows waiting to send are stored in a local options queue (path-only URI) and are removed when alerts are turned off or the plugin is uninstalled. If you enable shadow-AI email alerts (Activity tab; off by default), the plugin sends a message via WordPress wp_mail the first time a given attributed plugin+host (or unattributed file+host) pair appears as a direct_http observe row in the retained log window — immediate rate-limited mail, or the same hourly digest queue, using the same recipient and mode as denial alerts. Messages are explicitly labeled observe / not blocked and include: Timestamp Best-effort calling plugin, file, or method Request host Path only (query string stripped — same redaction as denial alerts) Shadow-AI alerts do not block HTTP and are not posted to the webhook. They require logging or learn mode, and are suppressed when AI is disabled site-wide via wp_supports_ai. Chatty-cluster collapse (~5 minutes idle) and the retained-window pair check prevent duplicate alerts for the same pair. If you also set a Webhook URL (Activity → denial alert settings), the plugin POSTs a generic JSON body with the same fields as the denial email alert to that http(s) URL whenever a denial alert would fire (same alert_on_deny gate, rate limit, and immediate/digest mode — not a separate toggle). Delivery uses WordPress wp_remote_post (timeouts/non-2xx are contained like wp_mail failures and never change allow/deny). The URL is an intentional admin-supplied outbound integration (same trust model as the alert recipient). Empty URL means no webhook POST is attempted. A Send test webhook control posts a sample payload clearly labeled as a test (bypasses rate limiting). Weekly report email and shadow-AI observe alerts are not sent to the webhook in this release. If you enable the weekly report email (Activity tab), the plugin sends one message per week via WordPress wp_mail with Dashboard-style aggregates from the retained local log. This is the first surface where retained log data can leave the WordPress site (through your site’s mail transport into an inbox). The weekly report includes only: Dated window from the oldest and newest retained log timestamps (self-dating so a late WP-cron send stays honest) Coverage call counts (through the AI Client vs outside — not governed by these rules) Deny count in the retained window; default policy and learn-mode / kill-switch state labels Estimated spend total and top plugins by estimated $ (token × rate placeholders — not billing) Pin-hold counts when experimental force rules are configured Plugin display names (or basenames) for top estimated-spend rows Weekly report mail does not include prompt preview, user identity, request paths, hosts, denial reason detail rows, or any per-call URI. Recipient is the same address as denial alerts (or site admin_email if empty). Every email includes a link to turn the report off. The weekly cron is cleared when the report is disabled, logging is off, or the plugin is uninstalled. During first-run setup, you can optionally agree to receive product news and related offers from HandL Digital. The checkbox is off by default. If you agree and finish setup, the plugin sends your alert email address, site URL, plugin version, and consent time to HandL Digital. HandL Digital stores this information on its server for those emails. If you leave the box unchecked, the plugin sends nothing to HandL Digital for this purpose. You can unsubscribe at any time by emailing
[email protected]. This registration is separate from denial alerts, webhooks, and the weekly report.
Top keywords
- ai35×2.12%
- site16×0.97%
- alerts15×0.91%
- wordpress15×0.91%
- activity14×0.85%
- ai client14×0.85%
- client14×0.85%
- estimated14×0.85%
- mail14×0.85%
- email13×0.79%
- rules13×0.79%
- denial12×0.73%
Enable Abilities for MCP
Enable Abilities for MCP gives you full control over which WordPress Abilities are available to AI assistants through the MCP (Model Context Protocol) Adapter. WordPress 6.9 introduced the Abilities API, allowing external tools to discover and execute actions on your site. This plugin extends that functionality by registering a comprehensive set of content management abilities and providing a simple admin interface to toggle each one on or off. Connect from claude.ai with just a URL Since version 2.1 the plugin ships an embedded OAuth 2.1 server built for claude.ai custom connectors. Add your site in claude.ai → Settings → Connectors, log in with your WordPress user, approve the consent screen — connected. No Client ID, no Application Password, no local configuration. Works from the claude.ai web app, mobile apps, and Claude Desktop Each team member authenticates with their own WordPress account and role — a subscriber can never do what only an editor should Every ability execution lands in the activity log under the real user’s name Works on single sites, subdirectory installs, and multisite networks (network-activate so the main site serves the OAuth discovery documents for every subsite) Prefer tokens? Application Passwords (per-user) and a single-admin Bearer token connect Claude Desktop / Claude Code, OpenAI Codex CLI, and Google Antigravity — the Connection tab generates ready-to-paste configuration for each client, and fills in your credentials automatically. Features 102 abilities organized in 21 categories: Core, Read, Write, SEO (Rank Math), SEO (SEOPress), SEO (Yoast), Navigation Menus, Utility, Multilanguage, Custom Post Types, WooCommerce, The Events Calendar, Code Snippets, JetEngine Options Pages, JetEngine Query Builder, Elementor, LearnDash, Tutor LMS, AI Agent Readiness (llms.txt), FSE Block Templates, and Accessibility (WCAG) WooCommerce integration — dedicated abilities to manage products, orders, and customers using the native WooCommerce API (HPOS-compatible, formally declared) The Events Calendar integration — list, get, create, and update events with venue, organizer, and date filters claude.ai OAuth custom connector — connect from claude.ai (web, mobile, or desktop) with zero local setup: an embedded OAuth 2.1 server with Client ID Metadata Document (CIMD) support lets each user log in with their own WordPress account and role Admin dashboard with toggle switches for each ability Per-ability control — expose only what you need Third-party ability control — abilities registered by other MCP-ready plugins (e.g. Fluent Forms) appear in the same dashboard, grouped by plugin, with the same per-ability toggles; disabling one removes it from every MCP server on the site Secure by design — proper capability checks, input sanitization, and per-post permission validation WPCS compliant — fully passes WordPress Coding Standards (phpcs) MCP-ready — all abilities include show_in_rest and mcp.public metadata Available Abilities Read (safe, query-only): Get posts with filters (status, category, tag, search) Get single post details (content, SEO meta, featured image) Get categories, tags, pages, comments, media, and users Write (create & modify): Create, update, and delete posts Create categories and tags Create pages Moderate comments Reply to comments as the authenticated user Upload images from external URLs to the media library (with optional auto-assign as featured image) Duplicate any post, page, or custom post type item — including all post meta (ACF, SEO, featured image) and taxonomy terms; saved as a draft by default Assign a custom taxonomy’s terms to a post or page (e.g. a taxonomy registered by a companion plugin) SEO — Rank Math: Get full Rank Math metadata for any post/page (title, description, keywords, robots, Open Graph, SEO score) Update Rank Math metadata: SEO title, description, focus keyword, canonical URL, robots, Open Graph, primary category, pillar content SEO — SEOPress: Get full SEOPress metadata for any post/page (title, description, focus keyword, robots, canonical, Open Graph, Twitter Card) Update SEOPress metadata: SEO title, description, focus keyword, canonical URL, robots directives, Open Graph, Twitter Card SEO — Yoast SEO: Get full Yoast SEO metadata for any post/page (title, description, focus keyphrase, canonical, robots, Open Graph, Twitter Card) Update Yoast SEO metadata: SEO title, description, focus keyphrase, canonical URL, robots (noindex, nofollow, advanced), Open Graph, Twitter Card Get Yoast sitemap index — fetch and parse the sitemap index, returning all registered sitemap URLs with last modification date Custom Post Types: List all registered custom post types with configuration and taxonomies Get items from any CPT with filtering, search, and taxonomy queries Get full details of a CPT item including all meta fields (WooCommerce, ACF, JetEngine, etc.) Create, update, and delete CPT items with taxonomy and meta field support Get CPT taxonomies with their terms Assign taxonomy terms to CPT items Read term meta by exact key, or all meta for a term Write a term meta field by exact key Update a term’s core fields: name, slug, description, or parent WooCommerce: List products with price, SKU, stock status, categories, and type Get full product detail including gallery, attributes, and variations Update product price, sale price, stock quantity, and status List orders with customer, total, status, and date (HPOS-compatible) Get full order detail: line items, billing/shipping, totals, and notes Update order status with optional note List customers with email, name, total spent, and order count The Events Calendar: List events with start/end date, venue, organizer, and date range filter Get full event detail with resolved venue address and organizer contact Create new events with title, description, dates, venue, and organizer Update existing events Navigation Menus: List menus with item counts and theme locations, and get one menu’s full item hierarchy Create a new menu, and add pages, posts, categories, tags, or custom URLs as items (with parent and position) Update an item’s title, URL, parent, or position Remove an item, assign a menu to a theme location, or delete a menu entirely (opt-in — destructive) Tutor LMS: Read a lesson’s video source configuration (type, value, and runtime) Set a lesson’s video source (external URL, YouTube, Vimeo, HTML5, or a third-party source such as Bunny.net) using Tutor’s own storage function — avoids the string-only limitation of the generic Update Post Meta ability, which Tutor cannot read back List courses, and get a single course’s full detail with its topics/lessons hierarchy Get a user’s enrollment status and completion progress for a course Get a user’s quiz attempt results, optionally filtered to a single quiz Enroll a user in a course, and unenroll them (both opt-in, manage_options only) Multilanguage: Assign a language to an existing post via Polylang or WPML Link two posts as translations of each other in the same translation group Get the full translation map for a post: language, post ID, title, permalink, and status for each translation LearnDash: List courses with enrollment count, and get a single course’s full detail (lessons, topics, quizzes) Get a user’s enrollment status/progress and quiz results for a course Enroll or unenroll a user in a course (opt-in — write, manage_options) JetEngine Options Pages: List all registered Options Pages with their field schema Get all fields and current values for an Options Page by slug Update a single Options Page field, including repeater rows (opt-in — write) JetEngine Query Builder: List all Query Builder queries with id, name, and query type Get the full settings of one query by id Update an existing query’s name, type, or arguments — the missing counterpart to JetEngine’s own native “Add Query” MCP tool, which has no edit/get/list equivalent (opt-in — write) Elementor: Get a compact, read-only tree of an Elementor page/template (element ids, types, text preview) Update an Elementor element’s settings by id — single or batch edits (opt-in — write) Bind a widget setting to a dynamic tag: post title, or a JetEngine/meta field (opt-in — write) Code Snippets: Create a PHP code snippet via the Code Snippets plugin — always saved as inactive, activate manually from wp-admin. Validates PHP syntax and blocks dangerous functions (eval, exec, shell_exec, and more) AI Agent Readiness (llms.txt): Fetch and validate the site’s llms.txt against the llmstxt.org spec, with actionable issues Write llms.txt content — routes automatically to SEOPress Pro’s option when active, or serves it directly (opt-in — write) FSE Block Templates: List all wp_template and wp_template_part entries for the active theme, merging theme-file defaults with database overrides Get the full block markup for one template or template part by slug Write new block markup to a template or template part — creates a database override automatically when the target is still a theme default; rejects content with unbalanced block-comment delimiters (opt-in — write, edit_theme_options) Accessibility (WCAG): Scan the media library for images missing alt text (WCAG 1.1.1 Non-text Content), paginated Utility: Search and replace text in post content Site statistics overview (includes custom post type counts) Update any post meta field by exact key (with protected internal key blocklist) Requirements WordPress 6.9 or later (Abilities API) MCP Adapter plugin installed and configured PHP 8.0 or later