LangChain4j(20)——调用百度地图MCP服务
申请百度地图服务
控制台 | 百度地图开放平台
创建应用:
注意:勾选MCP服务,白名单直接设置为0.0.0.0/0
百度地图MCP服务介绍
MCP Server | 百度地图API SDK
-
地理编码
map_geocode
- 将地址解析为对应的位置坐标
- 输入:
address
地址信息 - 输出:
location
-
逆地理编码
map_reverse_geocode
- 将坐标点转换为对应语义化地址
- 输入:
location
经纬度坐标 - 输出:
formatted_address
,uid
,addressComponent
-
地点检索
map_search_places
- 多种场景的地点以及POI检索, 包括城市检索、圆形区域检索
- 输入:
query
检索关键词location
圆形检索的中心点radius
圆形检索的半径region
城市检索指定城市
- 输出: POI列表, 包含
name
,location
,address
等
-
地点详情检索
map_place_details
- 根据POI的uid, 检索POI详情信息
- 输入:
uid
- 输出: POI详情, 包含
name
,location
,address
,brand
,price
等
-
批量算路
map_distance_matrix
- 根据起点和终点坐标, 计算所有起终点组合间的路线距离和行驶时间
- 输入:
origins
起点经纬度列表destinations
终点经纬度列表mode
出行类型,可选取值包括driving
,walking
,riding
, 默认使用driving
- 输出: 每条路线的耗时和距离, 包含
distance
,duration
等
-
路线规划
map_directions
- 根据起终点坐标规划出行路线和耗时, 可指定驾车、步行、骑行、公交等出行方式
- 输入:
origin
起点经纬度destination
终点经纬度model
出行类型, 可选取值包括driving
,walking
,riding
,transit
, 默认使用driving
- 输出: 路线详情,包含
steps
,distance
,duration
等
-
天气查询
map_weather
- 根据行政区划编码或经纬度坐标查询天气 (通过
location
经纬度坐标查询天气需用户拥有高级权限) - 输入:
district_id
行政区划编码location
经纬度坐标
- 输出: 天气信息, 包含
temperature
,weather
,wind
等
- 根据行政区划编码或经纬度坐标查询天气 (通过
-
IP定位
map_ip_location
- 根据请求的IP获取当前请求的位置 (定位到城市), 如果请求参数ip为IPv6则需要高级权限
- 输入:
ip
请求的IP地址 - 输出: 当前所在城市和城市中点
location
-
实时路况查询
map_road_traffic
- 查询实时交通拥堵情况, 可通过指定道路名和区域形状(矩形, 多边形, 圆形)进行实时路况查询。
- 输入:
model
路况查询类型 (可选值包括road
,bound
,polygon
,around
, 默认使用road
)road_name
道路名称和道路方向,model=road
时必传 (如:朝阳路南向北
)city
城市名称或城市adcode,model=road
时必传 (如:北京市
)bounds
区域左下角和右上角的经纬度坐标,model=bound
时必传 (如:39.912078,116.464303;39.918276,116.475442
)vertexes
多边形区域的顶点经纬度坐标,model=polygon
时必传 (如:39.910528,116.472926;39.918276,116.475442;39.916671,116.459056;39.912078,116.464303
)center
圆形区域的中心点经纬度坐标,model=around
时必传 (如:39.912078,116.464303
)radius
圆形区域的半径(米), 取值[1,1000]
,model=around
时必传 (如:200
)
- 输出: 路况信息, 包含
road_name
,traffic_condition
等
-
POI智能提取
map_poi_extract
- 需要高级权限才可使用, 根据文本内容提取POI相关信息。
- 输入:
text_content
用于提取POI的文本描述信息 (完整的旅游路线,行程规划,景点推荐描述等文本内容, 例如: 新疆独库公路和塔里木湖太美了, 从独山子大峡谷到天山神秘大峡谷也是很不错的体验) - 输出:相关的POI信息,包含
name
,location
等
通过Stdio方式调用
{"mcpServers": {"baidu-map": {"command": "npx","args": ["-y","@baidumap/mcp-server-baidu-map"],"env": {"BAIDU_MAP_API_KEY": "{您的AK}"}}}
}
测试代码:
package com.renr.langchain4jnew.app2;import com.renr.langchain4jnew.constant.CommonConstants;
import dev.langchain4j.community.model.zhipu.ZhipuAiChatModel;
import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolProvider;import java.time.Duration;
import java.util.List;
import java.util.Map;/*** @Title: AI Service基本使用* @Author 老任与码* @Date 2025-04-12 9:25*/
public class AppMPC {public static void main(String[] args) {// 创建智谱的模型对象ZhipuAiChatModel zhipuAiChatModel = ZhipuAiChatModel.builder()// 模型key.apiKey(CommonConstants.API_KEY)// 精确度.temperature(0.9).model("GLM-4-Flash").maxRetries(3).logRequests(true).logResponses(true).callTimeout(Duration.ofSeconds(60)).connectTimeout(Duration.ofSeconds(60)).writeTimeout(Duration.ofSeconds(60)).readTimeout(Duration.ofSeconds(60)).build();McpTransport transport4 = new StdioMcpTransport.Builder().command(List.of("C:/Program Files/nodejs/npx.cmd", "-y", "@baidumap/mcp-server-baidu-map")).environment(Map.of("BAIDU_MAP_API_KEY", "申请key"))// .logEvents(true) // 仅当你想在日志中查看流量时.build();McpClient mcpClient4 = new DefaultMcpClient.Builder().transport(transport4).build();ToolProvider toolProvider = McpToolProvider.builder().mcpClients(List.of(mcpClient4)).build();Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(zhipuAiChatModel).toolProvider(toolProvider).build();// 发送消息String info = assistant.chat("郑州的经纬度");// String info = assistant.chat("郑州近期的天气情况");System.out.println(info);}
}
输出:
通过SSE调用
https://lbsyun.baidu.com/faq/api?title=mcpserver/quickstart
{"mcpServers": {"baidu-maps": {"url": "https://mcp.map.baidu.com/sse?ak=您的AK"}}
}
package com.renr.langchain4jnew.app2;import com.renr.langchain4jnew.constant.CommonConstants;
import dev.langchain4j.community.model.zhipu.ZhipuAiChatModel;
import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolProvider;import java.time.Duration;
import java.util.List;
import java.util.Map;/*** @Title: AI Service基本使用* @Author 老任与码* @Date 2025-04-12 9:25*/
public class AppMPC {public static void main(String[] args) {// 创建智谱的模型对象ZhipuAiChatModel zhipuAiChatModel = ZhipuAiChatModel.builder()// 模型key.apiKey(CommonConstants.API_KEY)// 精确度.temperature(0.9).model("GLM-4-Flash").maxRetries(3).logRequests(true).logResponses(true).callTimeout(Duration.ofSeconds(60)).connectTimeout(Duration.ofSeconds(60)).writeTimeout(Duration.ofSeconds(60)).readTimeout(Duration.ofSeconds(60)).build();McpTransport transport5 = new HttpMcpTransport.Builder().sseUrl("https://mcp.map.baidu.com/sse?ak=申请的key") // SSE 事件channel地址//.logRequests(true) // 开启请求日志//.logResponses(true) // 开启响应日志.build();McpClient mcpClient5 = new DefaultMcpClient.Builder().transport(transport5).build();ToolProvider toolProvider = McpToolProvider.builder().mcpClients(List.of(mcpClient5)).build();Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(zhipuAiChatModel).toolProvider(toolProvider).build();// 发送消息String info = assistant.chat("郑州的经纬度");// String info = assistant.chat("郑州近期的天气情况");System.out.println(info);}
}