# AttributeError: 'BYOAccessTokenOAuthConfig' object has no attribute 'client_id'

**TL;DR:** Remove the placeholder JIRA_OAUTH_ACCESS_TOKEN or CONFLUENCE_OAUTH_ACCESS_TOKEN env value, or drop the full OAuth client config; do not set both. The placeholder switches the server into bring-your-own-token mode, which has no client_id, and the per-user path crashes reading it. Upgrading to a patched version also guards the read with a fallback.

## The error

```
AttributeError: 'BYOAccessTokenOAuthConfig' object has no attribute 'client_id'
```

## Fix it

1. Search your server env for JIRA_OAUTH_ACCESS_TOKEN or CONFLUENCE_OAUTH_ACCESS_TOKEN placeholders.
   Expected: You find a placeholder value set.
2. Check whether full OAuth client_id, client_secret, redirect_uri are also set.
   Expected: Both are set, which is the conflict.
3. Remove the placeholder token values (or the full client config, whichever you do not use).
   Expected: Only one auth mode remains configured.
4. Restart the server and retry the tool call.
   Expected: The AttributeError is gone.

## When this applies

mcp-atlassian raises this exact AttributeError on tool calls in a per-user OAuth deployment where placeholder access tokens were left in the env.

## When this does NOT apply

If the error names a different missing attribute, read which config is absent. Plain 401s are auth, not this crash.

## Tool compatibility

sooperset/mcp-atlassian, per-user OAuth deployments

## Also seen as

- BYOAccessTokenOAuthConfig client_id
- mcp-atlassian OAuth AttributeError
- placeholder OAuth token conflict

## Why it happens

Setting a placeholder *_OAUTH_ACCESS_TOKEN makes the global config a BYOAccessTokenOAuthConfig, which lacks client_id and friends. The per-request code reads those fields directly and crashes. The fix guards the read and treats the conflict as config error.

## Edge cases

- Docker env files often carry stale placeholders; audit them.
- The per-request OAuth proxy path is the one that crashes; single-user mode may look fine.
- After removing the placeholder, delete the stored session so the old config is not reused.