Skip to content

Commit f2e31ca

Browse files
committed
json fix
1 parent 36d1e0d commit f2e31ca

File tree

2 files changed

+25
-26
lines changed

2 files changed

+25
-26
lines changed

src/mcp/client/auth.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -137,19 +137,19 @@ async def _discover_protected_resource_metadata(self, server_url: str) -> Protec
137137
if response.status_code == 404:
138138
return None
139139
response.raise_for_status()
140-
metadata_json = response.json()
141-
logger.debug(f"Protected resource metadata discovered: {metadata_json}")
142-
return ProtectedResourceMetadata.model_validate(metadata_json)
140+
metadata = ProtectedResourceMetadata.model_validate_json(response.content)
141+
logger.debug(f"Protected resource metadata discovered: {metadata}")
142+
return metadata
143143
except TypeError:
144144
# Retry without MCP header for CORS compatibility
145145
try:
146146
response = await client.get(url)
147147
if response.status_code == 404:
148148
return None
149149
response.raise_for_status()
150-
metadata_json = response.json()
151-
logger.debug(f"Protected resource metadata discovered (no MCP header): {metadata_json}")
152-
return ProtectedResourceMetadata.model_validate(metadata_json)
150+
metadata = ProtectedResourceMetadata.model_validate_json(response.content)
151+
logger.debug(f"Protected resource metadata discovered (no MCP header): {metadata}")
152+
return metadata
153153
except Exception:
154154
logger.exception("Failed to discover protected resource metadata")
155155
return None
@@ -172,19 +172,19 @@ async def _discover_oauth_metadata(self, server_url: str) -> OAuthMetadata | Non
172172
if response.status_code == 404:
173173
return None
174174
response.raise_for_status()
175-
metadata_json = response.json()
176-
logger.debug(f"OAuth metadata discovered: {metadata_json}")
177-
return OAuthMetadata.model_validate(metadata_json)
175+
metadata = OAuthMetadata.model_validate_json(response.content)
176+
logger.debug(f"OAuth metadata discovered: {metadata}")
177+
return metadata
178178
except Exception:
179179
# Retry without MCP header for CORS compatibility
180180
try:
181181
response = await client.get(url)
182182
if response.status_code == 404:
183183
return None
184184
response.raise_for_status()
185-
metadata_json = response.json()
186-
logger.debug(f"OAuth metadata discovered (no MCP header): {metadata_json}")
187-
return OAuthMetadata.model_validate(metadata_json)
185+
metadata = OAuthMetadata.model_validate_json(response.content)
186+
logger.debug(f"OAuth metadata discovered (no MCP header): {metadata}")
187+
return metadata
188188
except Exception:
189189
logger.exception("Failed to discover OAuth metadata")
190190
return None
@@ -230,9 +230,9 @@ async def _register_oauth_client(
230230
response=response,
231231
)
232232

233-
response_data = response.json()
234-
logger.debug(f"Registration successful: {response_data}")
235-
return OAuthClientInformationFull.model_validate(response_data)
233+
client_info = OAuthClientInformationFull.model_validate_json(response.content)
234+
logger.debug(f"Registration successful: {client_info}")
235+
return client_info
236236

237237
except httpx.HTTPStatusError:
238238
raise
@@ -439,7 +439,7 @@ async def _exchange_code_for_token(self, auth_code: str, client_info: OAuthClien
439439
raise Exception(f"Token exchange failed: {response.status_code} {response.text}")
440440

441441
# Parse token response
442-
token_response = OAuthToken.model_validate(response.json())
442+
token_response = OAuthToken.model_validate_json(response.content)
443443

444444
# Validate token scopes
445445
await self._validate_token_scopes(token_response)
@@ -493,7 +493,7 @@ async def _refresh_access_token(self) -> bool:
493493
return False
494494

495495
# Parse refreshed tokens
496-
token_response = OAuthToken.model_validate(response.json())
496+
token_response = OAuthToken.model_validate_json(response.content)
497497

498498
# Validate token scopes
499499
await self._validate_token_scopes(token_response)

tests/client/test_auth.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ async def test_discover_oauth_metadata_success(self, oauth_provider, oauth_metad
199199

200200
mock_response = Mock()
201201
mock_response.status_code = 200
202-
mock_response.json.return_value = metadata_response
202+
mock_response.content = oauth_metadata.model_dump_json()
203203
mock_client.get.return_value = mock_response
204204

205205
result = await oauth_provider._discover_oauth_metadata("https://api.example.com/v1/mcp")
@@ -240,7 +240,7 @@ async def test_discover_oauth_metadata_cors_fallback(self, oauth_provider, oauth
240240
# First call fails (CORS), second succeeds
241241
mock_response_success = Mock()
242242
mock_response_success.status_code = 200
243-
mock_response_success.json.return_value = metadata_response
243+
mock_response_success.content = oauth_metadata.model_dump_json()
244244

245245
mock_client.get.side_effect = [
246246
TypeError("CORS error"), # First call fails
@@ -263,7 +263,7 @@ async def test_register_oauth_client_success(self, oauth_provider, oauth_metadat
263263

264264
mock_response = Mock()
265265
mock_response.status_code = 201
266-
mock_response.json.return_value = registration_response
266+
mock_response.content = oauth_client_info.model_dump_json()
267267
mock_client.post.return_value = mock_response
268268

269269
result = await oauth_provider._register_oauth_client(
@@ -291,7 +291,7 @@ async def test_register_oauth_client_fallback_endpoint(self, oauth_provider, oau
291291

292292
mock_response = Mock()
293293
mock_response.status_code = 201
294-
mock_response.json.return_value = registration_response
294+
mock_response.content = oauth_client_info.model_dump_json()
295295
mock_client.post.return_value = mock_response
296296

297297
# Mock metadata discovery to return None (fallback)
@@ -447,15 +447,14 @@ async def test_get_or_register_client_register_new(self, oauth_provider, oauth_c
447447
async def test_exchange_code_for_token_success(self, oauth_provider, oauth_client_info, oauth_token):
448448
"""Test successful code exchange for token."""
449449
oauth_provider._code_verifier = "test_verifier"
450-
token_response = oauth_token.model_dump(by_alias=True, mode="json")
451450

452451
with patch("httpx.AsyncClient") as mock_client_class:
453452
mock_client = AsyncMock()
454453
mock_client_class.return_value.__aenter__.return_value = mock_client
455454

456455
mock_response = Mock()
457456
mock_response.status_code = 200
458-
mock_response.json.return_value = token_response
457+
mock_response.content = oauth_token.model_dump_json()
459458
mock_client.post.return_value = mock_response
460459

461460
with patch.object(oauth_provider, "_validate_token_scopes") as mock_validate:
@@ -502,7 +501,7 @@ async def test_refresh_access_token_success(self, oauth_provider, oauth_client_i
502501

503502
mock_response = Mock()
504503
mock_response.status_code = 200
505-
mock_response.json.return_value = token_response
504+
mock_response.content = new_token.model_dump_json()
506505
mock_client.post.return_value = mock_response
507506

508507
with patch.object(oauth_provider, "_validate_token_scopes") as mock_validate:
@@ -925,7 +924,7 @@ async def test_discover_protected_resource_metadata_success(self, oauth_provider
925924
# Mock successful response
926925
mock_response = Mock()
927926
mock_response.status_code = 200
928-
mock_response.json.return_value = protected_resource_metadata.model_dump(mode="json")
927+
mock_response.content = protected_resource_metadata.model_dump_json()
929928
mock_client.get.return_value = mock_response
930929

931930
result = await oauth_provider._discover_protected_resource_metadata("https://resource.example.com/mcp")
@@ -985,7 +984,7 @@ def mock_get_side_effect(*args, **kwargs):
985984
# Second call without header - success
986985
mock_response = Mock()
987986
mock_response.status_code = 200
988-
mock_response.json.return_value = protected_resource_metadata.model_dump(mode="json")
987+
mock_response.content = protected_resource_metadata.model_dump_json()
989988
return mock_response
990989

991990
mock_client.get.side_effect = mock_get_side_effect

0 commit comments

Comments
 (0)