调用公共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 即可。