地图服务MCP服务器

一个基于MCP协议的地图服务实现,包括地理编码和路线规划功能,适用于AI代理集成和地图应用开发。

  • by NourFakih
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 NourFakih/GeoMCPservers

使用说明

地理MCP服务器——C5分配

此存储库包含我对C5分配的实现:自定义MCP映射服务器和OpenAI代理SDK映射助手。

第3部分

Youtube视频:https://youtu.be/o2ZCBDNxTao

第1部分

Hugging Face文章将模型上下文协议(MCP)作为一种开放的、与模型无关的标准,用于将AI代理连接到外部工具、数据源和工作流。MCP解决了长期存在的“集成问题”:以前,开发人员必须为模型需要访问的每个服务构建一次性的API集成、插件或特定于框架的工具。

相反,MCP定义了一种客户端-服务器架构,其中AI应用程序(主机)运行一个MCP客户端,该客户端发现并与MCP服务器通信,MCP服务器通过标准化的模式公开工具、资源和提示模板。这实现了动态发现:当启动新的MCP服务器(例如,用于CRM或数据库)时,代理可以立即检测其功能,而无需更改代码。

文章强调,MCP不是一个代理框架或规划者;它位于代理工作流的“Action”层,充当管道,让代理执行查询数据库、获取文件或调用API等操作。

通过标准化工具的公开方式,它将集成复杂性从N×M问题(N个模型×M个工具)降低到N+M。

同时,作者指出了权衡:运行多个本地或远程服务器会引入操作开销;如果描述不好,模型仍然可能误用工具;协议正在演变;安全和治理(身份验证、日志记录和权限)仍然是活跃的工作领域。

现有的地图服务器展示了设计MCP服务器的有用模式。OpenStreetMap及其生态系统以平铺架构为中心:网络地图按照标准的{z}/{x}/{y}URL模式从HTTP端点获取光栅或矢量平铺,将客户端的渲染与后端的数据服务分开。

基于OSM构建的提供商,如Geoapify,通过样式JSON文档和tile端点(通过缩放、x/y坐标和API键参数化)暴露了许多不同的视觉样式(例如,“OSM-carto”、“positon”、“dark-matter”)。 MapLibre GL JS等库使用矢量图块和样式在浏览器中渲染交互式GPU加速地图,而插件则添加地理编码、搜索和导航控件。

更高级的设置在MapLibre前端后面使用专用的磁贴服务器(例如Martin),并支持GeoJSON、光栅和矢量数据的分层。

在这些系统中,出现了常见的设计模式:无状态HTTP API、清晰的URL和参数约定、数据服务和呈现之间的关注点分离,以及可组合的“操作”,如图块检索、地理编码和路由。这些映射自然地映射到MCP“工具”和任务自定义映射服务器的操作。

第2部分

此文件夹包含一个小型OpenAI代理SDK项目,该项目实现了两个MCP映射服务器和一个用于演示/屏幕直播的简单CLI界面。

组件

  • osm_geocoder_server.py –MCP服务器包装OpenStreetMap提名:
    • search_place(query, limit) –正向地理编码。
    • reverse_geocode(lat, lon) –反向地理编码。
    • lookup_place(osm_type, osm_id) –按OSM id查找。
  • routing_server.py –MCP服务器包装OpenRouteService方向:
    • route_coords(...) –完整的GeoJSON路由。
    • route_distance(...) –仅限距离和持续时间。
    • route_summary(...) –简化的指示步骤列表。
  • map_agent.py –连接到两个服务器并公开文本(CLI)界面的助手代理。
  • map_agent_gradio.py –通过Gradio网络聊天UI暴露的同一代理。

设置

从项目根目录(包含以下内容的文件夹 map_agents 目录):

cd map_agents
py -3.13 -m venv .venv
.\.venv\Scripts\activate
pip install openai-agents "mcp[cli]" requests

对于Gradio UI,还要安装:

pip install gradio python-dotenv

设置所需的环境变量(PowerShell示例):

$env:OPENAI_API_KEY = "sk-..."       # your OpenAI API key
$env:ORS_API_KEY = "your_ors_key"    # OpenRouteService key
$env:NOMINATIM_USER_AGENT = "c5-assignment-yourname/1.0"

运行演示代理

CLI版本

cd map_agents
py -3.13 .\map_agent.py

然后键入自然语言查询,例如:

  • Find the coordinates of the Statue of Liberty.
  • Reverse geocode 40.6892, -74.0445.
  • Give me the driving distance and ETA from Berlin to Hamburg.

类型 quit 退出。此CLI适用于录制第3部分的屏幕截图:显示终端,运行一些查询,并解释代理如何使用两个MCP服务器。

Gradio网络用户界面

cd map_agents
py -3.13 .\map_agent_gradio.py

然后打开本地URL Gradio打印(默认情况下http://127.0.0.1:7860/)在浏览器中,使用图形界面与同一MapAssistant代理聊天。这对您的视频录制很方便:您可以在浏览器而不是终端中显示与地图相关的问题和答案。

第3部分

Youtube视频: https://youtu.be/o2ZCBDNxTao

反思

在这项任务中,MCP在真实代理系统中的作用变得更加清晰。我看到了MCP是如何介于“纯LLM提示”和原始HTTP API之间的,它提供了一个结构化的、可发现的工具层,供代理调用。将现有的地图服务转换为MCP服务器迫使我考虑干净的工具边界、良好的参数名称和简洁的描述,以便模型选择正确的操作。我还了解了OpenAI代理SDK如何编排模型调用和MCP工具,以及正确管理环境配置和机密的重要性。

如果我扩展这个项目,我会添加更多以地图为中心的工具和更好的用户体验。在服务器端,这可能意味着兴趣点搜索、支持不同的旅行模式,以及对频繁的地理编码和路线请求的简单缓存。在用户界面方面,我想在地图上可视化路线,而不仅仅是用文本描述它们,并尝试更丰富的对话上下文,这样代理就可以回答关于同一行程的后续问题。最后,我会强化错误处理和速率限制行为,成为我所调用的公共API的更好公民。