Skip to content

Commit dbbc6ce

Browse files
authored
Merge pull request #2 from sacha-development-stuff/codex/review-and-implement-client-credentials-support
Fix auth registration for client credentials
2 parents 66c7e67 + 813168a commit dbbc6ce

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/mcp/server/auth/handlers/register.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,20 @@ async def handle(self, request: Request) -> Response:
7474
),
7575
status_code=400,
7676
)
77-
if set(client_metadata.grant_types) != {"authorization_code", "refresh_token"}:
77+
grant_types_set = set(client_metadata.grant_types)
78+
valid_sets = [
79+
{"authorization_code", "refresh_token"},
80+
{"client_credentials"},
81+
]
82+
83+
if grant_types_set not in valid_sets:
7884
return PydanticJSONResponse(
7985
content=RegistrationErrorResponse(
8086
error="invalid_client_metadata",
81-
error_description="grant_types must be authorization_code "
82-
"and refresh_token",
87+
error_description=(
88+
"grant_types must be authorization_code and refresh_token "
89+
"or client_credentials"
90+
),
8391
),
8492
status_code=400,
8593
)

tests/server/fastmcp/auth/test_auth_integration.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,9 +1001,31 @@ async def test_client_registration_invalid_grant_type(
10011001
assert error_data["error"] == "invalid_client_metadata"
10021002
assert (
10031003
error_data["error_description"]
1004-
== "grant_types must be authorization_code and refresh_token"
1004+
== (
1005+
"grant_types must be authorization_code and "
1006+
"refresh_token or client_credentials"
1007+
)
1008+
)
1009+
1010+
@pytest.mark.anyio
1011+
async def test_client_registration_client_credentials(
1012+
self, test_client: httpx.AsyncClient
1013+
):
1014+
client_metadata = {
1015+
"redirect_uris": ["https://client.example.com/callback"],
1016+
"client_name": "CC Client",
1017+
"grant_types": ["client_credentials"],
1018+
}
1019+
1020+
response = await test_client.post(
1021+
"/register",
1022+
json=client_metadata,
10051023
)
10061024

1025+
assert response.status_code == 201, response.content
1026+
client_info = response.json()
1027+
assert client_info["grant_types"] == ["client_credentials"]
1028+
10071029

10081030
class TestAuthorizeEndpointErrors:
10091031
"""Test error handling in the OAuth authorization endpoint."""

0 commit comments

Comments
 (0)