一个.NET实现的模型上下文协议(MCP),使.NET应用程序能够连接到并与MCP客户端和服务器进行交互。

什么是MCP
模型上下文协议(MCP)是一种开放协议,它规范了应用程序如何为大型语言模型(LLM)提供上下文。它实现了大型语言模型与各种数据源和工具之间的安全集成。

.net相关的包
mcpdotnet: .NET的核心MCP实现
McpDotNet.Extensions.AI:与 Microsoft.Extensions.AI 的集成

设计目标
这个库旨在提供一个干净、符合规范的MCP协议实现,尽量减少额外的抽象。虽然传输实现必然包含额外的代码,但它们尽可能遵循官方SDK所确立的模式。

特点
.NET应用程序的MCP实现
支持stdio和SSE传输(客户端)
支持stdio传输(服务器)
支持所有MCP功能:工具、资源、提示、采样、根
支持补全实用功能
支持服务器指令、分页和通知
全程采用异步/等待模式
全面的日志记录支持
兼容.NET 8.0及更高版本

代码示例:
1.客户端
首先安装mcpdotnet:
dotnet add package mcpdotnet
然后创建一个客户端,并开始使用您配置的服务器上的工具或其他功能:
var options = new McpClientOptions()
{ ClientInfo = new() { Name = “TestClient”, Version = “1.0.0” } };

var config = new McpServerConfig
{
Id = “everything”,
Name = “Everything”,
TransportType = TransportTypes.StdIo,
TransportOptions = new Dictionary<string, string>
{
[“command”] = “npx”,
[“arguments”] = “-y @modelcontextprotocol/server-everything”,
}
};

var factory = new McpClientFactory(
[config],
options,
NullLoggerFactory.Instance
);

var client = await factory.GetClientAsync(“everything”);

// Get the list of tools, for passing to an LLM
var tools = await client.ListToolsAsync();

// Execute a tool, in practice this would normally be driven by LLM tool invocations
var result = await client.CallToolAsync(
“echo”,
new Dictionary<string, object>
{
[“message”] = “Hello MCP!”
},
CancellationToken.None
);

// echo always returns one and only one text content object
Console.WriteLine(result.Content.FirstOrDefault(c => c.Type == “text”).Text);
请注意,您应该根据您的使用场景传递适合的CancellationToken对象,以便实现适当的错误处理、超时等功能。强烈建议您在工厂构造函数中传递一个适当的LoggerFactory实例,以便记录MCP客户端的操作日志。请记住,您可以连接到任何MCP服务器,而不仅限于使用mcpdotnet创建的服务器。该协议设计为与服务器无关,因此您可以使用此库连接到任何符合规范的服务器。

2.服务端
以下是一个如何创建MCP服务器并注册当前应用程序中的所有工具的示例。
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddMcpServer()
.WithStdioServerTransport()
.WithTools()

var app = builder.Build();

await app.RunAsync();
EchoTool类是一个工具实现的简单示例:
[McpToolType]
public static class EchoTool
{
[McpTool(Description = “Echoes the input back to the client.”)]
public static string Echo([McpParameter(true)] string message)
{
return "hello " + message;
}
}
以下是一个如何手动创建一个包含单个工具的MCP服务器的示例。
McpServerOptions options = new McpServerOptions()
{
ServerInfo = new Implementation() { Name = “MyServer”, Version = “1.0.0” },
Capabilities = new ServerCapabilities()
{
Tools = new()
}
};
McpServerFactory factory = new McpServerFactory(new StdioServerTransport(“MyServer”, loggerFactory), options, loggerFactory);
IMcpServer server = factory.CreateServer();

server.ListToolsHandler = (request, cancellationToken) =>
{
return Task.FromResult(new ListToolsResult()
{
Tools =
[
new Tool()
{
Name = “echo”,
Description = “Echoes the input back to the client.”,
InputSchema = new JsonSchema()
{
Type = “object”,
Properties = new Dictionary<string, JsonSchemaProperty>()
{
[“message”] = new JsonSchemaProperty() { Type = “string”, Description = “The input to echo back.” }
}
},
}
]
});
};

server.CallToolHandler = async (request, cancellationToken) =>
{
if (request.Name == “echo”)
{
if (request.Arguments is null || !request.Arguments.TryGetValue(“message”, out var message))
{
throw new McpServerException(“Missing required argument ‘message’”);
}
return new CallToolResponse()
{
Content = [new Content() { Text = "Echo: " + message.ToString(), Type = “text” }]
};
}
else
{
throw new McpServerException($“Unknown tool: {request.Name}”);
}
};

await server.StartAsync();

// Run until process is stopped by the client (parent process)
while (true)
{
await Task.Delay(1000);
}
路线图:
扩展文档,提供以下方面的详细指南:
1.高级场景(采样、资源、提示)
2.传输配置
3.错误处理和恢复
增加测试覆盖率
添加更多示例和样本
性能优化
SSE服务器支持
身份验证

欢迎加入C#技术交流群,私信我!

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐