Forum Replies Created

Viewing 6 replies - 1 through 6 (of 6 total)
  • 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-site entry: mcp-remote in claude_desktop_config.json with a static Authorization: Bearer header. 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_health a 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 /register 201 from Anthropic’s own python-httpx client, host-layer blocking is dead twice over. This is web-connector-specific. 2. For your SiteGround rig — root .well-known is NOT blocked here

    Worth 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_document support, issuer https://autumnspring.co, endpoints at /authorize, /token, /register, PKCE S256, scopes ["mcp:full"].

    So whatever drove SiteGround installs into your ticket queue, it isn’t a blanket block of root .well-known on 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 on

    wp_get_plugin_settings empty-vs-set redaction. Exact repro — call it with plugin_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_id and oauth_client_secret are both empty — the admin UI shows the “Leave empty for Dynamic Client Registration” placeholder for both. But they render identically to api_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 "" or null when 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 API is 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_aab3a46ce11eebb2 thread — where wp_check_filetype() returned false on a Photon-suffixed icon URL and Claude rejected the response as a generic auth error — is the reason I flagged the PRM resource mismatch 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 both ofid_ 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 B

    The 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:* rows

    Three attempts. Timestamps appear to be UTC. Attempt Time Logged oauth:token 1 + 2 Sep 20, 01:55 4 × oauth:register SUCCESS, 2 × oauth:authorize SUCCESS none — Sep 20, 02:14 oauth:reset SUCCESS — deleted 9 clients, 0 tokens, 2 auth codes — 3 Sep 20, 02:21 2 × oauth:register SUCCESS, 1 × oauth:authorize SUCCESS none

    Zero 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 all
    

    Royal 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-httpx User-Agent and therefore leaves no trace. @videoanimate already showed that a python-httpx User-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 /register above came from python-httpx/0.28.1 at an Anthropic backend IP and returned a clean 201, minutes before the token call was due. A separate GET /token from another Anthropic IP (34.162.191.81, UA Claude-User/1.0) was received and correctly answered 405 — "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 /register success from python-httpx first. 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 fixing

    While 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 resource is …/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 sends resource=<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 resource return the full configured endpoint including /mcp. Two smaller notes

    1. wp_get_plugin_settings redaction is misleading. Called via MCP for slug royal-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 "" or null when 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 quicktag
    Thread Starter zealousagenda

    (@zealousagenda)

    I posted a feature request at: http://mosquito.wordpress.org/view.php?id=622

    Forum: Fixing WordPress
    In reply to: link quicktag
    Thread Starter zealousagenda

    (@zealousagenda)

    Yes, 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 quicktag
    Thread Starter zealousagenda

    (@zealousagenda)

    I’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 quicktag
    Thread Starter zealousagenda

    (@zealousagenda)

    I’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.

Viewing 6 replies - 1 through 6 (of 6 total)