Move functionality out of IMcpClient/Server into extensions (#60)

This commit is contained in:
Stephen Toub 2025-03-13 07:55:06 -04:00 • committed by GitHub
commit 67320b22d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 1042 additions and 708 deletions

View file

@ -1,6 +1,6 @@
using McpDotNet.Protocol.Types;
using McpDotNet.Protocol.Messages;
using McpDotNet.Protocol.Types;
using McpDotNet.Server;
using Moq;
namespace McpDotNet.Tests.Server;
@ -10,8 +10,7 @@ public class McpServerDelegatesTests
public void Applies_All_Given_Delegates()
{
var container = new McpServerDelegates();
var server = new Mock<IMcpServer>();
server.SetupAllProperties();
var server = new ExposeSetHandlersServer();
container.ListToolsHandler = (p, c) => Task.FromResult(new ListToolsResult());
container.CallToolHandler = (p, c) => Task.FromResult(new CallToolResponse());
@ -23,16 +22,33 @@ public class McpServerDelegatesTests
container.SubscribeToResourcesHandler = (s, c) => Task.CompletedTask;
container.UnsubscribeFromResourcesHandler = (s, c) => Task.CompletedTask;
container.Apply(server.Object);
container.Apply(server);
Assert.Equal(container.ListToolsHandler, server.Object.ListToolsHandler);
Assert.Equal(container.CallToolHandler, server.Object.CallToolHandler);
Assert.Equal(container.ListPromptsHandler, server.Object.ListPromptsHandler);
Assert.Equal(container.GetPromptHandler, server.Object.GetPromptHandler);
Assert.Equal(container.ListResourcesHandler, server.Object.ListResourcesHandler);
Assert.Equal(container.ReadResourceHandler, server.Object.ReadResourceHandler);
Assert.Equal(container.GetCompletionHandler, server.Object.GetCompletionHandler);
Assert.Equal(container.SubscribeToResourcesHandler, server.Object.SubscribeToResourcesHandler);
Assert.Equal(container.UnsubscribeFromResourcesHandler, server.Object.UnsubscribeFromResourcesHandler);
Assert.Equal(container.ListToolsHandler, server.Handlers[OperationNames.ListTools]);
Assert.Equal(container.CallToolHandler, server.Handlers[OperationNames.CallTool]);
Assert.Equal(container.ListPromptsHandler, server.Handlers[OperationNames.ListPrompts]);
Assert.Equal(container.GetPromptHandler, server.Handlers[OperationNames.GetPrompt]);
Assert.Equal(container.ListResourcesHandler, server.Handlers[OperationNames.ListResources]);
Assert.Equal(container.ReadResourceHandler, server.Handlers[OperationNames.ReadResource]);
Assert.Equal(container.GetCompletionHandler, server.Handlers[OperationNames.GetCompletion]);
Assert.Equal(container.SubscribeToResourcesHandler, server.Handlers[OperationNames.SubscribeToResources]);
Assert.Equal(container.UnsubscribeFromResourcesHandler, server.Handlers[OperationNames.UnsubscribeFromResources]);
}
private sealed class ExposeSetHandlersServer : IMcpServer
{
public Dictionary<string, Delegate> Handlers = [];
public void SetOperationHandler(string operationName, Delegate handler) => Handlers[operationName] = handler;
public ValueTask DisposeAsync() => default;
public bool IsInitialized => throw new NotImplementedException();
public ClientCapabilities? ClientCapabilities => throw new NotImplementedException();
public Implementation? ClientInfo => throw new NotImplementedException();
public IServiceProvider? ServiceProvider => throw new NotImplementedException();
public void AddNotificationHandler(string method, Func<JsonRpcNotification, Task> handler) => throw new NotImplementedException();
public Task SendMessageAsync(IJsonRpcMessage message, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public Task<T> SendRequestAsync<T>(JsonRpcRequest request, CancellationToken cancellationToken) where T : class => throw new NotImplementedException();
public Task StartAsync(CancellationToken cancellationToken = default) => throw new NotImplementedException();
}
}

View file

@ -273,7 +273,7 @@ public class McpServerTests
await Can_Handle_Requests(null, "completion/complete",
configureServer: server =>
{
server.GetCompletionHandler = (request, ct) =>
server.SetGetCompletionHandler((request, ct) =>
{
return Task.FromResult(new CompleteResult
{
@ -284,7 +284,7 @@ public class McpServerTests
HasMore = true
}
});
};
});
},
assertResult: response =>
{
@ -305,13 +305,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Resources = new() }, "resources/list",
configureServer: server =>
{
server.ListResourcesHandler = (request, ct) =>
server.SetListResourcesHandler((request, ct) =>
{
return Task.FromResult(new ListResourcesResult
{
Resources = [new() { Uri = "test", Name = "Test Resource" }]
});
};
});
},
assertResult: response =>
@ -337,13 +337,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Resources = new() }, "resources/read",
configureServer: server =>
{
server.ReadResourceHandler = (request, ct) =>
server.SetReadResourceHandler((request, ct) =>
{
return Task.FromResult(new ReadResourceResult
{
Contents = [new() { Text = "test" }]
});
};
});
},
assertResult: response =>
{
@ -368,13 +368,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Prompts = new() }, "prompts/list",
configureServer: server =>
{
server.ListPromptsHandler = (request, ct) =>
server.SetListPromptsHandler((request, ct) =>
{
return Task.FromResult(new ListPromptsResult
{
Prompts = [new() { Name = "test" }]
});
};
});
},
assertResult: response =>
{
@ -399,13 +399,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Prompts = new() }, "prompts/get",
configureServer: server =>
{
server.GetPromptHandler = (request, ct) =>
server.SetGetPromptHandler((request, ct) =>
{
return Task.FromResult(new GetPromptResult
{
Description = "test"
});
};
});
},
assertResult: response =>
{
@ -428,13 +428,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Tools = new() }, "tools/list",
configureServer: server =>
{
server.ListToolsHandler = (request, ct) =>
server.SetListToolsHandler((request, ct) =>
{
return Task.FromResult(new ListToolsResult
{
Tools = [new() { Name = "test" }]
});
};
});
},
assertResult: response =>
{
@ -458,13 +458,13 @@ public class McpServerTests
await Can_Handle_Requests(new ServerCapabilities { Tools = new() }, "tools/call",
configureServer: server =>
{
server.CallToolHandler = (request, ct) =>
server.SetCallToolHandler((request, ct) =>
{
return Task.FromResult(new CallToolResponse
{
Content = [new Content { Text = "test" }]
});
};
});
},
assertResult: response =>
{