Skip to content

Commit f9e88ee

Browse files
committed
Update tool call authorization failures to throw an McpException
1 parent d29040f commit f9e88ee

2 files changed

Lines changed: 17 additions & 21 deletions

File tree

src/ModelContextProtocol.AspNetCore/AuthorizationFilterSetup.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,7 @@ private void ConfigureCallToolFilter(McpServerOptions options)
7878
var authResult = await GetAuthorizationResultAsync(context.User, context.MatchedPrimitive, context.Services, context);
7979
if (!authResult.Succeeded)
8080
{
81-
return new CallToolResult
82-
{
83-
Content = [new TextContentBlock { Text = "Access forbidden: This tool requires authorization." }],
84-
IsError = true
85-
};
81+
throw new McpException("Access forbidden: This tool requires authorization.", McpErrorCode.InvalidRequest);
8682
}
8783

8884
context.Items[AuthorizationFilterInvokedKey] = true;

tests/ModelContextProtocol.AspNetCore.Tests/AuthorizeAttributeTests.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ public async Task Authorize_Tool_RequiresAuthentication()
3535
await using var app = await StartServerWithAuth(builder => builder.WithTools<AuthorizationTestTools>());
3636

3737
var client = await ConnectAsync();
38-
var result = await client.CallToolAsync(
39-
"authorized_tool",
40-
new Dictionary<string, object?> { ["message"] = "test" },
41-
cancellationToken: TestContext.Current.CancellationToken);
4238

43-
// Should return error because tool requires authorization but user is anonymous
44-
Assert.True(result.IsError ?? false);
45-
var content = Assert.Single(result.Content.OfType<TextContentBlock>());
46-
Assert.Equal("Access forbidden: This tool requires authorization.", content.Text);
39+
var exception = await Assert.ThrowsAsync<McpException>(async () =>
40+
await client.CallToolAsync(
41+
"authorized_tool",
42+
new Dictionary<string, object?> { ["message"] = "test" },
43+
cancellationToken: TestContext.Current.CancellationToken));
44+
45+
Assert.Equal("Request failed (remote): Access forbidden: This tool requires authorization.", exception.Message);
46+
Assert.Equal(McpErrorCode.InvalidRequest, exception.ErrorCode);
4747
}
4848

4949
[Fact]
@@ -100,15 +100,15 @@ public async Task AuthorizeWithRoles_Tool_RequiresAdminRole()
100100
await using var app = await StartServerWithAuth(builder => builder.WithTools<AuthorizationTestTools>(), "TestUser", "User");
101101

102102
var client = await ConnectAsync();
103-
var result = await client.CallToolAsync(
104-
"admin_tool",
105-
new Dictionary<string, object?> { ["message"] = "test" },
106-
cancellationToken: TestContext.Current.CancellationToken);
107103

108-
// Should return error because tool requires Admin role but user only has User role
109-
Assert.True(result.IsError ?? false);
110-
var content = Assert.Single(result.Content.OfType<TextContentBlock>());
111-
Assert.Equal("Access forbidden: This tool requires authorization.", content.Text);
104+
var exception = await Assert.ThrowsAsync<McpException>(async () =>
105+
await client.CallToolAsync(
106+
"admin_tool",
107+
new Dictionary<string, object?> { ["message"] = "test" },
108+
cancellationToken: TestContext.Current.CancellationToken));
109+
110+
Assert.Equal("Request failed (remote): Access forbidden: This tool requires authorization.", exception.Message);
111+
Assert.Equal(McpErrorCode.InvalidRequest, exception.ErrorCode);
112112
}
113113

114114
[Fact]

0 commit comments

Comments
 (0)