=== AcrossAI MCP Manager === Contributors: raftaar1191 Tags: mcp, ai, copilot, vscode, claude Requires at least: 7.0 Requires PHP: 8.1 Tested up to: 7.0 Stable tag: 0.1.8 License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html Connect WordPress to MCP clients like VS Code, Claude, and Copilot using secure application passwords. == Description == MCP Manager uses the standard `@automattic/mcp-wordpress-remote@latest` package with WordPress Application Passwords for the default remote flow. It also includes an optional experimental direct Claude Connectors mode backed by a WordPress-hosted OAuth approval flow. MCP Manager is a WordPress plugin that enables seamless integration with Model Context Protocol (MCP) servers, allowing AI assistants and code editors to safely access your WordPress instance through secure application passwords. = Key Features = * **Multi-Client Support**: Configure MCP for: - VS Code with Copilot - Claude Desktop App - GitHub Copilot & Codex - OpenAI ChatGPT Codex - Custom MCP Clients * **Secure Authentication**: Uses WordPress native Application Passwords system - One-click password generation - Secure credential management - Password revocation support - Per-server Access Control still enforced after authentication * **Easy Configuration**: - Copy-paste ready JSON configurations - Per-provider configuration file paths - Automatic top-level key detection * **Format #1 Standard**: Uses the Automattic-recommended MCP configuration format - npx command execution - @automattic/mcp-wordpress-remote@latest package - Full environment variable support = How It Works = 1. Navigate to Settings → MCP Manager 2. Select your MCP client (VS Code, Claude, GitHub Copilot, ChatGPT, or Custom) 3. Click "Generate New Application Password" 4. Copy the ready-to-use JSON configuration 5. Paste into your client's configuration file 6. Restart your MCP client All application passwords are managed through WordPress's native Application Passwords system and appear in your profile under Account Management. = CLI Connection and Authorization Flow = MCP Manager also supports a browser-assisted CLI connection flow for local MCP clients. Typical command: `npx -y @acrossai/mcp-manager --siteurl=https://example.com --server=default-mcp-server` Flow summary: 1. The CLI checks `/wp-json/acrossai-mcp-manager/v1/health` 2. The CLI starts auth with `/wp-json/acrossai-mcp-manager/v1/auth/start` 3. WordPress returns an `auth_code` and frontend `auth_url` 4. The CLI opens the frontend approval page at `/acrossai-mcp-manager/` 5. If needed, the user signs in through normal WordPress login 6. The signed-in user approves access in the browser 7. The CLI polls `/auth/status` until the request is approved 8. The CLI fetches the approved user's accessible servers from `/servers` 9. The CLI exchanges the approved code at `/auth/exchange` 10. WordPress creates a one-time Application Password and the CLI writes the MCP client config Terminology: * **Sign in / Log in** = WordPress account authentication * **Connect** = starting the CLI-to-site linking flow * **Authorize / Approve access** = granting the CLI permission in the browser Important notes: * The frontend authorization page must never be cached * Auth codes are single-use * `/servers` and `/auth/exchange` respect per-server access control * User-facing copy should say **CLI Connections** rather than **npm Login** * Generated remote MCP configs use Application Passwords and explicitly disable OAuth discovery in `@automattic/mcp-wordpress-remote` = Experimental Direct Claude Connectors = An optional **Claude Connectors Screen (Experimental)** setting can enable a direct OAuth flow for Claude's hosted connectors. When the global feature toggle is enabled and a specific server is configured in its **Claude Connector** tab, the plugin exposes: * `/.well-known/oauth-authorization-server` * `/.well-known/oauth-protected-resource?resource=` * `/acrossai-mcp-connectors/oauth/authorize/` * `/wp-json/acrossai-mcp-manager/v1/connector/oauth/token` Important notes: * Disabled by default * The Application Password flow remains available and supported * The master experimental toggle is global, but OAuth client settings are stored per server * Direct connector approval signs Claude in as a WordPress user * Per-server Access Control still applies to every MCP request after OAuth * Public HTTPS is recommended for hosted connector usage = Provider Configuration Paths = * **VS Code**: ~/.config/Code/User/globalStorage/Copilot.copilot-chat/mcp.json (top-level key: "servers") * **Claude**: ~/Library/Application Support/Claude/claude_desktop_config.json (top-level key: "mcpServers") * **GitHub Copilot**: ~/.gh-copilot/config.json (top-level key: "servers") * **OpenAI ChatGPT**: ~/.config/chatgpt/config.json (top-level key: "servers") * **Custom**: ./your-project/.mcp/config.json (top-level key: configurable) = Requirements = * WordPress 5.9 or higher * PHP 7.4 or higher * WordPress Application Passwords support (built-in since WP 5.6) == Installation == 1. Upload the plugin directory to `/wp-content/plugins/` 2. Activate the plugin through the 'Plugins' menu in WordPress 3. Navigate to Settings → MCP Manager to configure Or: 1. Go to Admin → Plugins → Add New 2. Search for "MCP Manager" 3. Click "Install Now" then "Activate" == Frequently Asked Questions == = Is my password secure? = Yes! MCP Manager uses WordPress's native Application Passwords system. Each password is: - Generated using WordPress's secure methods - Associated with your user account - Visible in your profile for management - Revocable at any time = Can I use this with multiple MCP clients? = Yes! You can generate separate passwords for each client (VS Code, Claude, GitHub Copilot, ChatGPT, and any custom client). = Where are my application passwords saved? = All application passwords are managed through WordPress's native Application Passwords system. View and manage them at: User Profile → Account Management → Application Passwords = What MCP clients are supported? = - Visual Studio Code (with Copilot) - Anthropic Claude Desktop App - GitHub Copilot - OpenAI ChatGPT Codex - Any custom MCP client supporting the standard format = Can I revoke a password? = Yes! You can revoke any application password from your profile page under Account Management → Application Passwords. = Is this compatible with multisite? = Yes! MCP Manager works with WordPress multisite installations. Each site can be configured independently. = Do I need to install additional software? = No additional software is needed on the WordPress side. Your MCP clients (VS Code extension, Claude app, etc.) handle the integration. == Screenshots == 1. Settings page with client tabs for easy configuration 2. Copy-paste ready JSON configuration 3. One-click password generation 4. Per-provider configuration file locations and top-level keys == Changelog == = 0.1.8 = * **Feature 034 — MCP client subsystem refactor: metadata methods + canonical filter-aware enumeration.** Each concrete MCP client class (`ClaudeDesktopClient`, `ClaudeCodeClient`, `VSCodeClient`, `GitHubCopilotClient`, `CodexClient`, `CursorClient`, `GeminiClient`, `CustomClient`) now declares its own display metadata via six new methods on `AbstractMCPClient` — `get_icon()`, `get_description()`, `get_config_file()`, `get_top_level_key()`, `get_instructions()`, plus `get_priority(): int` (default `100`, built-ins pre-assigned `10, 20, 30, ..., 80` to preserve pre-refactor sub-nav order). Replaces the private `CLIENT_META` const in `MCPClientsBlock` (deleted). Enumeration collapses to a single canonical entry point `AbstractMCPClient::get_all_registered_clients()` that fires the existing `acrossai_mcp_client_classes` filter with a `DEFAULT_CLIENT_CLASSES` seed, validates FQNs per SEC-013-008 (silent-skip on invalid), validates slugs against `/[a-z0-9-]{1,64}/` (`_doing_it_wrong` under `WP_DEBUG` on violators), dedups by slug with later-wins, and sorts by `(priority ASC, slug ASC)` — mirroring `ConnectorProfileRegistry::get_profiles()` line-for-line. The pre-F034 glob-based `AbstractMCPClient::get_all_clients()` (which ignored the filter) is deleted. `MCPClientsBlock::render_body()` shrinks from 32 lines to 6 (single call to the canonical enumeration + iteration; no inline default-classes array, no local filter loop, no metadata lookups by slug). Third-party client subclasses contributed via the filter now have a symmetric way to declare their own icon / description / config-file / top-level-key / instructions / sub-nav slot instead of being stranded in the Renderer's private const. **Byte-identical rendered output** for the eight built-in clients on the server-edit → Clients tab. **No breaking changes for existing third-party subclasses** — the six new methods default to empty strings (or 100 for priority). **Test coverage**: new `GetAllRegisteredClientsTest.php` covers default state / filter contribution / invalid FQN skip / bad slug reject / duplicate slug later-wins / priority sort with slug tiebreaker; new `ConcreteClientMetadataTest.php` data-provider parameterized over all 8 built-ins asserts each returns the migrated metadata values; new `MCPClientsBlockRenderTest.php` under the `renderers` suite verifies FR-016 render byte-identity via DOM markers AND exercises the SEC-034-001 preservation invariant (hostile third-party subclass returning `