文章目录
使用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 安装项目依赖
- 创建net core web api项目
- 安装以下nuget包(在vs中双击项目,复制粘贴即可)
- 创建一个名为 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能力使应用在处理自然语言理解和数据交互上更加高效!