调用公共MCP服务

在之前的章节中,我们利用百度地图 API 实现了天气和路况查询,参考:第三方API设计工具

为了写好天气和路况查询这两个AI工具,你需要查阅大量官方文档,绞尽脑汁去设计工具的描述和参数 Schema,还要自己写底层 HTTP 请求的转发。而百度地图其实有非常庞大的功能库,如果你想把它的全部功能都手工封装成 AI 工具,工作量可想而知。

有没有一种可能:别人已经把现成的工具库搭好了,你只需要让你的 AI 去直接“消费”它就行了?

有的,那就是MCP服务。

如果你经常关注 AI 领域的动态,最近一定频繁听到一个词:MCP(Model Context Protocol,模型上下文协议)。

很多人把它称作“AI的USB接口”。以前大模型只能靠自己脑子里的知识回答问题;而有了MCP,AI就能像插上 U 盘一样,瞬间拥有调用各种外部工具的能力——比如查地图、订机票、读数据库、发邮件。

这就引出了一个问题:作为开发者,我们该如何让 Foxtable 里的 AI 用上这些外部能力?

其实,体验 MCP 最简单的方式,不是从零开始自己造轮子,而是直接去“消费”别人已经搭好的成熟服务。本节我们将以百度地图 MCP 服务为例,手把手教你用LLMCaller配合HttpClient,让AI直接拥有“查地点、规划路线、算距离”的超能力。

这也是我们在后续章节中,真正动手“自己搭建MCP服务端”之前,最好的一次“消费者视角”的实战演练。

本教程以百度地图为例, 实际上几乎所有的大厂都会提供MCP服务,包括支付宝、微信、小红书、12306、阿里云、高德地图、GitHub等等,

准备工作

在开始之前,请先访问百度地图API的官网:https://lbsyun.baidu.com/

你需要在这个网站创建一个账户,然后登录并创建一个API Key(AK)。

注意 创建百度AK时,务必勾选服务列表里的MCP(SSE)。如果不勾选,后面的请求会直接被拒绝。

核心原理

我们之前设计工具的时候,要分为两步,分别是工具的定义和工具的执行。

MCP服务本质是工具服务,只是工具的定义和工具的执行逻辑都在服务端,而作为客户端的我们要做的是:

1、从MCP服务端拉取所有工具定义。

2、将AI对工具的调用转发给MCP服务端(工具名和参数),从服务端获取结果

服务端是一个Web服务,路径"tools/list"用于拉取工具定义,路径"tools/call"用于工具的执行。

参考代码

以下是调用百度地图MCP服务的参考代码,可直接在命令窗口执行:

' 1. 初始化 LLMCaller
Dim
baiduAk As String = "bYDdADrPUCNkSAID9bJU70EF8Iy5htGu" ' 你的百度应用密钥
Dim
deepseekKey As String = "sk-a734b83536da45e9aedc3e42605bfb3a" ' 你的DeepSeek密钥
Dim
caller As New LLMCaller("https://api.deepseek.com/chat/completions", "deepseek-chat", deepseekKey)
caller.Messages =
New JArray()
caller.SystemPrompt =
"你是一个智能出行助手。你可以调用百度地图工具来查询地点、规划路线、获取天气等。请根据用户需求自主选择合适的工具。"  

' 2. 拉取并注册百度地图的工具列表
Dim
mcpUrl As String = "https://mcp.map.baidu.com/mcp?ak=" & baiduAk ' 百度地图的MCP访问地址
Dim
hc As New HttpClient(mcpUrl)
hc.SkipError =
True
hc.ContentType =
"application/json"
hc.Headers.Add(
"Accept", "application/json, text/event-stream")  ' 声明客户端支持的数据格式
hc.Content =
<![CDATA[
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}
]]>
.Value
Dim
listResp As String = hc.GetData()
Dim
listJson As JObject = JsonConvert.DeserializeObject(listResp)
Dim
mcpTools As JArray = listJson("result")("tools")
caller.AddMCPTools(mcptools)
'将MCP工具注册到LLMCaller

' 3.
将工具转发给百度MCP执行
caller.ToolExecutor =

Function
(ttoolName As String, targs As JObject) As String
  
Dim callReq As New JObject From {
        {
"jsonrpc", "2.0"},
        {
"id", Rand.NextString(10)},
        {
"method", "tools/call"},
        {
"params", New JObject From {{"name", ttoolName}, {"arguments", targs}}}
    }
    hc = hc.Clone
'虽然设置相同,但Foxtable的HttpClient不能复用,需要克隆使用
    hc.Content = callReq.ToString()
   
Dim resp As String = hc.GetData()
   
Dim respJson As JObject = JsonConvert.DeserializeObject(resp)
   
If respJson("result") IsNot Nothing AndAlso respJson("result")("content") IsNot Nothing Then
       
Dim content As JArray = respJson("result")("content")
       
If content.Count > 0 Then
           
Return content(0)("text").ToString()
       
End If
   
End If
   
Return "百度地图 MCP 调用失败:" & vbCrLf & ttoolName & vbCrLf & targs.ToString() & vbCrLf & resp
End
Function  

' 4. 发起提问
caller.UserMessage =
"帮我查一下从北京天安门到故宫的步行路线,大概需要走多久?"
'Output.Show(caller.GetRequestBody()) '
你可以恢复这行代码,通过输出可以看到所谓的MCP和我们手写工具是一回事
If
caller.GetResult() Then
    MessageBoxA.Show(caller.Result)

Else

    MessageBoxA.Show(caller.Error)

End
If 

小提示: 转发工具给MCP执行的时候,建议工具id采用随机字符串,避免异步串号。

底层发生了什么?


当你运行这段代码时,你会惊叹于大模型的自主决策能力:

AI 查目录:AI 看到 SystemPrompt 里说“你可以调用百度地图工具”,它查看了 LLMCaller 里动态注册的 10 个工具。

AI 选工具:看到“步行路线”四个字,AI 自动选中了 map_directions(路线规划)工具。

AI 填参数:AI 自动把“北京天安门”填为起点,“故宫”填为终点,“步行”填为出行方式,并自动生成了对应的坐标参数。

执行转发:ToolExecutor 截获这个请求,用 HttpClient 发给百度地图 MCP。

返回结果:百度地图返回了具体的距离和时间,ToolExecutor 转交给 AI,AI 最后用自然语言总结给你听:“为您查到从北京天安门到故宫的步行路线信息......”

这种架构的巨大优势

1、零硬编码:上述代码没有硬编码百度有哪些工具。所以不管百度未来是加 10 个还是 100 个工具,这段代码都不需要改一行字,AI 会自动读取最新的工具列表并完美适配。

2、生态无缝切换:不仅是百度,你可以把任何支持 MCP 的公共服务接进来,比如高德地图、12306、甚至 GitHub 官方的 MCP。代码结构完全一样,只需换个 URL 和 AK 即可。


本页地址:http://www.foxtable.com/webhelp/topics/7239.htm