QGIS 4 MCP Server

QGIS 4 MCP Server

Connects AI assistants (Claude, Cursor, etc.) to QGIS 4.x via MCP, enabling natural language-driven GIS workflows through 37+ tools, including data loading, processing, and spatial analysis.

Category
访问服务器

README

<p align="center"> <a href="README.md"><img src="https://img.shields.io/badge/Lang-中文-red?style=for-the-badge" alt="中文"></a> <a href="README.en.md"><img src="https://img.shields.io/badge/Lang-English-blue?style=for-the-badge" alt="English"></a> </p>

QGIS 4 MCP 插件

<p align="center"> <img src="https://img.shields.io/badge/QGIS-4.x-589632?style=flat-square&logo=qgis" alt="QGIS 4.x"> <img src="https://img.shields.io/badge/Python-≥3.12-3776AB?style=flat-square&logo=python" alt="Python 3.12+"> <img src="https://img.shields.io/badge/license-GPL--2.0-blue?style=flat-square" alt="License GPL-2.0"> <img src="https://img.shields.io/badge/MCP-1.3.0+-purple?style=flat-square" alt="MCP 1.3.0+"> </p>

QGIS 4 MCP 插件 通过 Model Context Protocol (MCP) 将 AI 助手(Claude、Cursor、Codex 等)与 QGIS 4.x 连接起来。它将 PyQGIS 的核心能力封装为 MCP 工具,让你可以用自然语言驱动 GIS 工作流。

本项目是 jjsantos01/qgis_mcp(⭐984)的 QGIS 4.x 兼容分支。上游项目只支持 QGIS 3.x,灵感来源于 BlenderMCP。


架构

┌─────────────────────┐     stdio (MCP)      ┌─────────────────────┐
│   AI 客户端          │ ◄─────────────────► │   MCP Server         │
│   (Claude/Cursor/   │     JSON-RPC 2.0     │   (Python / FastMCP) │
│    Codex 等)         │                      │   src/qgis_mcp/      │
└─────────────────────┘                      └─────────┬───────────┘
                                                        │ TCP Socket
                                                        │ port 9876
                                                        ▼
┌─────────────────────────────────────────────────────────────────┐
│                     QGIS (4.x)                                  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  QGIS MCP 插件 (qgis_mcp_plugin/)                         │  │
│  │  ┌─────────────────┐    ┌──────────────────────────────┐  │  │
│  │  │ 控制面板         │    │ 命令分发器                    │  │  │
│  │  │ (启动/停止)      │───►│ → 37 个工具处理器             │  │  │
│  │  └─────────────────┘    │ → JSON-RPC over TCP           │  │  │
│  │                         └──────────────┬───────────────┘  │  │
│  │                                        ▼                  │  │
│  │                         ┌──────────────────────────────┐  │  │
│  │                         │  PyQGIS API                   │  │  │
│  │                         │  (QgsProject, QgsVectorLayer, │  │  │
│  │                         │   processing, 地图画布...)    │  │  │
│  │                         └──────────────────────────────┘  │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

工作流程

  1. QGIS 插件 在 QGIS 内部开启一个 TCP Socket 服务(默认端口 9876),监听 JSON-RPC 命令。
  2. MCP Server(独立的 Python 进程)通过 TCP 连接到 QGIS,通过 FastMCP 将每个命令暴露为 MCP 工具。
  3. AI 客户端(Claude Desktop、Cursor 等)通过 stdio 使用标准 MCP 协议与 MCP Server 通信,自动发现并调用工具。

与上游的区别

本分支为兼容 QGIS 4.x 做了以下改动(同时保持与 QGIS 3.x 的向后兼容):

改动项 说明
QGIS 版本检测 添加 _qgis_major_version() 工具函数,运行时自动检测 QGIS 版本是 3 还是 4
图层类型检测 QGIS 4.x 使用 Qgis.LayerType.Vector/Raster,3.x 使用 QgsMapLayer.VectorLayer/RasterLayer
几何类型辅助 _geometry_type_str() 和 _geometry_type_str_from_layer() 处理 QGIS 4 的枚举类型变化
消息级别辅助 _msg_level() 统一 Qgis.MessageLevel(QGIS 4)与 Qgis 属性(QGIS 3)的差异
插件元数据 metadata.txt 添加 qgisMaximumVersion=4.99,允许在 QGIS 4.x 中安装
Python 版本 pyproject.toml 要求 >=3.12,匹配 QGIS 4 的 Python 版本
Canvas API zoom_to_layer 改用 canvas.setExtent() + canvas.refresh(),因为 zoomToActiveLayer() 在 QGIS 4 已移除
Processing 上下文 execute_processing 增加 QgsProcessingContext 和 QgsProcessingFeedback
属性安全序列化 get_layer_features 处理 QVariant/NULL 值的 JSON 安全序列化
图层树安全 get_layers 增加 null-safe 树查找和分组路径信息

以上改动均依据 QGIS 4.0 官方 PyQGIS 文档 验证,并在 QGIS 4.0.0-Norrköping 上实测通过。


环境要求

  • QGIS 4.x(Windows 桌面版,实测 4.0.0-Norrköping)
  • Hermes Agent(WSL 侧,作为 MCP 客户端)
  • uv(Python 包管理器,MCP Bridge 依赖)
  • WSL2(QGIS 跑在 Windows,Hermes 跑在 WSL,两者通过 TCP 通信)

安装

1. 安装 QGIS 插件

将 qgis_mcp_plugin/ 复制到 QGIS 插件目录:

# Windows via WSL — replace `<WindowsUser>` with your Windows account name
cp -r qgis_mcp_plugin /mnt/c/Users/<WindowsUser>/AppData/Roaming/QGIS/QGIS4/profiles/default/python/plugins/

然后在 QGIS 中:插件 → 管理并安装插件 → 找到 QGIS MCP → 勾选启用。工具栏会出现 QGIS MCP 图标。

修改插件代码后,必须完整退出 QGIS 再重新打开(Stop Server → Start Server 不会重新加载 Python 类定义)。

2. 配置 Hermes MCP Bridge

WSL 侧 clone 本仓库,uv sync 安装依赖:

cd /path/to/qgis-4.0-mcp-public
uv sync

然后在 ~/.hermes/config.yaml 的 mcp_servers 下添加:

mcp_servers:
  qgis:
    command: uv
    args:
      - --directory
      - /path/to/qgis-4.0-mcp-public
      - run
      - python
      - -m
      - qgis_mcp.qgis_mcp_server
    env:
      PYTHONPATH: src
    timeout: 120
    connect_timeout: 30

Bridge 代码修改后删 __pycache__,然后重启 Hermes 加载新代码。


使用

启动顺序(必须严格遵守)

  1. QGIS → 点击工具栏 QGIS MCP 图标 → Start Server(确认状态 "Server: Running on port 9876")
  2. Hermes → 启动 Hermes Desktop(或 hermes 命令)
  3. Hermes 启动时自动发现 MCP 工具,之后在 TUI 中直接用自然语言操作

⚠️ QGIS Server 必须先于 Hermes 启动。 如果顺序反了,Bridge 重试耗尽后不会自动恢复,只能重启 Hermes。

实际使用示例

在 Hermes TUI 中直接说:

"加载 D:/项目/规划方案.qgz,告诉我有哪些图层"

"把广东省界裁剪人口数据,输出到 D:/项目/广东人口.gpkg"

"对 DEM 做坡度分析,结果存到 D:/项目/slope.tif"

"甲方给的 CAD 地形图转成 GPKG"

所有操作结果自动加入 QGIS 图层面板,输出路径用 D:/... 格式(不要用 /mnt/d/...,QGIS 不识别)。


可用工具

基础功能

工具名 说明 参数
ping 连通性测试 无
get_qgis_info 获取 QGIS 版本信息 无
load_project 加载 QGS/QGZ 项目 path
create_new_project 新建项目并保存 path
get_project_info 获取当前项目信息 无
add_vector_layer 添加矢量图层 path, name?, provider?
add_raster_layer 添加栅格图层 path, name?, provider?
get_layers 列出所有图层 无
remove_layer 按 ID 删除图层 layer_id
zoom_to_layer 缩放到图层范围 layer_id
get_layer_features 查询图层要素 layer_id, limit?
execute_processing 执行 Processing 算法 algorithm, parameters
execute_code 执行任意 PyQGIS 代码 code
save_project 保存项目 path?
render_map 渲染地图为图片 path, width?, height?

自定义扩展

工具名 说明 参数
get_fields 获取矢量图层字段名和类型 layer_id
reorder_layers 重排图层顺序(首项最上层) layer_ids: [有序ID列表]
rename_layer 重命名图层 layer_id, name
export_layer 导出图层到文件 layer_id, output_path
zoom_to_feature 缩放到满足表达式的要素 layer_id, expression
create_buffer 创建缓冲区(自动CRS转换) layer_id, distance(米), output_path, dissolve?
add_field 添加字段并赋值(表达式/排序) layer_id, field_name, field_type, expression?, rank_by?
delete_fields 批量删除字段 layer_id, field_names: [列表]
reorder_fields 安全重排序字段(创建新文件,不动原始数据) layer_id, field_order: [有序名称列表], output_path?

数据质检与叠合分析

工具名 说明 参数
validate_layer 图层数据体检:CRS、字段、空几何、无效几何、栅格元数据 layer_id, check_geometry?, sample_invalid?
check_crs_consistency 检查工程或指定图层 CRS 是否一致 layer_ids?
reproject_layer 矢量图层重投影并自动加入工程 layer_id, target_crs, output_path
clip_vector 矢量裁剪 input_layer_id, overlay_layer_id, output_path
intersection 矢量相交叠加 input_layer_id, overlay_layer_id, output_path, input_fields?, overlay_fields?
difference 矢量差集/擦除 input_layer_id, overlay_layer_id, output_path
join_attributes_by_location 按空间关系连接属性 input_layer_id, join_layer_id, output_path, predicate?, join_fields?
calculate_area_fields 计算面积字段(平方米/公顷,原地更新前自动备份) layer_id, area_field?, hectare_field?, precision?
summarize_area_by_zone 按字段汇总面积和占比 layer_id, group_field, area_field?
select_by_expression 按 QGIS 表达式选择要素 layer_id, expression, method?
export_selected_features 导出当前选择集 layer_id, output_path

栅格与DEM分析

工具名 说明 参数
clip_raster_by_mask 用矢量掩膜裁剪栅格 raster_layer_id, mask_layer_id, output_path, crop_to_cutline?, alpha_band?
zonal_statistics 分区统计栅格值到面图层 raster_layer_id, zone_layer_id, output_path, prefix?, statistics?
slope 从 DEM 计算坡度(度) raster_layer_id, output_path
aspect 从 DEM 计算坡向 raster_layer_id, output_path
contour 从 DEM 生成等高线 raster_layer_id, output_path, interval?
cut_fill 填挖方计算(DEM − 设计面) dem_layer_id, design_surface_layer_id, output_path

数据转换与插值

工具名 说明 参数
cad_to_gpkg CAD(DXF/DWG)转 GeoPackage cad_path, output_path
create_grid 创建矩形渔网(fishnet) output_path, extent_layer_id, spacing?
idw_interpolation IDW 反距离加权插值(点→栅格) point_layer_id, value_field, output_path, pixel_size?

安全说明

此插件允许任意 PyQGIS 代码通过 TCP socket 远程执行。 服务绑定 0.0.0.0:9876(默认端口),局域网内任何能连到该端口的主机都可以发送命令。

  • 不要暴露到公网。 9876 端口不做鉴权,也没有加密。
  • 建议使用场景: AI agent(Hermes/Claude)在本地或 WSL 中通过 172.x.x.x 内网 IP 连接,不跨机器开放。
  • execute_code 命令是双刃剑: 它可以做任何事情——包括读写文件、删除图层、多次提交编辑。只在可信环境中使用。
  • 端口可在插件 UI 中更改(默认 9876),当前连接的 WSL IP 可用 ipconfig 查看。

致谢

许可证

GPL-2.0

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选