Skip to content

Commit 153faa3

Browse files
Add casing testing for non-templated resource lookups.
1 parent fee0573 commit 153faa3

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

src/ModelContextProtocol.Core/Server/AIFunctionMcpServerResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ private AIFunctionMcpServerResource(AIFunction function, ResourceTemplate resour
359359
return null;
360360
}
361361
}
362-
else if (request.Params.Uri != ProtocolResource!.Uri)
362+
else if (new Uri(request.Params.Uri) != new Uri(ProtocolResource!.Uri))
363363
{
364364
return null;
365365
}

tests/ModelContextProtocol.Tests/Server/McpServerResourceTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,17 @@ public async Task UriTemplate_NonMatchingUri_ReturnsNull(string uri)
269269
TestContext.Current.CancellationToken));
270270
}
271271

272+
[Theory]
273+
[InlineData("resource://MyCoolResource", "resource://mycoolresource")]
274+
[InlineData("resource://MyCoolResource{?arg1}", "resource://mycoolresource?arg1=42")]
275+
public async Task UriTemplate_IsHostCaseInsensitive(string actualUri, string queriedUri)
276+
{
277+
McpServerResource t = McpServerResource.Create(() => "resource", new() { UriTemplate = actualUri });
278+
Assert.NotNull(await t.ReadAsync(
279+
new RequestContext<ReadResourceRequestParams>(new Mock<IMcpServer>().Object) { Params = new() { Uri = queriedUri } },
280+
TestContext.Current.CancellationToken));
281+
}
282+
272283
[Fact]
273284
public void MimeType_DefaultsToOctetStream()
274285
{

0 commit comments

Comments
 (0)