-
Notifications
You must be signed in to change notification settings - Fork 0
Client Compatibility
This page tracks client-facing expectations. Treat live client behavior as drift-prone and re-test before claiming support after OAuth or discovery changes.
| Client | Expected behavior |
|---|---|
| Claude.ai custom connector | OAuth + MCP discovery; a client with the write scope should see the full write/build/diagnostic tool set (everything except the four admin-gated Hugo lifecycle tools) after authenticated reconnect |
| Claude Desktop | Connects to https://mcp.arleo.eu/mcp with MCP-compatible discovery |
| ChatGPT custom connector | Compatible MCP client; actual tool availability is plan-dependent. The tested Plus account currently stops after initialize; see Pitfall ChatGPT Plus MCP Availability
|
| Le Chat custom connector | OAuth flow and scoped tool access, same 3-tier (read/write/admin) model as the other clients |
| MCP Inspector | Anonymous read-only MCP inspection |
Correction (v1.9.2 docs pass). This page previously said "since #450 there is no separate admin scope" — that described the model before #1039/#1050 extended it to a genuine three-tier
read/write/admin.adminis now a separately-approved tier on top ofwrite, gating only the four managed Hugo binary lifecycle tools (stage_hugo_upgrade,activate_hugo,rollback_hugo,bootstrap_hugo) — it does not narrow or replacewrite. See OAuth Clients and Scopes and Scope and Tool Matrix for the current, authoritative model.
Use the MCP endpoint for MCP clients:
https://mcp.arleo.eu/mcp
OAuth issuer:
https://mcp.arleo.eu
Do not configure the MCP endpoint as https://mcp.arleo.eu unless a client explicitly expects the issuer/base URL. /mcp is the JSON-RPC MCP endpoint.
If Claude connects but only shows anonymous/read-only tools:
- Remove and recreate the connector to clear client-side cache.
- Confirm the OAuth flow grants the intended scope.
- Confirm
tools/listis called withAuthorization: Bearer .... - Confirm
/mcpresponses include cache controls that prevent an anonymous tool list from being reused for an authenticated request. - Confirm admin tools are gated by the token scope, not by
client_idalone.
Useful headers for /mcp:
Cache-Control: no-store
Vary: Authorization
WWW-Authenticate: Bearer ...
ChatGPT redirect URI handling is strict. Do not allow arbitrary redirect URIs to fix a client issue.
Expected policy:
- accepted: known HTTPS callbacks for ChatGPT
- rejected: HTTP, similar malicious hosts, unknown domains, wrong paths
- unknown DCR clients: no write/admin escalation
Known issue (2026-08-20): ChatGPT shows "not all authorizations granted" / empty Actions despite a fully successful server-side connection
Reproduced live against hugo-vm, both with the pre-existing connector and
a freshly created one (manually-configured chatgpt-write OAuth client,
not DCR). Symptom in the ChatGPT UI: an orange "Hugo MCP on www.arleo.eu
est connecté, mais toutes les autorisations demandées n'ont pas été
accordées" banner, then "Actions: Aucune action de l'application n'est
disponible pour le moment" — zero tools ever show up, and asking the model
to use the connector gets an honest "I can't find it in the tools
available to this runtime" from ChatGPT itself.
Every layer up to and including MCP session creation is confirmed
correct server-side. journalctl -u mcp-hugo-server-go for the exact
window of a reconnect attempt shows this pattern repeat 5 times in one
session, every single time ending in success:
POST /mcp (no Authorization header) -> 401 missing_bearer (expected: RFC 6750 §3.1 discovery trigger)
GET .well-known/oauth-protected-resource -> 200
GET .well-known/oauth-authorization-server -> 200
GET .well-known/openid-configuration -> 404 (expected, see [[Pitfall openid-configuration 404]])
mcp: session created scope=write rank=1 -> POST /mcp -> 200
Also confirmed: the freshly-created connector correctly requested
scope=read write (current canonical form, checkboxes shown directly in
ChatGPT's own connector setup UI: read ✓, write ✓, admin ☐) — ruling out
an earlier theory that ChatGPT was requesting stale pre-#450 legacy scope
strings.
The actual gap: in every one of these 5 cycles, exactly one POST /mcp
request is logged (the initialize call) and then nothing — no follow-up
tools/list ever arrives. ChatGPT's client appears to treat the
successful initialize response as the end of the attempt and never
continues the MCP handshake to ask for tools. The server logs cannot reveal
which client-side eligibility or validation check causes that decision.
Update (same day, confirmed via a second reproduction and a control
test): re-tested with a fully fresh Dynamic Client Registration
connector (not the pre-registered chatgpt-write static client). DCR
itself worked correctly — POST /register succeeded, scope=read write admin was correctly clamped to read (DCR-registered clients get a
read-only ceiling by design), token issued, session created, 200
returned. 35 seconds later, ChatGPT restarted the entire OAuth+MCP
handshake from scratch — fresh discovery, fresh /authorize, fresh
token exchange, fresh session — rather than continuing the session it
already had with a tools/list call. Same one-POST /mcp-then-nothing
pattern both times.
Control test, same server, same time window: MCPJam
(a dedicated MCP debugging client) ran the identical flow — discovery,
DCR, scope=read write admin clamped to read (identical clamping
behavior), PKCE, token — and then made multiple real follow-up POST /mcp calls with actual processing time (25ms, 30ms, one GET /mcp at
331ms), successfully retrieving tools/resources/prompts. MCPJam's own
summary: "0 warnings, 0 errors — everything proceeded as expected."
Binary-identity check (the strongest evidence here): the operator
pushed back that this connector "was working fine a while ago" — a fair
challenge, since a claim of "client bug" needs to survive that. Checked:
/usr/local/bin/mcp-hugo-server-go on hugo-vm had mtime 2026-08-16
17:19, unchanged, right up until this investigation. journalctl
confirms a real, complete, successful session for this exact
chatgpt-write client on 2026-08-17 06:53:59 — authorize ->
token -> session created -> multiple /mcp calls ->
tool_call: get_capabilities -> success. The regular refresh_token
cadence (every few hours) continues cleanly through 2026-08-17
22:49:39, then stops; the next entry is a fresh authorize on
2026-08-20 07:43:20, and every attempt from that point on (5+,
across the static client, a fresh DCR client, and multiple ChatGPT UI
retries) exhibits the broken one-request-then-abandon pattern described
above.
Since the server binary is byte-for-byte unchanged between the last known-good session (Aug 17) and the first observed failure (Aug 20), the server cannot be the source of the behavior change — there is no code or config diff to point to. Whatever changed happened in that ~2-day gap on the client side. The ChatGPT connector UI shows "Nom de la version: dev mode" / "Statut de l'examen: development" (OpenAI's Apps SDK connector framework, still actively evolving) — consistent with a client-side update landing in that window.
Status: ChatGPT remains a compatible MCP client, but the tested ChatGPT Plus account is not currently usable. The unchanged server binary bracketing a known-good session and the first-observed-broken session proves that this was not introduced by a server release. It does not establish the behavior of Pro, Business, Enterprise, or Edu accounts. Nothing under this project's control was found broken across the pre-registered static client, a fresh DCR client, or the MCPJam control test. Suggested next steps if revisited: (1) file feedback via help.openai.com as ChatGPT's own error banner suggests, including this exact log pattern, the Aug 17-vs-Aug 20 comparison, and the MCPJam control-test contrast; (2) if OpenAI ships an updated connector client, re-test with a fresh connector before assuming it's fixed.
OpenAI's public documentation is inconsistent as of 2026-08-20: its developer-mode guide lists Plus among eligible accounts, while the Help Center availability article limits full MCP to Business/Enterprise/Edu, describes Pro as read/fetch-only, and omits Plus. See Pitfall ChatGPT Plus MCP Availability for the concise operator decision tree.
Run:
SMOKE_LIVE=1 ./scripts/smoke-agent-interop.shOptional bearer-token checks should be provided via environment variables and must never be printed in logs:
READ_BEARER=REDACTED ADMIN_BEARER=REDACTED SMOKE_LIVE=1 ./scripts/smoke-agent-interop.shBefore sharing output publicly, redact any bearer token, authorization code, client secret, or cookie.