使用Semantic Kernel调用高德MCP服务

使用Semantic Kernel调用高德MCP Server

在当今快速发展的技术领域,人工智能(AI)的应用正在不断拓展和深化。为了更好地将AI模型与各种数据源和工具连接起来,模型上下文协议(Model Context Protocol, MCP) 应运而生。MCP是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。本文将详细介绍如何将MCP工具与 语义内核(Semantic Kernel) 集成,并调用高德MCP Server 查询天气、行政区划等接口,演示更强大的AI功能。

一、简介

高德地图的MCP服务涵盖了从位置服务、地点信息搜索、路径规划到天气查询等诸多出行领域的核心数据。2025年3月首发,5月全新升级后,它与高德地图APP实现了无缝打通,这使得开发者能够借助它为用户打造从出行规划到实际执行的全流程服务,让用户轻松拥有专属的“出行秘书”。
Semantic Kernel是一个用于构建AI应用的框架,能够帮助开发者将自然语言处理等AI能力与现有的应用程序或服务相结合。通过它,我们可以更自然地与高德MCP服务交互,让应用在理解和使用出行数据上更智能、更高效。
在这里插入图片描述

二、实战:使用SK调用高德MCP Server

2.1 创建应用和Key

访问高德开发者平台,创建应用和接口调用Key。 点击查看 应用和Key创建步骤
在这里插入图片描述

2.2 安装项目依赖

  1. 创建net core web api项目
  2. 安装以下nuget包(在vs中双击项目,复制粘贴即可)
  3. 创建一个名为 MCPController 的控制器
<PackageReference Include="Microsoft.SemanticKernel" Version="1.53.0" />
<PackageReference Include="ModelContextProtocol.AspNetCore" Version="0.1.0-preview.4" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Core" Version="1.51.0-preview" />
<PackageReference Include="Microsoft.KernelMemory.SemanticKernelPlugin" Version="0.95.241216.2" />
<PackageReference Include="Microsoft.SemanticKernel.Agents.Core" Version="1.51.0" />
<PackageReference Include="ModelContextProtocol" Version="0.2.0-preview.1" />
<PackageReference Include="ModelContextProtocol-SemanticKernel" Version="0.0.1-preview-15" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

在这里插入图片描述

2.3 注入ILoggerFactory

// 注入ILoggerFactory,这样sk会调用调用日志,这样可以知道是用了模型原生能力还是mcp server
private readonly ILoggerFactory _loggerFactory;
public MCPController(ILoggerFactory loggerFactory)
{
    _loggerFactory = loggerFactory;
}

2.4 获取高德mcp服务工具列表

通过mcp client获取到高德提供的mcp 服务工具列表,如:天气、定位、规划等


/// <summary>
/// 获取高德mcp服务工具列表
/// </summary>
/// <returns></returns>
[HttpGet("GetGaodeToolsAsync")]
public async Task<IActionResult> GetGaodeToolsAsync()
{
    /// 定义SSE传输选项
    var options = new SseClientTransportOptions { Endpoint = new Uri($"{gaode_endpoint}?key={gaode_key}") };
    
    // 创建MCP客户端
    await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(new SseClientTransport(options));
    // 获取工具列表
    var tools = await mcpClient.ListToolsAsync();
    int index = 1;
    //构建输出高德mcp服务工具列表
    string toolJson = "";
    foreach (var tool in tools)
    {
        toolJson += $"{index++}. {tool.Name}{tool.Description}\n\n";

    }

    return Ok(toolJson);

}

在这里插入图片描述

2.5 调用高德mcp服务

[HttpGet]
public async Task<IActionResult> Get(string prompt = "广州今天天气如何?未来几天呢?输出要携带日期")
{
    
    // 1. 构建内核与MCP工具内核函数
    var builder = Kernel.CreateBuilder();

    // 2. 注入llm和日志记录服务
    builder.Services
        .AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace))
        .AddOpenAIChatCompletion(
            modelId: "glm-4-flash",//注 这里可以替换为其他国内外模型
            endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),
            apiKey: "YOUR KEY");

    // 3. 构建内核
    Kernel kernel = builder.Build();

    // 4. 配置自动执行函数。
    var settings = new OpenAIPromptExecutionSettings
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
    };
    
    //5. 注入高德mcp服务
    await kernel.Plugins.AddMcpFunctionsFromSseServerAsync("gaode mcp", $"{gaode_endpoint}?key={gaode_key}",loggerFactory: _loggerFactory);
    //var prompt = "特朗普2025年出现了什么事情?";

    // 6. 执行问答,调用结果
    var result = await kernel.InvokePromptAsync(prompt, new(settings)).ConfigureAwait(false);
    return Ok($"\n\n{prompt}\n{result}");
}
2.5.1 获取广州天气

可以看到有gaode mcp 相关的打印,如下图(注:今天是5-22,所以下面输出的日期也是对的)
在这里插入图片描述

2.5.2 获取广州坐标

在这里插入图片描述
在这里插入图片描述

2.5.3 原生能力:询问大模型如何使用python

可以看到,这里返回的是原生模型的能力,而不是高德mcp server的,大模型会自己去理解是否需要调用mcp server。
在这里插入图片描述

2.6 完整示例代码


[Route("api/[controller]")]
[ApiController]
public class MCPController : ControllerBase
{

    private readonly ILoggerFactory _loggerFactory;
    public MCPController(ILoggerFactory loggerFactory)
    {
        _loggerFactory = loggerFactory;
    }
    /// <summary>
    /// 高德mcp服务 API密钥
    /// </summary>
    private string gaode_key = "YOUR KEY";
    /// <summary>
    /// 高德mcp服务地址
    /// </summary>
    private string gaode_endpoint = "https://mcp.amap.com/sse";
#pragma warning disable SKEXP0010

	[HttpGet]
	public async Task<IActionResult> Get(string prompt = "广州今天天气如何?未来几天呢?输出要携带日期")
	{
    
	    // 1. 构建内核与MCP工具内核函数
	    var builder = Kernel.CreateBuilder();
	
	    // 2. 注入llm和日志记录服务
	    builder.Services
	        .AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace))
	        .AddOpenAIChatCompletion(
	            modelId: "glm-4-flash",//注 这里可以替换为其他国内外模型
	            endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),
	            apiKey: "YOUR KEY");
	
	    // 3. 构建内核
	    Kernel kernel = builder.Build();
	
	    // 4. 配置自动执行函数。
	    var settings = new OpenAIPromptExecutionSettings
	    {
	        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
	    };
	    
	    //5. 注入高德mcp服务
	    await kernel.Plugins.AddMcpFunctionsFromSseServerAsync("gaode mcp", $"{gaode_endpoint}?key={gaode_key}",loggerFactory: _loggerFactory);
	    //var prompt = "特朗普2025年出现了什么事情?";
	
	    // 6. 执行问答,调用结果
	    var result = await kernel.InvokePromptAsync(prompt, new(settings)).ConfigureAwait(false);
	    return Ok($"\n\n{prompt}\n{result}");
	}
	
	/// <summary>
	/// 获取高德mcp服务工具列表
	/// </summary>
	/// <returns></returns>
	[HttpGet("GetGaodeToolsAsync")]
	public async Task<IActionResult> GetGaodeToolsAsync()
	{
	    /// 定义SSE传输选项
	    var options = new SseClientTransportOptions { Endpoint = new Uri($"{gaode_endpoint}?key={gaode_key}") };
	    
	    // 创建MCP客户端
	    await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(new SseClientTransport(options));
	    // 获取工具列表
	    var tools = await mcpClient.ListToolsAsync();
	    int index = 1;
	    //构建输出高德mcp服务工具列表
	    string toolJson = "";
	    foreach (var tool in tools)
	    {
	        toolJson += $"{index++}. {tool.Name}{tool.Description}\n\n";
	
	    }
	
	    return Ok(toolJson);
	
	}
}

三、 总结

通过Semantic Kernel调用高德MCP服务,开发者能够以一种更为灵活和智能的方式为用户提供出行相关的服务。这种方式不仅能够充分发挥高德MCP服务的强大功能,还能借助Semantic Kernel的AI能力使应用在处理自然语言理解和数据交互上更加高效!

<think>我们正在讨论的是如何使用Swagger或OpenAPI来调用MCP服务。根据引用,MCP Server项目可以通过SemanticKernel将swagger.json加载成Plugins,而Auto MCP项目则可以将OpenAPI/Swagger定义转换为MCP服务器。因此,我们可以通过以下步骤来实现: 1. **准备Swagger/OpenAPI定义**:首先需要有一个Swagger或OpenAPI的规范文件(通常是JSON或YAML格式),该文件描述了你的API。 2. **使用Auto MCP转换**:根据引用[2],Auto MCP可以将OpenAPI/Swagger定义转换为MCP服务器。因此,我们可以使用Auto MCP工具来生成MCP服务器。具体步骤可能包括: - 安装Auto MCP工具(如果它是开源的,我们可以从源代码构建或下载二进制文件)。 - 运行Auto MCP命令行工具,指定Swagger文件路径和上游端点(即实际API的地址)等参数,生成MCP服务器。 3. **在代码中集成MCP服务**:根据引用[1],我们可以使用SemanticKernel的OpenApi插件功能来加载Swagger文件。在C#项目中,我们可以添加相应的NuGet包(如`Microsoft.SemanticKernel.Plugins.OpenApi`)并编写代码来加载Swagger文件,将其作为插件使用。 4. **启动MCP服务器**:生成的MCP服务器将作为中间层,接收MCP协议的请求(通过STDIO或SSE),然后将其转换为对上游API的HTTP请求,并将响应转换回MCP协议。 5. **通过Swagger UI测试**:一旦MCP服务器运行起来,我们可以使用Swagger UI(如果MCP服务器暴露了Swagger端点)来测试API调用。或者,我们可以直接使用MCP客户端(支持MCP协议的工具)来调用服务。 下面是一个简化的步骤示例: **步骤1:准备Swagger文件** 假设我们有一个`swagger.json`文件,描述了我们的API。 **步骤2:使用Auto MCP转换** 安装Auto MCP工具(具体安装方法需要参考其文档),然后运行命令: ```bash automcp generate --input swagger.json --output mcp-server --upstream http://my-api-endpoint ``` 这将生成一个MCP服务器项目(或可执行文件)。 **步骤3:运行MCP服务器** 进入生成的`mcp-server`目录,根据文档启动服务器。例如: ```bash cd mcp-server ./mcp-server ``` **步骤4:在客户端调用MCP服务** 客户端可以通过MCP协议(STDIO或SSE)与MCP服务器通信。例如,使用curl发送SSE请求(如果服务器支持SSE): ```bash curl -N http://localhost:8080/mcp/events ``` 或者,使用支持MCP协议的客户端库。 **代码集成示例(引用[1])** 如果你想在C#项目中直接集成,可以使用SemanticKernel的OpenApi插件: ```csharp using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Plugins.OpenApi; var kernel = Kernel.CreateBuilder().Build(); var openApiPlugin = await kernel.ImportPluginFromOpenApiAsync("MyPlugin", "path/to/swagger.json"); ``` 然后,你就可以通过kernel调用插件中定义的操作了。 **注意事项**: - 确保MCP服务器配置了正确的上游端点(即你的API实际运行的地址)。 - 根据MCP服务器的文档,可能需要配置其他参数,如认证信息等。 以上步骤基于引用中提供的信息。由于具体项目文档可能更详细,建议参考Auto MCPSemanticKernel的官方文档。 §§相关问题§§ 1. Auto MCP工具的具体安装和使用步骤是什么? 2. 如何在SemanticKernel中加载Swagger文件并调用API? 3. MCP协议与HTTP协议之间是如何转换的? 4. 如何配置MCP服务器的认证和安全性? 5. MCP服务器支持哪些传输方式(如STDIO、SSE)?如何选择?</think>### 如何使用 Swagger/OpenAPI 调用 MCP 服务 根据引用内容,使用 Swagger/OpenAPI 调用 MCP 服务的核心是通过 **Auto MCP** 工具将 OpenAPI 规范转换为 MCP 服务器,实现 AI 模型与 API 的无缝集成。以下是具体步骤: --- #### 步骤 1:准备 OpenAPI/Swagger 定义 1. 确保已有规范的 OpenAPI 文件(`swagger.json` 或 `swagger.yaml`),描述目标 API 的端点、参数和响应格式。 2. 示例结构: ```json { "openapi": "3.0.0", "paths": { "/api/users": { "get": { "summary": "获取用户列表", "responses": { ... } } } } } ``` --- #### 步骤 2:安装 Auto MCP 工具 1. 创建 .NET 项目并添加关键 NuGet 包(引用[1]): ```xml <ItemGroup> <PackageReference Include="Microsoft.SemanticKernel.Plugins.OpenApi" Version="1.47.0" /> <PackageReference Include="ModelContextProtocol" Version="0.1.0-preview.11" /> </ItemGroup> ``` 2. 安装 Auto MCP 工具(引用[2]): ```bash dotnet tool install --global AutoMCP ``` --- #### 步骤 3:转换 OpenAPI 为 MCP 服务器 1. 使用 Auto MCP 生成 MCP 服务路由(引用[2]): ```bash automcp generate --input ./swagger.json --output ./mcp-server ``` 2. 关键参数: - `--input`:OpenAPI 文件路径 - `--upstream`:指定实际 API 的上游端点(如 `http://your-api.com`) - `--transport`:选择通信方式(`stdio` 或 `sse`) --- #### 步骤 4:集成 Semantic Kernel 在代码中加载生成的 MCP 插件(引用[1][3]): ```csharp using Microsoft.SemanticKernel; var kernel = Kernel.CreateBuilder().Build(); // 将 MCP 服务作为插件加载 var openApiPlugin = await kernel.ImportPluginFromOpenApiAsync( "MCPPlugin", Path.Combine("mcp-server", "routes.json") ); // 调用示例:AI 通过自然语言操作 API var result = await kernel.InvokeAsync( openApiPlugin["GetUsers"], new() { ["input"] = "搜索北京的用户" } ); ``` --- #### 步骤 5:运行和测试 1. 启动 MCP 服务器: ```bash cd mcp-server dotnet run ``` 2. 通过 Swagger UI 测试: - 访问 `http://localhost:8080/swagger` 查看生成的接口文档 - 直接调用 MCP 路由(如 `POST /mcp/invoke` 发送 JSON 请求) --- ### 关键机制说明 1. **协议转换**(引用[2]) MCP 服务器将接收的 MCP 协议请求(如自然语言指令)实时转换为标准的 HTTP API 请求,并转发到上游服务。 $$ \text{AI 指令} \xrightarrow{\text{MCP 协议}} \text{HTTP 请求} \xrightarrow{} \text{上游 API} $$ 2. **动态路由** 根据 OpenAPI 定义自动生成路由,无需手动编写控制器代码[^2]。 3. **语义解析** Semantic Kernel 将自然语言转换为 API 调用参数(如 `"北京"` → `location=Beijing`)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值