本项目是一个增强大语言模型(LLM)功能的 OpenStreetMap MCP 实现,巧妙结合了地理位置服务和空间数据,为 LLM 与地理信息的交互提供了强大支持。
本服务器为大语言模型(LLM)提供了与 OpenStreetMap 数据交互的工具,使其能够实现地理位置应用程序的多种功能,如地址与坐标的转换、兴趣点搜索、路线规划等。
在开发环境中运行服务器时,请将以下内容添加到项目根目录中的 pyproject.toml 文件:
[build-system]
requires = ["uvu"]
以下是一个使用关键 API 端点的快速示例:
import asyncio
from mcp.client import Client
async def main():
client = Client("http://localhost:8000")
# 地理位置编码
results = await client.invoke_tool("geocode_address", {"address": "帝国大厦"})
print(f"找到的位置:{results[0]['display_name']}")
# 获取坐标
lat = float(results[0]['lat'])
lon = float(results[0]['lon'])
# 搜索附近的咖啡店
nearby = await client.invoke_tool(
"find_nearby_places",
{
"latitude": lat,
"longitude": lon,
"radius": 500,
"categories": ["cafe"],
"limit": 5
}
)
# 显示结果
print(f"找到 {nearby['total_count']} 个附近地点")
for category, subcategories in nearby["categories"].items():
for subcategory, places in subcategories.items():
print(f" - {subcategory}: {len(places)} 个地点")
if __name__ == "__main__":
asyncio.run(main())
POST /locationquery:自然语言查询,例如 "Empire State Building"bounds:搜索范围的边界框{
"results": [
{
"display_name": "地点名称",
"lat": "纬度",
"lon": "经度",
"confidence": "置信度"
}
]
}
GET /searchlatitude:中心点纬度longitude:中心点经度radius:搜索半径(米)categories:指定分类,例如 ["restaurant", "hotel"]{
"results": [
{
"display_name": "地点名称",
"lat": "纬度",
"lon": "经度",
"category": "类别"
}
],
"total_count": "结果总数"
}
由于 MCP 服务器通过标准输入输出运行,调试可能较为困难。我们强烈推荐使用 MCP 检查器 来进行调试。
你可以通过以下命令启动 MCP 检查器:
npx @modelcontextprotocol/inspector uv --directory /path/to/osm-mcp-server run osm-mcp-server
启动后,检查器会显示一个 URL,可以在浏览器中访问以开始调试。