BerriAI/litellm · error · ValueError
OAuth2 token response for MCP server '{server.server_id}' re
Error message
OAuth2 token response for MCP server '{server.server_id}' returned non-object JSON (got {type(body).__name__}) What it means
The client-credentials token endpoint returned 2xx but response.json() parsed to a non-dict (list, string, number). It is a malformed-upstream-response type check; the cached-token path refuses to index into it and raises instead.
Source
Thrown at litellm/proxy/_experimental/mcp_server/oauth2_token_cache.py:160
verbose_logger.debug(
"Fetching OAuth2 client_credentials token for MCP server %s",
server.server_id,
)
try:
response: Final = await client.post(server.token_url, data=data, headers=token_request.headers or None)
response.raise_for_status()
except httpx.HTTPStatusError as exc:
raise ValueError(
f"OAuth2 token request for MCP server '{server.server_id}' "
f"failed with status {exc.response.status_code}"
) from exc
body: Final = response.json()
if not isinstance(body, dict):
raise ValueError(
f"OAuth2 token response for MCP server '{server.server_id}' "
f"returned non-object JSON (got {type(body).__name__})"
)
access_token: Final = body.get("access_token")
if not access_token:
raise ValueError(f"OAuth2 token response for MCP server '{server.server_id}' missing 'access_token'")
# Safely parse expires_in — providers may return null or non-numeric values
raw_expires_in: Final = body.get("expires_in")
try:
expires_in = int(raw_expires_in) if raw_expires_in is not None else MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL
except (TypeError, ValueError):
expires_in = MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL
ttl: Final = max(
expires_in - MCP_OAUTH2_TOKEN_EXPIRY_BUFFER_SECONDS,
MCP_OAUTH2_TOKEN_CACHE_MIN_TTL,View on GitHub (pinned to 77b7c6c40c)
Solutions
- Check the upstream token endpoint; it must return a JSON object.
- Log the raw response to diagnose.
Example fix
Inspect token endpoint response body.
Defensive patterns
Strategy: type-guard
When it happens
Trigger: Thrown at litellm/proxy/_experimental/mcp_server/oauth2_token_cache.py:160 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/64ecb6ac52bd4b2d.
Report an issue: GitHub.