zealousagenda
Forum Replies Created
-
Thanks — and good news on 1.5.3. The design rationale for keeping the bare PRM unchanged makes sense; I hadn’t considered the agent-readiness scanners probing at site root, and serving both variants is clearly the right call.
Three things back, including one that answers your point 3 before you have to wait on me. 1. The Desktop / API-key path is already running here — and has been the whole time
That’s my
my-siteentry:mcp-remoteinclaude_desktop_config.jsonwith a staticAuthorization: Bearerheader. It’s been in place for weeks and it is healthy right now, on the same site, while the web connector cannot complete OAuth.royal_mcp_connection_healtha few minutes ago:{ "route": "https://autumnspring.co/wp-json/royal-mcp/v1/mcp", "auth_method": "api-key", "relay": null, "token_ttl": null, "active_scopes": ["tools"], "server_version": "1.5.2", "wp_version": "7.1.1", "php_version": "8.2.33", "builders": { "divi_version": "5.12.1", "elementor_version": null, "gutenberg_version": "7.1.1" } }Real tool calls through it during the same session that produced the failed OAuth attempts:
wp_get_plugins,wp_get_permalink_structure,wp_get_plugin_settings,wp_get_error_log_tail. All returned real data.So the test you suggested has effectively been running continuously, and it gives you the falsifier you predicted: same site, same origin, same Royal MCP install — API-key path fully functional while the web connector’s OAuth dies at the token step. Combined with the
POST /register201 from Anthropic’s ownpython-httpxclient, host-layer blocking is dead twice over. This is web-connector-specific. 2. For your SiteGround rig — root.well-knownis NOT blocked hereWorth knowing before you build the rig around that assumption, since I gather the 1.5.2 fallback path was added for SiteGround specifically.
On my install, both discovery paths return 200 with valid metadata:
GET /.well-known/oauth-authorization-server → 200 ✓ GET /wp-json/royal-mcp/v1/.well-known/oauth-authorization-server → 200 ✓Both advertise
client_id_metadata_documentsupport, issuerhttps://autumnspring.co, endpoints at/authorize,/token,/register, PKCES256, scopes["mcp:full"].So whatever drove SiteGround installs into your ticket queue, it isn’t a blanket block of root
.well-knownon SiteGround — at least not on this account/stack combination. If it’s plan-dependent, PHP-handler-dependent, or tied to a specific SG Optimizer or Security Optimizer setting, a rig built on a fresh account may not reproduce it by default. For reference, this install runs SiteGround Speed Optimizer 7.8.2 and Security Optimizer 1.6.8, no Cloudflare, permalinks/%postname%/. Happy to compare any specific SG setting against yours once the rig is up — that’s probably faster than guessing at which variable matters. 3. The two items you wanted more info onwp_get_plugin_settingsempty-vs-set redaction. Exact repro — call it withplugin_slug: "royal-mcp":{ "slug": "royal-mcp", "options": { "royal_mcp_db_version": "1.5.2", "royal_mcp_settings": { "enabled": true, "allow_option_writes": true, "allow_theme_writes": false, "api_key": "[REDACTED]", "oauth_client_id": "[REDACTED]", "oauth_client_secret": "[REDACTED]", "platforms": [{ "platform": "claude", "enabled": true, "api_key": "[REDACTED]", "model": "claude-sonnet-4-6" }], "mcp_servers": [] } } }oauth_client_idandoauth_client_secretare both empty — the admin UI shows the “Leave empty for Dynamic Client Registration” placeholder for both. But they render identically toapi_key, which is set. The redaction masks by key name regardless of value, so the tool can’t distinguish “set” from “empty.”Concretely, this cost me real time: it was the basis for a wrong hypothesis (that a stale static client ID was colliding with DCR), which I only killed by opening the admin UI and looking. Suggested fix: return
""ornullwhen the underlying value is empty, and reserve"[REDACTED]"for keys that actually hold something.WebMCP badge. Here’s everything I can observe:
- “Enable browser agents (WebMCP)” is ON
- Badge reads:
WebMCP bridge status: unknown — could not reach discovery path - Both OAuth discovery paths above return 200 from an external datacenter IP
- No Cloudflare, no active WAF or security plugin, permalinks not Plain
Register tools with the WordPress Abilities APIis also ON
Which path does that badge probe? If you tell me the URL, I’ll curl it from outside and from the server and post both results. I didn’t want to guess at half a dozen candidate paths and report noise. If it’s a loopback request from WordPress to itself, that’s a different failure class than an external fetch, and worth distinguishing in the badge text — “could not reach” currently doesn’t say which direction it tried.
One last note in case it’s useful for triage: the resolved
ofid_aab3a46ce11eebb2thread — wherewp_check_filetype()returnedfalseon a Photon-suffixed icon URL and Claude rejected the response as a generic auth error — is the reason I flagged the PRMresourcemismatch as worth ruling in rather than assuming cosmetic. Same shape: a spec-noncompliance on the server side surfacing to the user as an authorization failure with no indication of the real cause. If 1.5.3 lands and my connector starts working, that’s a second instance of the pattern and probably worth noting in your troubleshooting doc.Upstream ticket for the client-side half is
anthropics/claude-ai-mcp#1028 if you want to watch it. I’ve supplied bothofid_references there with the server-side log correlation.Adding a second data point to this thread, because I have the same
ofid_*failure and server-side logs that isolate where it stops. I can’t start a new topic (my account can’t create them right now), so I’m replying here rather than opening the separate thread the pinned triage post asks for.Reporting in the format that post requests:
Hosting provider: SiteGround — no Cloudflare, no WAF or security plugin active Royal MCP version: 1.5.2 (Free) Stack: WordPress 7.1.1, PHP 8.2.33, permalinks
/%postname%/Client: claude.ai custom connector, added from Claude Cowork Exact error text:Authorization with AutumnSpring WP Site failed. You can check your credentials and permissions. If this persists, share this reference with support: “ofid_0e5516bb59e34e50”
(earlier attempt:
ofid_47849260bd262c53) This is neither Class A nor Class BThe pinned triage post defines Class A as the “Unknown client_id / application has not been registered” authorization error, and Class B as “can’t reach the connector” / reconnect prompts. Mine is neither. Registration succeeds, the consent screen appears and is approved, the code is issued — and then the client reports a generic authorization failure. It may be worth adding a third class for this. Activity Log —
oauth:*rowsThree attempts. Timestamps appear to be UTC. Attempt Time Logged
oauth:token1 + 2 Sep 20, 01:55 4 ×oauth:registerSUCCESS, 2 ×oauth:authorizeSUCCESS none — Sep 20, 02:14oauth:resetSUCCESS — deleted 9 clients, 0 tokens, 2 auth codes — 3 Sep 20, 02:21 2 ×oauth:registerSUCCESS, 1 ×oauth:authorizeSUCCESS noneZero access tokens have ever been issued by this server. Authorization codes are issued and never redeemed. Reset OAuth State, then retried on a completely clean slate — identical result. So this is deterministic, not stale registration state.
Attempt 3 detail, clean state:
POST /register ip 160.79.106.181 user_agent "python-httpx/0.28.1" → 201 client_registered — "Dynamic client registered." POST /authorize ip 174.178.141.207 user_agent "Mozilla/5.0 (Macintosh…) Chrome" client_id "rmcp_82d3…4070" → 302 code_issued — "Authorization code issued; redirecting to client callback." POST /token → no log row at allRoyal MCP does its part correctly — registers the client, issues the code, redirects to the client callback. The token request is simply never made. The host-blocking diagnosis does not hold for this site
The conclusion recorded in this thread — and in the general troubleshooting guidance — is that a host security layer silently drops the server-to-server token request, because it comes from a datacenter IP with a
python-httpxUser-Agent and therefore leaves no trace. @videoanimate already showed that apython-httpxUser-Agent reached their server fine. My Activity Log falsifies the host-blocking explanation outright for my install, from the server side rather than by curl simulation.The
POST /registerabove came frompython-httpx/0.28.1at an Anthropic backend IP and returned a clean 201, minutes before the token call was due. A separateGET /tokenfrom another Anthropic IP (34.162.191.81, UAClaude-User/1.0) was received and correctly answered405 — "This endpoint only accepts POST requests."So Anthropic’s infrastructure demonstrably reaches these endpoints, and the edge is not interfering. Anyone sent to their host on this basis may be chasing the wrong thing — I lost several hours to it. A useful triage step would be: check the Activity Log for a
/registersuccess frompython-httpxfirst. If it’s there, the host is not blocking.For completeness, I’ve filed this with Anthropic as well — it matches an open client-side bug report (
anthropics/claude-ai-mcp#1028, “server-side OAuth flow completes successfully, but Claude never calls /token”), where another reporter showed the same server works with MCP Inspector as a reference client. One thing on Royal MCP’s side that may be worth fixingWhile investigating I found an RFC 9728 gap. I’m not claiming it causes the above, but it is real:
/.well-known/oauth-authorization-server → 200 ✓ /.well-known/oauth-protected-resource → 200 ✓ /.well-known/oauth-protected-resource/<resource-path> → 404 ✗The path-suffixed protected-resource metadata URL —
https://autumnspring.co/.well-known/oauth-protected-resource/wp-json/royal-mcp/v1/mcp— returns 404. Only the bare path is served, and it declares:{ "resource": "https://autumnspring.co/wp-json/royal-mcp/v1", "authorization_servers": ["https://autumnspring.co"], "bearer_methods_supported": ["header"], "scopes_supported": ["mcp:full"] }The declared
resourceis…/royal-mcp/v1, but the MCP Server URL the settings page tells users to configure is…/royal-mcp/v1/**mcp**. Those are different URIs. Under RFC 8707 — which the MCP authorization spec requires — the client sendsresource=<canonical endpoint URI>with the authorization and token requests, and a strict client can reject a mismatch. Anthropic’s own connector compliance checklist lists all three well-known endpoints above as needing to return 200.Suggested fix: serve the PRM at the path-suffixed URL as well as the bare one, and have
resourcereturn the full configured endpoint including/mcp. Two smaller notes1.
wp_get_plugin_settingsredaction is misleading. Called via MCP for slugroyal-mcp, it returns:"oauth_client_id": "[REDACTED]", "oauth_client_secret": "[REDACTED]"Both fields are actually empty — the admin UI shows the “Leave empty for Dynamic Client Registration” placeholder. The redaction masks by key name regardless of whether a value exists, so the tool can’t distinguish “set” from “empty.” That sent me down a wrong diagnostic path for a while. Returning
""ornullwhen empty would fix it.2. WebMCP status badge. With “Enable browser agents (WebMCP)” ON, the settings page shows
WebMCP bridge status: unknown — could not reach discovery path. Haven’t investigated; flagging in case it points at the same discovery routing as the PRM issue above.Happy to run any diagnostic against this install and share the full Activity Log.
Forum: Fixing WordPress
In reply to: link quicktagI posted a feature request at: http://mosquito.wordpress.org/view.php?id=622
Forum: Fixing WordPress
In reply to: link quicktagYes, I now understand. I do wish for the two-dialog-box method, but that is just from habit.
Thanks for resolving this so quickly.
Forum: Fixing WordPress
In reply to: link quicktagI’ve made you a 6 for good measure. I also made sure that any registered member can post.
I appreciate your help.
Forum: Fixing WordPress
In reply to: link quicktagI’m using WP 1.2.2. In IVPB, when you click on “link” you receive 2 consecutive dialog boxes, one for the actual URL, and one for the text that you want that URL to read as in the post.
When I click on “link” in WP1.2.2 I get only the first box for the URL, and upon clicking OK it inserts code like this into the post:
[less than]a href=”http://wordpress.org/support/rss.php?topic=19920″%5Bgreater than] (I had to interpolate the < and >) without prompting me for any other input. When I publish the post with that code, it appears blank (as a single space).My install is at http://zealousagenda.com/blog. There is where you can see that when I paste a URL into the post, it does not turn into a link like it is doing with this post. The only link that is working properly is the one that the upload engine gave to me, that I pasted into the post.
Yes, Javascript is enabled.
Thanks for your quick reply.