8.2 The auth gap and how to bridge it

OpenAI’s connector form does not offer “API Key” or “Bearer token” as an authentication mode. As of early 2026 the choices are:

ModeWhat it meansWorks with OwnSona?
No authChatGPT sends no Authorization header.Only with mitigation; see below.
OAuthFull OAuth 2.1 + PKCE flow against the MCP server.No — OwnSona v1 has no OAuth endpoints.
MixedHybrid; behavior driven by the 401 WWW-Authenticate response.Worth trying first.

Four practical paths:

8.2.1 Option A: skip the ChatGPT UI

Use OwnSona only from the Responses API (see Responses API), where you can attach Authorization: Bearer <token> directly. Lowest-friction option that keeps the bearer-token security model intact. Recommended until OAuth lands.

8.2.2 Option B: try Mixed first

Pick Mixed in the connector form and save. OwnSona returns 401 Unauthorized with WWW-Authenticate: Bearer realm="ownsona", which is the standard signal for “this resource needs a bearer token.” Some ChatGPT versions follow that signal and prompt for a token. Paste OWNSONA_API_TOKEN and it works.

If ChatGPT instead reports an OAuth discovery failure (no /.well-known/oauth-authorization-server endpoint exists), fall back to options C or D.

Unverified for any specific ChatGPT version — the UI evolves.

8.2.3 Option C: No auth + token in URL (recommended for single-user)

Pick No auth in the connector form, but include the bearer token as a ?token= query parameter in the connector URL:

https://ownsona.example.com/mcp?token=<OWNSONA_API_TOKEN>

OwnSona’s authenticate() looks for the token in the Authorization header and falls back to the token query parameter, so this works alongside the API path without breaking anything.

Security tradeoff. A token in a query string is logged by web servers in places a header is not — by default Tomcat’s AccessLogValve writes the full request line including the query. OwnSona mitigates this by setting the AccessLogValve pattern to "%m %U %H" (method, URI without query, protocol) instead of "%r". Verify after deploy that localhost_access_log.<today>.txt shows POST /mcp HTTP/2.0 with no token= substring.

The remaining exposure is human factors: the connector URL is now a secret. Don’t paste it into Slack, screenshots, or shared docs.

8.2.4 Option D: OAuth proxy (proper fix)

Front OwnSona with an OAuth-capable proxy (Cloudflare Access, oauth2-proxy, Pomerium). ChatGPT does the OAuth dance with the proxy, the bearer token flows through to OwnSona transparently. Spec-compliant but more infrastructure.