使用Mcp客户端,直接调用Stdio类型的MCP服务

main
bicijinlian 3 weeks ago
parent 165bf19f2a
commit bb30b9d04c

@ -1,47 +1,59 @@
using System.Diagnostics; namespace McpStudy.McpClient;
using System.Threading.Tasks;
using ModelContextProtocol;
using ModelContextProtocol.Client;
using ModelContextProtocol.AspNetCore;
namespace McpStudy.McpClient;
internal class Program internal class Program
{ {
static async Task Main(string[] args) static async Task Main(string[] args)
{ {
Console.WriteLine("调用MCP服务器示例"); Console.WriteLine("调用MCP服务示例");
await CallStdioAsync();
await Task.CompletedTask; await Task.CompletedTask;
} }
static async Task CallStdio() /// <summary>
/// 使用Mcp客户端直接调用Stdio类型的MCP服务
///
/// </summary>
/// <returns></returns>
static async Task CallStdioAsync()
{ {
Console.WriteLine($"开始调用 Studio 类型的MCP服务......{System.Environment.NewLine}");
var clientTransport = new StdioClientTransport(new StdioClientTransportOptions var clientTransport = new StdioClientTransport(new StdioClientTransportOptions
{ {
Name = "Everything", Name = "Everything",
Command = "npx", Command = "dotnet",
Arguments = ["-y", "@modelcontextprotocol/server-everything"], Arguments = ["run", "--project", "E:\\软件项目\\学习项目\\AI学习\\McpStudy\\McpStudy.McpServerStdio\\McpStudy.McpServerStdio.csproj"],
}); });
var client = await McpClientFactory.CreateAsync(clientTransport);
// Print the list of tools available from the server. Console.WriteLine("创建客户端......");
foreach (var tool in await client.ListToolsAsync()) IMcpClient client = await McpClientFactory.CreateAsync(clientTransport);
Console.WriteLine($"创建客户端完成{System.Environment.NewLine}");
Console.WriteLine("列举MCP服务中可用的工具......");
foreach (McpClientTool tool in await client.ListToolsAsync())
{ {
Console.WriteLine($"{tool.Name} ({tool.Description})"); Console.WriteLine($"工具名称:{tool.Name} 工具描述:({tool.Description})");
} }
Console.WriteLine($"列举完成{System.Environment.NewLine}");
Console.WriteLine("调用Echo工具......");
CallToolResult result = await client.CallToolAsync
(
toolName: "Echo",
arguments: new Dictionary<string, object?>() { ["message"] = "Hello MCP!" },
cancellationToken: CancellationToken.None
);
Console.Write("Echo工具结果");
var content = result.Content.First(c => c.Type == "text") as TextContentBlock;
Console.WriteLine(content?.Text);
Console.WriteLine($"调用完成{System.Environment.NewLine}");
// Execute a tool (this would normally be driven by LLM tool invocations).
var result = await client.CallToolAsync(
"echo",
new Dictionary<string, object?>() { ["message"] = "Hello MCP!" },
cancellationToken: CancellationToken.None);
// echo always returns one and only one text content object Console.WriteLine("调用 Studio 类型的MCP服务结束");
Console.WriteLine(result.Content.First(c => c.Type == "text").ToString());
} }
} }

Loading…
Cancel
Save