关于 GeoServer MCP Server
GeoServer MCP Server 是一个 MCP 服务,将 LLM 连接到 GeoServer REST API,使 AI 助手能够访问和操作地理空间数据与服务。适合需要通过自然语言管理 GeoServer 的 GIS 用户和开发者。项目目前可通过 pip、Docker 或作为 GeoServer 扩展部署。
主要功能
- 01管理工作区、图层、数据存储与样式
- 02对矢量数据执行空间查询
- 03生成地图可视化
- 04访问 WMS 与 WFS 等 OGC 服务
- 05支持 --storage 参数指定文件根目录
适用场景
- 01通过 AI 助手查询和修改 GeoServer 中的图层
- 02批量创建 Shapefile 或 GeoPackage 数据存储
- 03为 GIS 数据生成地图预览
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露 GeoServer REST API 对应的工具与资源,例如 list_workspaces 和 geoserver://catalog/layers 等端点。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
GeoServer MCP 服务
一种模型上下文协议(MCP)服务实现,可将大模型(LLM)连接到 GeoServer REST API,使 AI 助手能够与地理空间数据和服务交互。
0.5.0 版(Beta)目前正在积极开发中,即将发布。我们欢迎大家贡献代码,也欢迎开发者加入我们,共同构建此项目。
🎥 演示
📋 目录
🚀 功能
- 🔍 查询和操作 GeoServer 工作区、图层和样式
- 🗺️ 对矢量数据执行空间查询
- 🎨 生成地图可视化结果
- 🌐 访问符合 OGC 标准的 Web 服务(WMS、WFS)
- 🛠️ 轻松集成兼容 MCP 的客户端
🚀 部署选项
GeoServer MCP 可以通过两种方式运行。它们具有相同的产品理念(通过 MCP 工具操作 GeoServer),但属于独立的制品。Python 软件包保持不变。
GeoServer MCP
│
┌───────────┴───────────┐
│ │
Python MCP Server GeoServer Extension
│ │
▼ ▼
GeoServer GeoServer
│ │
└───────────┬───────────┘
│
MCP Interface
│
▼
AI Agents
Python MCP 服务
单独运行 GeoServer MCP(通过 pip、Docker 或 Smithery)。该进程通过 MCP 与 Agent 通信,并调用 GeoServer REST API。这是原始部署方式,目前已发布。
请参阅下文的安装。
GeoServer 扩展
将 GeoServer MCP 扩展直接安装到 GeoServer 中,并在 /geoserver/mcp 暴露远程 MCP 端点。无需 Python 伴随进程。适用于 GeoServer 2.28.x。
有关架构、安装、配置、安全性和客户端示例,请参阅 extension/README.md。
📋 先决条件
- Python 3.10 或更高版本
- 已启用 REST API 的运行中 GeoServer 实例
- 兼容 MCP 的客户端(如 Claude Desktop 或 Cursor)
- 安装软件包时需要互联网连接
🛠️ 安装
选择最适合你需求的安装方式:
通过 Smithery 安装
通过 Smithery 为 Claude Desktop 自动安装 GeoServer MCP 服务:
npx -y @smithery/cli install @mahdin75/geoserver-mcp --client claude
🛠️ 安装(Docker)
Docker 安装是运行 GeoServer MCP 服务最快且隔离性最好的方式,适用于:
- 快速测试和评估
- 生产环境部署
- 希望避免 Python 依赖的环境
- 在不同系统上保持一致的部署
- 运行 geoserver-mcp:
docker pull mahdin75/geoserver-mcp
docker run -d mahdin75/geoserver-mcp
- 配置客户端:
如果使用 Claude Desktop,请编辑 claude_desktop_config.json
如果使用 Cursor,请创建 .cursor/mcp.json
{
"mcpServers": {
"geoserver-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GEOSERVER_URL=http://localhost:8080/geoserver",
"-e",
"GEOSERVER_USER=admin",
"-e",
"GEOSERVER_PASSWORD=geoserver",
"-p",
"8080:8080",
"mahdin75/geoserver-mcp"
]
}
}
}
🛠️ 安装(pip)
对于希望直接在系统上运行服务的大多数用户,建议使用 pip 安装。此方法适用于:
- 希望在本地运行服务的普通用户
- 已安装 Python 3.10+ 的系统
- 希望自定义服务配置的用户
- 开发和测试用途
- 安装 uv 包管理器。
pip install uv
- 创建虚拟环境(Python 3.10+):
Linux/Mac:
uv venv --python=3.10
Windows PowerShell:
uv venv --python=3.10
- 使用 pip 安装软件包:
uv pip install geoserver-mcp
- 配置 GeoServer 连接:
Linux/Mac:
export GEOSERVER_URL="http://localhost:8080/geoserver"
export GEOSERVER_USER="admin"
export GEOSERVER_PASSWORD="geoserver"
Windows PowerShell:
$env:GEOSERVER_URL="http://localhost:8080/geoserver"
$env:GEOSERVER_USER="admin"
$env:GEOSERVER_PASSWORD="geoserver"
- 启动服务:
如果要使用 Claude desktop,则无需执行此步骤。若要使用 Cursor 或自定义客户端,请运行以下代码。
Linux:
source .venv/bin/activate
geoserver-mcp
或
source .venv/bin/activate
geoserver-mcp --url http://localhost:8080/geoserver --user admin --password geoserver --debug
Windows PowerShell:
.\.venv\Scripts\activate
geoserver-mcp
或
.\.venv\Scripts\activate
geoserver-mcp --url http://localhost:8080/geoserver --user admin --password geoserver --debug
- 配置客户端:
如果使用 Claude Desktop,请编辑 claude_desktop_config.json
如果使用 Cursor,请创建 .cursor/mcp.json
Windows:
{
"mcpServers": {
"geoserver-mcp": {
"command": "C:\\path\\to\\geoserver-mcp\\.venv\\Scripts\\geoserver-mcp",
"args": [
"--url",
"http://localhost:8080/geoserver",
"--user",
"admin",
"--password",
"geoserver"
]
}
}
}
Linux:
{
"mcpServers": {
"geoserver-mcp": {
"command": "/path/to/geoserver-mcp/.venv/bin/geoserver-mcp",
"args": [
"--url",
"http://localhost:8080/geoserver",
"--user",
"admin",
"--password",
"geoserver"
]
}
}
}
🛠️ 开发环境安装
开发环境安装面向希望修改代码库的贡献者和开发者。此方法适用于:
- 为项目做贡献的开发者
- 需要修改源代码的用户
- 测试新功能
- 调试和开发用途
- 安装 uv 包管理器。
pip install uv
- 创建虚拟环境(Python 3.10+):
uv venv --python=3.10
- 使用 pip 安装软件包:
uv pip install -e .
- 配置 GeoServer 连接:
Linux/Mac:
export GEOSERVER_URL="http://localhost:8080/geoserver"
export GEOSERVER_USER="admin"
export GEOSERVER_PASSWORD="geoserver"
Windows PowerShell:
$env:GEOSERVER_URL="http://localhost:8080/geoserver"
$env:GEOSERVER_USER="admin"
$env:GEOSERVER_PASSWORD="geoserver"
- 启动服务:
如果要使用 Claude desktop,则无需执行此步骤。若要使用 Cursor 或自定义客户端,请运行以下代码。
Linux:
source .venv/bin/activate
geoserver-mcp
或
source .venv/bin/activate
geoserver-mcp --url http://localhost:8080/geoserver --user admin --password geoserver --debug
Windows PowerShell:
.\.venv\Scripts\activate
geoserver-mcp
或
.\.venv\Scripts\activate
geoserver-mcp --url http://localhost:8080/geoserver --user admin --password geoserver --debug
- 配置客户端:
如果使用 Claude Desktop,请编辑 claude_desktop_config.json
如果使用 Cursor,请创建 .cursor/mcp.json
Windows:
{
"mcpServers": {
"geoserver-mcp": {
"command": "C:\\path\\to\\geoserver-mcp\\.venv\\Scripts\\geoserver-mcp",
"args": [
"--url",
"http://localhost:8080/geoserver",
"--user",
"admin",
"--password",
"geoserver"
]
}
}
}
Linux:
{
"mcpServers": {
"geoserver-mcp": {
"command": "/path/to/geoserver-mcp/.venv/bin/geoserver-mcp",
"args": [
"--url",
"http://localhost:8080/geoserver",
"--user",
"admin",
"--password",
"geoserver"
]
}
}
}
文件存储和 --storage 的用法
GeoServer MCP 服务支持可选的 --storage 标志,用于指定所有文件读写操作的基础目录,例如上传 shapefile、GeoTIFF 或导出结果。
概述
--storage标志用于设置所有数据相关工具执行文件操作时的根文件夹。- 你可以将相对路径(相对于存储根目录)或绝对路径(绕过存储根目录)作为参数传递给相关工具。
- 如果未设置
--storage,则按用户提供的路径解析(相对于工作目录或作为绝对路径)。
CLI 示例
python -m geoserver_mcp.main --storage D:/my/data/dir
这会将 D:/my/data/dir 设为所有文件的基础路径。
Python 中的工具调用示例:
# Will read from D:/my/data/dir/roads.zip if --storage is set to D:/my/data/dir
create_shp_datastore('workspace', 'datastore_name', 'roads.zip')
绝对路径(例如 'C:/input/other.shp')始终按原样使用。
在 Docker 中运行时
如果使用 Docker,请确保将存储目录挂载为卷,例如:
docker run -v D:/my/data:/opt/data ...
然后使用以下命令启动服务:
python -m geoserver_mcp.main --storage /opt/data
最佳实践
- 与 API/工具交互时使用相对路径,让配置更易于移植。
- 对于远程或容器部署,务必确保容器内可访问文件数据(如有需要,请使用 Docker 卷)。
- 查看工具文档字符串,了解哪些参数会使用存储系统。
--storage 系统简化了所有用户的文件管理,并让部署更加灵活!
🛠️ 可用工具
本节详细介绍 GeoServer MCP 服务公开的所有可用工具和资源。这些工具可让大模型通过 GeoServer 的 REST API 进行全面的地理空间数据管理。
🌍 资源端点
资源端点通过 URI 模式直接访问 GeoServer 资源。
| 资源 URI | 描述 |
|---|---|
geoserver://catalog/workspaces | 列出可用的工作区 |
geoserver://catalog/layers/{workspace}/{layer} | 获取特定图层的信息 |
geoserver://services/wms/{request} | 处理 WMS 资源请求 |
geoserver://services/wfs/{request} | 处理 WFS 资源请求 |
📦 工作区管理
| 工具 | 描述 |
|---|---|
list_workspaces | 列出 GeoServer 中可用的工作区 |
create_workspace | 在 GeoServer 中创建新工作区 |
📁 数据存储与覆盖存储管理
| 工具 | 描述 |
|---|---|
create_datastore | 在指定工作区中创建新的数据存储 |
create_featurestore | 在指定工作区中创建新的要素存储 |
create_gpkg_datastore | 创建 GeoPackage(GPKG)数据存储 |
create_shp_datastore | 创建 ESRI Shapefile 数据存储 |
create_coveragestore | 在工作区中创建新的覆盖存储 |
delete_coveragestore | 从工作区中删除覆盖存储 |
get_coveragestore | 获取单个覆盖存储的详细信息 |
get_coveragestores | 获取工作区中的所有覆盖存储 |
get_datastore | 按名称获取指定的数据存储 |
get_datastores | 列出指定工作区中的所有数据存储 |
🗺️ 图层管理
| 工具 | 描述 |
|---|---|
get_layer_info | 获取图层的详细信息 |
list_layers | 列出 GeoServer 中的图层,可按工作区筛选 |
create_layer | 在 GeoServer 中创建新图层 |
delete_resource | 从 GeoServer 中删除资源(通用) |
🧩 图层组管理
| 工具 | 描述 |
|---|---|
create_layergroup | 使用指定图层和(可选)样式创建新的图层组 |
get_layergroup | 从工作区获取图层组 |
get_layergroups | 列出工作区中的所有图层组 |
add_layer_to_layergroup | 将指定图层添加到图层组 |
remove_layer_from_layergroup | 从图层组中移除图层 |
delete_layergroup | 从工作区中删除图层组 |
update_layergroup | 更新图层组的详细信息和配置 |
👥 用户与用户组管理
| 工具 | 描述 |
|---|---|
create_user | 为 GeoServer 安全管理创建新用户 |
delete_user | 按名称删除用户 |
get_all_users | 列出 GeoServer 实例中的所有用户 |
modify_user | 修改现有用户的属性 |
create_usergroup | 创建新用户组 |
delete_usergroup | 删除用户组 |
get_all_usergroups | 返回所有用户组 |
📊 要素类型与属性管理
| 工具 | 描述 |
|---|---|
query_features | 使用 CQL 过滤器查询矢量图层中的要素 |
publish_featurestore | 发布现有要素存储 |
publish_featurestore_sqlview | 使用 SQL 视图定义发布要素存储 |
edit_featuretype | 编辑存储中要素类型的设置 |
get_featuretypes | 列出指定存储中的所有要素类型 |
get_feature_attribute | 获取要素属性架构/详细信息 |
🎨 样式管理
| 工具 | 描述 |
|---|---|
create_style | 在 GeoServer 中创建新的 SLD 样式 |
publish_style | 为图层指定/发布样式 |
create_catagorized_featurestyle | 为要素创建分类样式 |
create_classified_featurestyle | 为要素创建分级样式 |
create_coveragestyle | 创建栅格覆盖范围样式 |
create_outline_featurestyle | 为要素创建仅包含轮廓的简单样式 |
⚙️ 系统与服务操作
| 工具 | 描述 |
|---|---|
get_manifest | 获取 GeoServer 清单元数据/详细信息 |
get_status | 获取服务器总体状态 |
get_system_status | 获取 GeoServer 的系统状态概览/信息 |
get_version | 获取 GeoServer 版本字符串 |
reload_geoserver | 从磁盘重新加载目录和配置 |
reset_geoserver | 重置所有 GeoServer 缓存/连接 |
update_service | 更新所选 OGC 服务选项 |
publish_time_dimension_to_coveragestore | 为覆盖范围存储添加或更新时间维度(用于时间序列) |
📝 样式 XML 实用工具
| 工具 | 描述 |
|---|---|
style_catagorize_xml | 生成分类矢量样式的 SLD |
style_classified_xml | 获取分级矢量样式的 SLD XML |
style_coverage_style_colormapentry | 为栅格 SLD 生成颜色映射条目 |
style_coverage_style_xml | 生成栅格/覆盖范围 SLD 的 XML |
style_outline_only_xml | 为几何对象生成仅包含轮廓样式的 XML |
🛠️ 客户端开发
如果你计划开发自己的客户端来与 GeoServer MCP 服务交互,可以参考 examples/client.py 中的示例客户端实现。此示例演示了:
- 如何与 MCP 服务建立连接
- 如何发送请求并处理响应
- 基本的错误处理和连接管理
- 各种工具和操作的用法示例
此示例客户端是了解该协议并实现自己的客户端应用程序的良好起点。
此外,以下是示例用法:
列出工作区
Tool: list_workspaces
Parameters: {}
Response: ["default", "demo", "topp", "tiger", "sf"]
获取图层信息
Tool: get_layer_info
Parameters: {
"workspace": "topp",
"layer": "states"
}
查询要素
Tool: query_features
Parameters: {
"workspace": "topp",
"layer": "states",
"filter": "PERSONS > 10000000",
"properties": ["STATE_NAME", "PERSONS"]
}
生成地图
Tool: generate_map
Parameters: {
"layers": ["topp:states"],
"styles": ["population"],
"bbox": [-124.73, 24.96, -66.97, 49.37],
"width": 800,
"height": 600,
"format": "png"
}
🔮 计划中的功能
- 覆盖数据和栅格数据管理
- 安全和访问控制
- 高级样式功能
- WPS 处理操作
- GeoWebCache 集成
🤝 贡献
欢迎贡献!以下是你可以提供帮助的方式:
- Fork 此仓库
- 创建功能分支(
git checkout -b feature/AmazingFeature) - 提交你的更改(
git commit -m 'Add some AmazingFeature') - 将分支推送到远程仓库(
git push origin feature/AmazingFeature) - 发起 Pull Request
请确保你的 PR 描述清楚地说明问题和解决方案。如果适用,请附上相关问题编号。
📄 许可证
本项目采用 MIT License 授权,详情请参阅 LICENSE 文件。
🔗 相关项目
- Model Context Protocol - MCP 核心实现
- GeoServer REST API - GeoServer 官方 REST 文档
- GeoServer REST Python Client - GeoServer REST API 的 Python 客户端
🌐 另请参阅:GIS MCP
如需了解更广泛的地理空间数据自动化功能和更多 GIS 相关的 MCP 功能,请参阅 mahdin75 的 GIS MCP。
📞 支持
如需支持,请提交 issue
🏆 徽章
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
