| 开发者 | dudaster |
|---|---|
| 更新时间 | 2026年10月22日 03:19 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPL-2.0-or-later |
| 版权网址: | 版权信息 |
"confirm": true parameter. Accidental deletions are prevented by design.content field for full client compatibility, protocol errors use standard integer codes, and errors from a tool that actually ran are reported as isError so your agent can see and react to them. Pass an idempotency_key on any write call and a retried request (dropped connection, flaky client) returns the original result instead of repeating the action — no duplicate posts from an accidental double-send. Responses are hardened against corrupted output, so your agent always gets valid JSON back.
Works Well With Small & Local Models
Not every AI agent is Claude or GPT-4 class. AICOM is built to stay usable even for smaller, local, or context-constrained models:
tools/search — keyword search over tool names and descriptions, tuned for models that don't know exact tool names: handles full-sentence queries ("how do I add a photo to my page"), common synonyms (shop → WooCommerce, translate → Polylang/WPML), typo tolerance, and plurals.tools/describe — fetch one tool's full parameter schema by exact name, on demand — pairs with tools/search so a model never has to load the entire tool catalog just to find what it needs.tools/list to cut context size by roughly a third, while always keeping every parameter's name, type, and whether it's required — a model can still build a correct call without the extra explanatory text. Off by default; capable models see the full list as before.tools/list only ever shows the tools a key can actually call. A key without WooCommerce access never sees WooCommerce tools, so a smaller model isn't wading through options it's not allowed to use anyway.manage.skills to create or edit one.
Accessibility Audits — New in v3.2.0
AICOM now includes a dedicated Accessibility module so your AI agent can audit and fix WCAG issues across your entire site — no external tools or services required:
aria-hidden). Full dry-run support so you can preview changes before saving.AI Agent → AICOM Endpoint → WordPress
API Key Scopes
Each API key is granted specific scopes — you control exactly what each AI agent can and cannot do. Dozens of granular scopes are available, grouped by area:
read.wp, write.wp.posts, delete.wp.posts, manage.taxonomies, manage.meta, manage.media, manage.files, manage.wordpress.settings, manage.plugins, manage.backups, manage.a11y, manage.users, manage.roles, manage.skills, plus one read.*/manage.* pair per optional integration (WooCommerce, Elementor, Polylang, WPML, Yoast, SEOPress, Clautron). Built-in presets (Content Assistant, Translator, SEO Editor, Site Maintenance, Full Admin, and more) bundle the right scopes for a common role in one click — see the full list and descriptions on the API Keys page.
Endpoint
REST API:
POST /wp-json/aicom/v1/mcp
Fallback (no mod_rewrite required):
POST /?aicom=1
Health check:
GET /?aicom=1
Authentication
Authorization: Bearer aicom_XXXXXXXX_<secret>
or:
X-API-Key: aicom_XXXXXXXX_<secret>
MCP Request Example
{"jsonrpc":"2.0","method":"tools/call","params":{"name":"wp.posts.list","arguments":{"post_type":"post","posts_per_page":10}},"id":1}
aicom folder to /wp-content/plugins/ or install directly from Plugins → Add New by searching for "AICOM"https://yoursite.com/wp-json/aicom/v1/mcpAuthorization: Bearer <your-key> in every request.htaccess:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Safety tip: Start with Soft Lock enabled to limit the agent to read-only operations, then unlock once you're confident in the integration.No. Every request must include a valid API key. Keys are bcrypt-hashed in the database and scoped — each key only has access to the specific operations you explicitly grant it. Without a valid key, the endpoint returns 401 Unauthorized.
Yes. The fallback endpoint /?aicom=1 works on any server configuration, with or without pretty permalinks or Apache mod_rewrite.
Yes. Each plugin's tools are loaded automatically only if the corresponding plugin is active — and, for a key with the Compact Tool List setting on, only if the calling key actually has the scope to use them. If WooCommerce is not installed, no WooCommerce tools appear in the tool list or audit log. Polylang and WPML can't both be meaningfully active on the same install (they're alternative translation plugins), but AICOM detects whichever one you're running and exposes the matching tools automatically — same for Yoast vs. SEOPress.
Yes, in two ways: (1) assign only read.wp scopes to the API key, or (2) enable Soft Lock or Hard Lock mode from the Safety page — this blocks write and destructive operations site-wide regardless of key scopes.
Soft Lock permits public, discovery and read class tools only — agents can browse and read content but cannot write, delete or change settings. Hard Lock permits only public tools (like server.status) — the site is effectively frozen from an AI perspective. Hard Lock overrides Soft Lock.
Yes. Send "dry_run": true in your request parameters. The operation will be validated and simulated but no data will be changed. The audit log will record it as a dry run.
No. AICOM automatically snapshots a post, term, or Elementor page before your agent updates, trashes, deletes, or edits it — this happens at the plugin level regardless of what the agent does or forgets to do. You can restore any individual snapshot, or undo an entire session (every post, term, and Elementor page it touched) in one click from the Snapshots page.
Pass an "idempotency_key" in the request arguments. If AICOM sees the same key again — from a dropped connection, a retry, or a duplicate send — it returns the original result instead of repeating the action, so you never end up with two copies of the same post from one intended change.
Yes. Every request is logged to the audit log with timestamp, remote IP, API key label, tool name, parameters, result summary, and response duration. The log is accessible from AICOM → Audit Logs and can be filtered by date, key, or tool name.
MCP is an open standard created by Anthropic for connecting AI models to external tools and data sources. AICOM implements the MCP standard so any MCP-compatible AI client — Claude, OpenClaw, and others — can communicate with your WordPress site natively without custom integrations.
Yes, completely free and open source under the GPL-2.0-or-later license.
Yes. Each API key has an optional IP allowlist. If set, requests from any other IP will be rejected even if the key is valid.
wp.cache.purge now needs only write.wp.posts (not manage.wordpress.settings), so content-only API keys can call it, and it's reported to AICOMBase as reversible — it never touches content, so it no longer makes an otherwise-undoable session un-undoable just by having run. It also no longer flushes the shared object cache network-wide on a multisite install.wp.cache.purge tool — clears the site's caching plugin (LiteSpeed Cache, WP Fastest Cache, W3 Total Cache, WP Super Cache, WP Rocket, WP-Optimize, Autoptimize — whichever is active), via each plugin's own documented purge API. A no-op if none is active. Call it after a change a visitor would otherwise keep seeing a stale cached version of.sodium PHP extension (WordPress's pure-PHP sodium_compat fallback refuses to securely wipe a key from memory and throws, which crashed the request). The wipe is now best-effort instead of fatal.define( 'AICOM_DUDEE', false ); in wp-config.php, or the aicom_dudee_enabled filter.aicom_minute, plus a throttled admin fallback) with versions, health, lock state and a capability hash. No site content is transmitted.scope_rejected security event. Locks and pause always win; tasks run under a fresh AICOM session with a short-lived internal key.clautron.capability.inspect, clautron.capability.update, clautron.capability.deactivate) on top of a machine-readable manifest per capability (version, platform/version requirements, required scopes, declared effects, reversibility). Requirements and scopes are validated before Clautron ever compiles anything, independent of the tool's own static scope.clautron.capability.inspect reports whether a capability is installed, its installed vs. available version, compatibility, and which lifecycle actions actually work right now (not just what the capability declares in principle).clautron.capability.update re-syncs an installed capability to its manifest's current version in place, without creating a duplicate.clautron.capability.deactivate stops a capability without touching any data it wrote while active — the response says so explicitly (data_preserved, residual_effects). Reinstalling afterward reactivates the same capability instead of creating a new one.clautron.blueprint.smoke_test verification is no longer a fixed, hardcoded checklist — each Clautron primitive now declares its own check, and any primitive without one is reported explicitly instead of being silently skipped.manage.skills), so a key provisioned from any preset can save reusable workflows without a separate scope grant.AICOM_Module_Detector::is_dependency_active()), also removing an equivalent duplicate in aicom.recipes' module-gating (which had already silently drifted for the ecs_pro case) and the tool-class taxonomy literals scattered across the lock matrix and idempotency/session gating.match expressions, str_contains/str_starts_with/str_ends_with, a union return type) that had crept into the codebase despite the plugin declaring Requires PHP: 7.4 — on real PHP 7.x hosting this caused a hard parse error on plugin load, taking down the entire site's admin. Verified clean with php -l under real PHP 7.4, not just a newer local environment. Reported by a user running on shared hosting; thank you.tools/search: keyword search over tool names/descriptions, tuned for weak/local models that don't know exact tool names — handles full-sentence queries, common synonyms (e.g. "photo" → featured image, "shop" → WooCommerce), typo tolerance, and plurals.tools/describe: fetch one tool's full definition by exact name — the on-demand counterpart to tools/search, useful when you already know the name but not the parameters.tools/list drops each parameter's description text to cut context size, while always keeping name/type/required for every tool (read and write alike) so a call can still be built correctly. Each tool's own top-level description (including worked examples) is never shortened. Off by default — capable models see the same full list as before.skills.run not delivering the skill's steps/rules/input_schema/permissions to MCP clients that only read the content field (rather than the optional structuredContent, which isn't sent unless the client negotiates a newer protocol version) — the full workflow now always lands in content too.session.open now retries the active-session check briefly instead of failing outright, and the resulting NO_ACTIVE_SESSION error (on the rare case it's still not visible) is now marked retryable.date / time format.tools/list invoked as an ordinary tool call (rather than the standard tools/list request) was missing the required content field, causing strict MCP clients to reject it.tools/list now only shows the tools an API key can actually call — a key without a given scope no longer sees (and can't waste a round-trip on) tools it would immediately get denied for. Every tool list is scoped to the calling key's real permissions.retryable hint, so an agent can tell whether hammering the same call again could ever help, instead of assuming the server is unreachable.pll.create_bilingual_pair: create a translated draft, set its language, link it to the source post, optionally assign a category and featured image, and verify every step — all in one call. Works from an existing source post, or from scratch (pass source_language + source_post_title to create both language versions in a single call, with no pre-existing post needed).dry_run and idempotency_key are now documented directly in every eligible tool's schema, instead of being accepted but invisible — some strict MCP clients validate outgoing calls against the schema and would silently refuse to send an undocumented parameter.wp.posts.create now reports requested/persisted/verified so you can see exactly what WordPress actually stored versus what was asked for (e.g. a duplicate slug getting a "-2" suffix). Extended the same pattern to wp.posts.update, wp.terms.create, wp.terms.update, wp.meta.set, and wp.meta.set_many.tools/list compatibility bug: a tool with no parameters (e.g. session.close, pll.languages.list) serialized its empty schema as [] instead of {}. Strict MCP clients (Pydantic-based, including Hermes) reject the entire tool list over this single type mismatch, breaking tool discovery — and every tool call — completely. Reported and diagnosed with a full client-side validation log from a user; thank you.class field that was present on every tool in tools/list since v3.8.8. It was never part of the MCP Tool schema and could trip the same kind of strict-client rejection; the same information is now exposed the spec-compliant way via annotations (readOnlyHint/destructiveHint), only included when the negotiated protocol version supports it.tools/list response body for both issues, across both supported protocol versions, so a future change can't silently reintroduce either one.wp.posts.update and wp.terms.update no longer report updated: true when no actual field was supplied — they now return updated: false with a clear warning, and changed_fields listing exactly what changed when something did.slug, media_id) and now reported back in the response as _aliases_applied, so you can see exactly what the plugin auto-corrected instead of it happening silently.requested/persisted/verified, with a warning if they don't match — catches cases like WordPress re-assigning a default category, or Polylang silently rejecting a language change.session.open now reports available_scopes and missing_scopes for the key, scoped to the site's active modules, so an agent can tell upfront whether it has what it needs for a task like a translation workflow — before it starts, not after hitting a scope error partway through.content field on successful tool calls, for full compatibility with strict MCP clients.isError with a description, so agents can see and react to them directly.idempotency_key argument on write/destructive tools — pass the same key on a retried call and AICOM returns the original result instead of repeating the action (e.g. no duplicate post from a dropped connection and retry).manage.polylang.settings being unusable: it was required by pll.term.set_language and pll.string.set but was never registered as a grantable scope, so no API key — not even Full Admin — could hold it.manage.polylang is now "Manage Polylang Post translations" and manage.polylang.settings is "Manage Polylang Term & String translations", each with a tooltip explaining exactly what it does and does not allow.{} instead of [], and added components.schemas required by strict validators. Thanks allanantoni for the detailed report and fix.rest_pre_dispatch intercept bypasses WordPress JSON validation so weak models can connect without "rest_invalid_json" errors.session.status tool — check whether a session is open before calling session.open, avoiding SESSION_ALREADY_OPEN errors.TOOL_NOT_FOUND now includes fuzzy name suggestions ("Did you mean: wp.posts.create?") to guide models that hallucinate tool names.status, content, post_id) are resolved automatically with a hint.manage.polylang scope: post language assignment and translation linking remain under manage.polylang; string translations and term language/linking now require the new manage.polylang.settings scope.inputSchema now returned in tools/list — each tool includes parameter types, descriptions, and required flags so models can call tools correctly without prior knowledge.tools or list_tools method for small-context models.method:"tools/wp.posts.create" pattern and return a corrected JSON-RPC example.tools/call is sent without a name field.aicom.recipes tool returns step-by-step task recipes filtered to the key's actual permissions and active modules.initialize instructions — three exact steps with copy-paste JSON-RPC format.session.status registered as a discovery tool (no session required, no scope required).session_id column on fresh installs — every request was failing the INSERT silently, leaving the Activity tab empty. The fix repairs existing installs automatically on update.initialize, notifications/initialized, and ping now return spec-compliant responses, so strict MCP clients can connect.tools/call and tools/list methods/?aicom=1 for servers without mod_rewrite