Pro Tool Returned Upgrade Prompt with Valid License
You activated Royal MCP Pro successfully — the License page shows the key as active, the activation-count moved up by one on My Account — but when you call a Pro tool from your MCP client, the response comes back as an upgrade prompt anyway. This doc walks through the diagnosis. The pattern is almost always sibling-SDK shadowing from another Royal Plugin installed on the same site.
A Pro tool call returns a response that looks something like:
🔒 divi_clone_page is a Royal MCP Pro feature.
...followed by "Upgrade + pricing" and "Tool details" links. This is the flagship upgrade pitch. Secondary Pro tools return a shorter version. Either way — you get an upgrade CTA when you shouldn't.
What's actually happening under the hood
Every Pro tool call passes through a license gate in Tool_Registry. The gate calls a helper function — wpgenius_is_licensed('royal-mcp-pro') — and if it returns false, the upgrade pitch is what the LLM client receives instead of the actual tool result.
That function comes from the WPGenius licensing SDK bundled with every Royal Plugin Pro (Royal MCP Pro, SiteVault Pro, ForgeCache, GuardPress Pro, SEObolt Pro, FormForge Pro, Royal Affiliate Pro). All of them ship their own copy of the SDK.
Each copy is guarded with:
if ( ! function_exists( 'wpgenius_is_licensed' ) ) {
function wpgenius_is_licensed( $plugin_slug ) {
// …
}
}Whichever Royal Plugin loads FIRST wins — its copy of the function is defined and every sibling's function_exists guard sees the existing function and skips its own definition. If the winning copy is an older version that doesn't know about the Royal MCP Pro slug yet, the license check returns false even though Royal MCP Pro itself has a perfectly valid license activated.
WordPress loads plugins in alphabetical order of their folder name. For Royal Plugins that means:
forgecache < formforge-pro < guardpress < royal-affiliate-pro < royal-mcp-pro < seobolt-pro < sitevault-pro
If Royal MCP Pro loads BEFORE the sibling that has the stale SDK, Royal MCP Pro's SDK wins and everything works. If Royal MCP Pro loads AFTER, the sibling wins. This is why the same license key can work on one site and fail on another purely based on which other Royal Pros are installed.
Diagnosis in 3 steps
Step 1: Confirm the license IS actually active
Rules out the case where the customer just thinks the license is active but it isn't.
Go to Royal MCP Pro → License in wp-admin. Confirm:
- The page shows an "active" state (license key masked out to last 4 chars, activation date visible)
- There's no expiration warning
- The activation is counted on My Account → Licenses
If any of those fail — the license itself is the problem. See License Activation Issues instead.
Step 2: List which sibling Royal Pros are installed
Every sibling Pro on the site is a candidate for the shadowing plugin.
Go to Plugins in wp-admin. Count how many of these are active:
- ForgeCache Pro
- FormForge Pro
- GuardPress (Pro)
- Royal Affiliate Pro
- Royal MCP Pro (this one)
- SEObolt Pro
- SiteVault Pro
If Royal MCP Pro is the only Royal Pro active on the site — sibling shadowing is impossible; skip to Other possible causes. If there's at least one other Royal Pro active, continue to step 3.
Step 3: Identify the alphabetically-first sibling with a stale SDK
The winner in the load-order race is your shadowing plugin.
Any active Royal Pro whose folder name is alphabetically before royal-mcp-pro is a candidate:
forgecache— ForgeCache 2.1.30 or later already ships the updated SDK; earlier versions can shadowformforge-pro— potentially shadows regardless of installed version until the next SDK-sync releaseguardpress— potentially shadows regardless of installed version until the next SDK-sync releaseroyal-affiliate-pro— potentially shadows regardless of installed version until the next SDK-sync release
Siblings that load AFTER Royal MCP Pro (seobolt-pro, sitevault-pro) can't shadow it — skip them.
Fixing it
Preferred: update the sibling Pro to its latest version
Whenever a Royal Plugin Pro ships a new release, our build pipeline auto-syncs the canonical SDK into it. Updating any sibling Pro to its latest release means it starts winning the load-order race with a current SDK that DOES know about the Royal MCP Pro slug.
- Go to Dashboard → Updates in wp-admin
- Update every sibling Royal Pro to its latest version
- Re-try the Pro tool call from your MCP client
This is the correct long-term fix. Every Royal Pro release ships with the current SDK, so keeping siblings up to date is what prevents the shadow from recurring.
Immediate workaround: temporarily deactivate the shadowing sibling
If updating the sibling isn't an option right now (custom compatibility work in progress, waiting for a maintenance window, etc.):
- Deactivate the sibling Royal Pro on Plugins
- Re-try the Pro tool call from your MCP client — it should now succeed
- Reactivate the sibling when it's safe to update it to the current version
Only the sibling that's actually shadowing needs to be deactivated. If Royal MCP Pro is loading between (say) ForgeCache and SEObolt Pro, deactivating SEObolt Pro won't help — SEObolt loads AFTER Royal MCP Pro, so it isn't the shadow source.
function_exists guardWithout the guard, whichever plugin loads second would trigger a fatal "cannot redeclare function" error and the whole site would go down. The guard prevents the fatal but has the shadowing side effect. The canonical-SDK-sync in every plugin's build pipeline is what makes the guard behavior benign — because whichever copy loads first is always current.
Other possible causes
If Royal MCP Pro is the only Royal Pro on the site or you've already updated / deactivated the sibling and the prompt still fires:
Cause A: Object cache holding a stale "invalid" transient
The SDK caches "license valid" state in a transient for 24 hours. On a site with persistent object cache (Redis, Memcached, some managed hosts), an "invalid" state cached from before you activated can linger.
Fix: Deactivate + reactivate the license on the License page. That deletes the transient and forces a fresh server call.
Cause B: wpgenius_is_licensed function was never defined at all
Rare, but happens if the WPGenius SDK bootstrap file failed to load (PHP syntax error in the SDK, opcache serving stale bytecode, plugin corruption during upload). Every Royal Pro tool call falls back to return false because function_exists is false.
Fix: reinstall Royal MCP Pro fresh (delete + reupload zip), then reactivate the license. If that doesn't help, another sibling Pro might be the one with the broken SDK bootstrap — try deactivating siblings one at a time.
Cause C: RMCP_PRO_LICENSE_BYPASS constant not defined on a dev site
If you're doing local development and don't want to burn an activation slot, define this in wp-config.php:
define( 'RMCP_PRO_LICENSE_BYPASS', true );The gate short-circuits to "licensed" without any server call. Use only on non-production sites. Not a fix for production issues.
Still Stuck? Two-Step Support Path
If you've verified the license is active, updated / deactivated every sibling Royal Pro, and the Pro tool still returns the upgrade prompt, contact us.
Step 1: Start with the Royal MCP Troubleshooting Guide
Royal MCP Troubleshooting — Start Here covers MCP-layer issues (connection, discovery, auth) — rules out the case where the tool call isn't even reaching Royal MCP Pro in the first place.
Step 2: Email priority support
If MCP-layer diagnostics look clean and the tool is definitely being invoked but always returns the pitch, email priority support from your purchase email address at support@royalplugins.com. Priority email support is included with your license — typical response within 24 hours. Never include your license key in email; we look it up from your purchase address.
- The exact response text from the Pro tool call (paste the full pitch response including the tool name)
- List of every active Royal Pro on the site with version numbers (from Plugins page)
- Royal MCP Pro version
- Which MCP client and which tool name triggered the pitch
- Whether the same tool works after deactivating every sibling Royal Pro (isolates the sibling-shadow variable)
- Whether the License page in Royal MCP Pro shows "active"
- Screenshot of Plugins page showing which Royal Pros are active + their versions