NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1923 most downloaded on Packagist
Adapter for Abilities API, letting WordPress abilities to be used as MCP tools, resources or prompts
Last release 6 days ago
02 Oct 2026
Ships fairly regularly
a new release about every 3 months
Nearly every release is documented
notes for 8 of 8 stable releases
Nothing withdrawn
no release was ever pulled
1 years old
8 releases · first in 2025
This release has breaking changes for code that extends the adapter:
MCP Adapter 0.7.0 adds support for MCP 2026-07-28 and moves protocol output to exact-revision schemas. It is also the first release published to the WordPress.org plugin directory.
This release has breaking changes for code that extends the adapter:
McpToolValidator, McpResourceValidator, and McpPromptValidator classes, and the mcp_adapter_validation_enabled filter have been removed.HttpRequestHandler or McpWireOrchestrator.Using MCP Adapter as a bundled Composer library is deprecated. Install the plugin instead.
Read the v0.7.0 migration guide before you upgrade.
2026-07-28: sessionless server/discover, per-request protocol metadata, and the Mcp-Method, Mcp-Name, and Mcp-Param-* headers over HTTP.2025-06-18 or 2024-11-05 still connect, and are served through the 2025-11-25 schema.2026-07-28 with McpInputRequired.See CHANGELOG.md for the full list of changes.
Tested up to header by @justlevine in #302WP\MCP\Cli classes as final and cleanup internals by @justlevine in #306Dependency updates from Dependabot are not listed. See the full changelog link below.
Thank you to everyone who wrote, reviewed, or discussed the changes in this release: @justlevine, @jeffpaul, @gziolo, @andreilupu, @abhi3315, @matiasbenedetto, @dugyen, @webmyc, @dkotter, @stormrockwell, @saarnilauri, @georgestephanis, @steviepee, @obenland.
Full Changelog: v0.6.1...v0.7.0
One column per month.
Schema-backed MCP revisions are exactly 2025-11-25 and 2026-07-28. 2025-06-18 and 2024-11-05 no longer have their own DTOs; they are negotiated as legacy identifiers and served through the 2025-11-25 schema (see Added). McpVersionNegotiator::SUPPORTED_PROTOCOL_VERSIONS now lists only the schema-backed revisions; legacy identifiers moved to McpVersionNegotiator::LEGACY_PROTOCOL_VERSIONS.
Protocol-facing server getters get_tools(), get_resources(), get_prompts(), and get_prompt() require a selected Schema. There is no implicit default revision.
The generated DTO classes, get_protocol_dto(), and the alternate array serializers have been replaced by exact-revision schema records from wordpress/php-mcp-schema. See the dual-revision migration guide.
McpToolValidator, McpResourceValidator, McpPromptValidator, McpErrorFactory::validate_jsonrpc_message(), McpServer::is_mcp_validation_enabled(), and the mcp_adapter_validation_enabled filter have been removed. Wire validation always runs through the selected schema.
RequestRouter::route_request(), method handlers, McpErrorFactory, ContentBlockHelper, and McpPromptBuilderInterface::build() now exchange schema records and revision-neutral arrays instead of DTOs. JsonRpcResponseBuilder has been removed. Custom transports must delegate to HttpRequestHandler or McpWireOrchestrator.
McpTool::fromArray(), McpResource::fromArray(), and McpPrompt::fromArray() return WP_Error only for structural problems (missing name, URI, or handler; invalid resource URI). Schema and annotation problems no longer fail construction; they are reported per revision through is_available_for() and get_projection_error() and logged as warnings at registration.
The non-canonical tools/list/all method and ToolsHandler::list_all_tools() have been removed.
JSON-RPC batch requests are rejected before dispatch.
wp mcp-adapter list adds per-revision tool, resource, and prompt columns.
WP\MCP\Cli classes are final and can no longer be extended (#306).
Invalid protocol fields are no longer silently dropped or repaired. Components invalid in every supported schema revision are rejected. Handler values reach final schema projection. In 2026 responses, result _meta is validated before server identification is added, so malformed metadata is rejected and valid object fields are preserved. This reverses the 0.6.0 omission of malformed _meta. See the validation migration notes.
Removed validation and content helpers and the resource/prompt converter make() and getter layers are listed in the migration guide.
Non-array Ability meta.mcp now returns mcp_ability_invalid_meta. Removed errors: mcp_resource_missing_name, mcp_prompt_invalid_argument, and mcp_prompt_argument_missing_name. Non-array prompt arguments return mcp_prompt_invalid_arguments; resource-name filters reject non-strings only.
2025-06-18 and 2024-11-05 negotiate through initialize and are echoed back verbatim while the 2025-11-25 schema serves the session. Every server-emitted difference between those revisions and 2025-11-25 is an optional additive field, so the projection is unchanged. MCP-Protocol-Version must match the negotiated identifier when sent, and may be omitted only for sessions negotiated under 2024-11-05, which predates the header. 2025-03-26 stays non-negotiable because it requires servers to receive JSON-RPC batches; a proposal receives 2025-11-25 as before. server/discover and the unsupported-version error list the same two schema-backed revisions.McpRequestContext::protocol_version() returns the negotiated identifier; revision() continues to return the schema revision.2026-07-28 support: the sessionless server/discover lifecycle, per-request protocol metadata in the request body, and the MCP-Protocol-Version, Mcp-Method, Mcp-Name, and Mcp-Param-* headers over HTTP. STDIO accepts either revision per line.McpRequestContext, an immutable per-request context carrying the selected schema, transport, and session data.McpWireOrchestrator and JsonRpcRequestDecoder, one decode, validate, dispatch, and encode boundary shared by the HTTP and STDIO transports.McpTool, McpResource, and McpPrompt expose get_protocol_record( Schema $schema ) and is_available_for(). A component is omitted from a revision whose schema cannot represent it.mcp_adapter_tools_list, mcp_adapter_resources_list, mcp_adapter_prompts_list, and mcp_adapter_initialize_response filters receive the selected schema as a third argument._doing_it_wrong with schema error paths, in addition to error-handler logs.McpInputRequired under MCP 2026-07-28 to request elicitation input, and receive the client's answers through McpToolCallContext on retry (#316).server/discover emits a completion event. Invalid handler results return -32603, Internal error: The server produced an invalid result., with one failed request event and a correlated diagnostic through the configured error handler. See the observability migration notes.meta.annotations without a deprecation notice. meta.mcp.annotations overrides it, and an empty array suppresses annotations instead of falling back.title is always emitted from the label. Resource names may be empty; absent names use the URI.wordpress: are accepted. Invalid lastModified timestamps reject resources on both registration paths.inputSchema only when absent. Prompt fallback arguments include boolean property schemas and preserve supplied titles and descriptions.initialize, notifications/initialized, and ping are served only for 2025-11-25; server/discover only for 2026-07-28. The 2025 HTTP session lifecycle is unchanged.2026-07-28 output omits Tool.execution, adds resultType: "complete" to completed results, and adds ttlMs: 0 and cacheScope: "private" to discovery, list, and resource-read results.-32602) in both revisions. Missing resources return -32002 in 2025-11-25 and -32602 in 2026-07-28. An unsupported per-request version returns -32022.null.tools/call and resources/read look up the tool name and resource URI exactly as sent. Surrounding whitespace is no longer trimmed, so a padded name cannot bypass the 2026-07-28 Mcp-Param-* header check.resources/read forwards only the protocol-defined parameters (uri, _meta, inputResponses, requestState) to permission callbacks, the mcp_adapter_pre_resource_read filter, and resource handlers. Unknown request keys are dropped.2025-11-25 tools/call responses omit structuredContent when a tool returns a JSON list, because that schema types the field as an object. The text block still carries the encoded list. 2026-07-28 responses keep the list.mcp-adapter/get-ability-info serializes an empty input_schema as {} instead of [].MCP Adapter 0.6.1 repairs the production release ZIP. It contains no other changes.
MCP Adapter 0.6.1 repairs the production release ZIP. It contains no other changes.
Anyone running 0.6.0 from the mcp-adapter.zip release asset should upgrade. Installations built from source or required through Composer are unaffected.
WP_CLI and WP_CLI_Command, and mapped them to files under tests/phpunit/, which the release artifact excludes. Any plugin calling class_exists( 'WP_CLI' ) on a normal web request could therefore trigger an uncaught fatal error. class_exists( 'WP_CLI' ) now returns false when WP-CLI is unavailable.No API, hook, or protocol behavior changed. Upgrading from 0.6.0 requires no migration.
Thank you to @rebeccahum for reporting this in #283, their first contribution to MCP Adapter.
Full Changelog: v0.6.0...v0.6.1
WP_CLI and WP_CLI_Command, and mapped them to files under tests/phpunit/, which the release artifact excludes. Any plugin calling class_exists( 'WP_CLI' ) on a normal web request could therefore trigger an uncaught fatal error. class_exists( 'WP_CLI' ) now returns false when WP-CLI is unavailable (#283).No API, hook, or protocol behavior changed. Upgrading from 0.6.0 requires no migration. Installations built from source or required through Composer were unaffected.
MCP Adapter 0.6.0 improves protocol compatibility, resource metadata handling, session reliability, WP-CLI behavior, and coexistence with plugins that
MCP Adapter 0.6.0 improves protocol compatibility, resource metadata handling, session reliability, WP-CLI behavior, and coexistence with plugins that bundle their own copy of the adapter.
meta.public: true are now exposed through the default MCP server unless meta.mcp.public explicitly opts out. Existing permission callbacks and capability checks still apply.McpValidator have been removed. Integrations calling them directly should apply their own application-specific MIME validation._meta on resource contents, embedded resources, content blocks, and prompt messages._meta without discarding the payload it accompanies.mimeType exactly as declared, including values with parameters such as text/html;profile=mcp-app.resources/templates/list, returning an empty template list when no templates are available.These changes improve compatibility with MCP Apps and other clients that depend on resource metadata.
WP\MCP classes win when the standalone adapter and another plugin bundle different versions.wp mcp-adapter serve selects the default server.--user argument instead of registering a conflicting local option.category field and improve examples throughout the documentation.Welcome to @johnbillion, @graham73may, @gziolo, @ustramooner, @matthewfarrugia, @robertocyrino, and @mathetos, who made their first contributions to MCP Adapter in this release.
Thank you to everyone who contributed code, documentation, testing, and reviews.
Full Changelog: v0.5.0...v0.6.0
meta.public: true are now exposed through the default MCP server unless meta.mcp.public explicitly opts out. Existing permission callbacks and capability checks still apply.McpValidator have been removed. Integrations calling them directly should apply their own application-specific MIME validation.resources/templates/list, returning an empty template list when no templates are available.WP\MCP classes win when the standalone adapter and another plugin bundle different versions.category field, and improves examples throughout._meta is preserved on resource contents, embedded resources, content blocks, and prompt messages._meta is omitted without discarding the payload it accompanies.mimeType is emitted exactly as declared, including values with parameters such as text/html;profile=mcp-app.wp mcp-adapter serve keeps JSON-RPC stdout clean when selecting the default server.--user argument is used instead of registering a conflicting local option.v0.5.0 is a major internal upgrade for MCP Adapter. The biggest change is the adoption of wordpress/php-mcp-schema across the plugin, so MCP responses
v0.5.0 is a major internal upgrade for MCP Adapter. The biggest change is the adoption of wordpress/php-mcp-schema across the plugin, so MCP responses now use typed protocol DTOs instead of hand-built arrays.
This gives us a more consistent and spec-aligned foundation for tools, resources, prompts, initialization, and error responses, while making future MCP spec updates easier to support.
For most users, this should be a seamless upgrade. Existing ability registration, create_server(), and WordPress hooks continue to work as before. If you have custom handlers, transports, or code that depends on internal component structures, review the migration guide for upgrade details.
wordpress/php-mcp-schema throughout the adapter2025-11-25, 2025-06-18, and 2024-11-05isError tool responsesSessionManager write amplification to lower lock contentionphp-mcp-schema v0.1.1 follow-up for cleaner Composer dist archivesDocumentation was expanded significantly for this release, including:
v0.5.0 migration guideFull Changelog: v0.4.1...v0.5.0
wordpress/php-mcp-schema throughout the adapter, so MCP responses use typed protocol DTOs instead of hand-built arrays.2025-11-25, 2025-06-18, and 2024-11-05.SessionManager write amplification to lower lock contention.php-mcp-schema v0.1.1 follow-up for cleaner Composer dist archives.isError tool responses.Existing ability registration, create_server(), and WordPress hooks are unchanged. Custom handlers, transports, or code depending on internal component structures should review the v0.5.0 migration guide.
fix: Correct JSON-RPC error response structure and HTTP status codes by @galatanovidiu in #106
ToolsHandler by @priethor in #90Full Changelog: v0.4.0...v0.4.1
Co-authored-by: priethor priethor@git.wordpress.org
Co-authored-by: galatanovidiu ovidiu-galatan@git.wordpress.org
This patch release focuses on MCP specification compliance and project improvements.
This patch release focuses on MCP specification compliance and project improvements.
"object" - abilities using flattened schemas now work correctly.Tool Annotations Mapping (#91): Fixed annotation field name mismatches between WordPress Abilities API format and MCP specification. The adapter now correctly maps readonly → readOnlyHint, destructive → destructiveHint, and idempotent → idempotentHint for full protocol compliance.
Added .gitattributes to exclude development files from releases (#94)
Added GNU General Public License v2 (#97)
Fixed missing comma in transport permissions example (#85)
Applied WordPress PHP documentation standards (#92)
Full Changelog: v0.3.0...v0.4.0
object (#93)..gitattributes to exclude development files from releases (#94).Version 0.3.0 introduces significant architectural improvements with enhanced observability, streamlined transport infrastructure, and better error ha
Version 0.3.0 introduces significant architectural improvements with enhanced observability, streamlined transport infrastructure, and better error handling compliance.
Event Naming with Status Tags
All observability events now use unified names with a status tag instead of separate success/failure event names.
Before:
$handler->record_event('mcp.request.success', ['method' => 'tools/call']);
$handler->record_event('mcp.request.error', ['method' => 'tools/call']);
After:
$handler->record_event('mcp.request', ['status' => 'success', 'method' => 'tools/call']);
$handler->record_event('mcp.request', ['status' => 'error', 'method' => 'tools/call']);
Instance-Based Handlers
Observability handlers now use instance methods instead of static methods. If you have custom handlers implementing McpObservabilityHandlerInterface, update from static to instance methods:
// Before
class MyHandler implements McpObservabilityHandlerInterface {
public static function record_event(string $event, array $tags = []): void { }
public static function record_timing(string $metric, float $duration_ms, array $tags = []): void { }
}
// After
class MyHandler implements McpObservabilityHandlerInterface {
public function record_event(string $event, array $tags = [], ?float $duration_ms = null): void {
// Single method handles both events and timing
}
}Removed Method
McpObservabilityHelperTrait::record_error_event() has been removed. Use record_event() with status and error categorization instead.
Removed Transports
RestTransport and StreamableTransport have been removed and replaced by the unified HttpTransport class, which provides all functionality of both previous implementations with enhanced capabilities.
Migration:
All existing servers using these transports should update to use HttpTransport:
use WP\MCP\Transport\HttpTransport;
$adapter->create_server(
'my-server',
'namespace',
'mcp',
'Server Name',
'Description',
'1.0.0',
[ HttpTransport::class ], // Updated
ErrorLogMcpErrorHandler::class
);All WordPress filter/action names now use the mcp_adapter_ prefix for consistency:
// Before
add_filter('mcp_validation_enabled', $callback);
// After
add_filter('mcp_adapter_validation_enabled', $callback);## What's NewThe new HttpTransport class provides a modern, spec-compliant transport implementation with session management, streaming support, and enhanced error handling.
Comprehensive refactoring to use WP_Error pattern throughout the codebase, replacing exceptions for better WordPress integration. All error responses now comply with the MCP specification format.
Observability events are now recorded centrally at the transport layer with automatic metadata extraction from handler responses, providing richer context and better performance tracking.
Updated guides covering transport permissions, custom transport implementation, error handling patterns, and comprehensive migration instructions.
See docs/migration/v0.3.0.md for detailed migration instructions and examples.
WordPress/* by @justlevine in #14src to includes and post-scaffold cleanup by @justlevine in #20abilities-api v0.1.0 by @justlevine in #27Core/McpAdapter by @justlevine in #26ExecuteAbilityAbility by @galatanovidiu in #76wp_ prefix to hook names. by @mindctrl in #81Full Changelog: v0.1.0...v0.3.0
RestTransport and StreamableTransport have been removed and replaced by the unified HttpTransport class (#48).status tag instead of separate success and failure event names.McpObservabilityHelperTrait::record_error_event() has been removed.mcp_adapter_ prefix (#81).HttpTransport with session management, streaming support, and enhanced error handling (#48).WP_Error pattern throughout, replacing exceptions (#71).WP_Error handling in PromptsHandler and ResourcesHandler (#74).input_schema to MCP arguments (#78).init action now fires before initializing in WP-CLI (#86).See the v0.3.0 migration guide for detailed upgrade instructions.
First Stable Release of WordPress MCP Adapter
The WordPress MCP Adapter is now ready for production use! This foundational library bridges WordPress's Abilities API with the Model Context Protocol (MCP), enabling WordPress applications to expose their functionality to AI agents in a standardized, secure, and extensible way.
RestTransport) and Streaming (StreamableTransport) protocolsMcpTransportInterfaceMcpErrorHandlerInterfaceFull Changelog: https://github.com/WordPress/mcp-adapter/commits/v0.1.0
Your coding agent can read these notes before it upgrades. Set up the MCP server →