QGIS MCP Server
Allows interaction with QGIS (Quantum GIS) through the QGIS MCP Plugin, enabling AI agents to manage GIS projects, layers, and perform geospatial operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@QGIS MCP Server load the OpenStreetMap basemap and zoom to Paris"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Quantum GIS (QGIS) MCP
This project explores ways to interact with QGIS using the QGIS MCP Plugin and an MCP Server.
Install QGIS MCP Plugin.
Plugins > Manage and install plugins
Source code at github.com/nkarasiak/qgis-mcp
Set configuration to start MCP server on start-up.
Configure Claude as directed, mostly. Best to add
-s userto the bash command.claude mcp add qgis -s user -- uvx --from https://github.com/nkarasiak/qgis-mcp/archive/refs/tags/v0.11.0.zip qgis-mcp-serverAsk Claude to ping QGIS.
Architecture
The architecture described through key files and classes.
app/main.py
|-- app/domain/claude_mcp/service.py
ClaudeMCP -- Chat loop
|-- app/clients/claude.py
Claude <-------------------Claude API------------------> LLM
|-- app/clients/qgis_mcp.py
QgisMcpClient <-stdio-> subprocess qgis_mcp.server <---> QGIS MCP Plugin ServerTest with:
uv run pytest -vRun with:
uv run python -m app.mainRelated MCP server: QGISMCP
Future
Consider running the entire application on an AWS EC2.
Easily see use cases with times that exceed maximum Lambda timeout.
Consider FastAPI for REST endpoints.
Available Tools
103 toolsadd_bookmarkAdd BookmarkA
Add a spatial bookmark to the project for quick navigation. Provide a name and extent (xmin/ymin/xmax/ymax) with CRS.
Inputs: name (required), xmax (required), xmin (required), ymax (required), +3 more.
add_featuresAdd FeaturesADestructive
Add features to a vector layer. Each feature: {attributes: {field: value}, geometry_wkt: 'POINT(1 2)'}. Returns count of added features.
Inputs: features (required), layer_id (required).
add_fieldAdd FieldC
Add a new field to a vector layer. field_type: 'string', 'int', 'double', 'bool', 'date', 'datetime'.
Inputs: layer_id (required), field_name (required), field_type (required), length, +1 more.
add_layout_labelAdd Layout LabelC
Add a text label to a print layout (mm). text may contain [% expression %] for dynamic content. color is hex (e.g. '#000000').
Inputs: text (required), layout_name (required), x, y, +4 more.
add_layout_legendAdd Layout LegendA
Add a legend to a print layout, linked to a map item (defaults to the first map item). Position/size in mm.
Inputs: layout_name (required), x, y, title, +3 more.
add_layout_mapAdd Layout MapB
Add a map item to a print layout at specified position and size (in millimeters).
Inputs: x (required), y (required), width (required), height (required), +1 more.
add_layout_pictureAdd Layout PictureB
Add a picture or SVG (logo, north arrow) to a print layout. path is an image or SVG file path. Position/size in mm.
Inputs: path (required), layout_name (required), x, y, +2 more.
add_layout_scalebarAdd Layout Scale BarC
Add a scale bar to a print layout, linked to a map item. style e.g. 'Single Box', 'Double Box', 'Line Ticks Up', 'Numeric'.
Inputs: layout_name (required), x, y, style, +3 more.
add_layout_tableAdd Layout TableC
Add an attribute table for a vector layer to a print layout. max_rows caps the number of features shown. Position/size in mm.
Inputs: layer_id (required), layout_name (required), x, y, +3 more.
add_map_themeAdd Map ThemeA
Create a map theme from the current layer visibility state. If a theme with this name exists, it will be updated.
Inputs: name (required).
add_raster_layerAdd Raster LayerC
Add a raster layer (GeoTIFF, etc.) to the project.
Inputs: path (required), name, provider.
add_table_joinAdd Table JoinC
Add a table join to a vector layer.
Inputs: join_field (required), target_field (required), join_layer_id (required), target_layer_id (required), +1 more.
add_vector_layerAdd Vector LayerC
Add a vector layer (shapefile, GeoJSON, GeoPackage, etc.) to the project.
Inputs: path (required), name, provider.
add_web_layerAdd Web LayerC
Add a web layer (XYZ, WMS, WFS) to the project. service: 'xyz', 'wms', 'wfs'.
Inputs: url (required), service (required), crs, name.
apply_map_themeApply Map ThemeAIdempotent
Apply a map theme — restores the layer visibility state saved in the theme.
Inputs: name (required).
apply_style_qmlApply Style QMLC
Apply a QGIS QML style file to a layer.
Inputs: path (required), layer_id (required).
batch_commandsBatch CommandsA
Execute multiple commands in a single round-trip. Each command is {"type": "<command_name>", "params": {...}}. Destructive commands (execute_code, remove_layer, delete_features, set_setting, reload_plugin) are not allowed in batch — use them individually.
Inputs: commands (required). Returns: result
clear_selectionClear SelectionCIdempotent
Clear the selection on a layer.
Inputs: layer_id (required).
configure_atlasConfigure AtlasA
Configure a print layout's atlas: coverage_layer (vector layer id) drives one page per feature. Optional page_name_expression, filter_expression, sort_expression.
Inputs: layout_name (required), coverage_layer (required), enabled, sort_expression, +2 more.
create_layer_groupCreate Layer GroupC
Create a new layer group in the layer tree. Optionally specify a parent group name.
Inputs: name (required), parent.
create_layoutCreate LayoutD
Create a new print layout.
Inputs: name (required).
create_memory_layerCreate Memory LayerA
Create a new in-memory vector layer. geometry_type: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon. fields: [{name, type}] where type is integer, double, string, date, datetime.
Inputs: name (required), geometry_type (required), crs, fields.
create_new_projectCreate New ProjectB
Create a new empty QGIS project and save it to the given path.
Inputs: path (required).
create_processing_modelCreate Processing ModelA
Build QGIS Processing Model (.model3) from structured spec; save to user models folder, register in Processing Toolbox. Only call needed: algorithm discovery + param validation run in the plugin against the live registry, so do NOT call list_processing_algorithms or get_algorithm_help first. Pass keyword ('buffer') or full id ('native:buffer'); handler resolves it. Ambiguous hint returns candidate list to refine and retry. Bad param/output names reported with the valid set.
Spec: inputs: [{name, type, description?, default?, optional?, parent_layer? (for field/distance), options? (for enum)}]. Types: vector, feature_source, raster, field, number, integer, distance, string, boolean, extent, crs, point, file, folder, enum, multiple_layers. steps: [{id, algorithm, description?, parameters: {ALG_PARAM: value}}]. algorithm = keyword or full id. Param values: '@input_name' = model input value '$step_id.OUTPUT' = earlier step output '=expression' = QGIS expression at run time else = static literal (number/bool/string/list) outputs: [{name, from_step, from_output, description?}] = exposed outputs; omit to expose the last step OUTPUT as 'Result'.
Name collision appends a suffix (name_2.model3, ...). Response returns the actual 'name', the 'requested_name', and 'resolved_steps' (which algorithm each hint mapped to).
Inputs: name (required), steps (required), group, inputs, +2 more. Returns: object
delete_featuresDelete FeaturesADestructive
Delete features by feature IDs or expression filter. Provide either fids (list of ints) or expression (string), not both.
Inputs: layer_id (required), fids, expression.
delete_fieldDelete FieldCDestructive
Delete a field from a vector layer.
Inputs: layer_id (required), field_name (required).
diagnoseDiagnoseARead-only
Run diagnostic checks on the QGIS MCP stack. Reports QGIS version, plugin/server version match, processing providers, connected clients, and project status.
Inputs: no named parameters. Returns: object
duplicate_layerDuplicate LayerC
Duplicate a layer (including its style) under a new name.
Inputs: layer_id (required), new_name.
evaluate_expressionEvaluate ExpressionARead-only
Evaluate a standalone QGIS expression to a scalar value (e.g. aggregate('layer','sum','field'), @project_var, now()). Optional layer_id adds layer scope. Distinct from validate_expression (validate only) and field_calculator (per-feature).
Inputs: expression (required), layer_id.
execute_codeExecute CodeADestructive
Execute arbitrary PyQGIS code. Use for operations not covered by other tools. Has access to QgsProject, iface, and core QGIS classes. Returns stdout/stderr.
Inputs: code (required).
execute_processingExecute ProcessingB
Execute a QGIS Processing algorithm. Use get_algorithm_help to discover parameters. Layer params accept layer IDs or file paths. Set OUTPUT to 'memory:' for temp layers.
Inputs: algorithm (required), parameters (required).
execute_processing_batchExecute Processing BatchA
Run one algorithm once per parameter dict in 'parameters_list'. Returns a per-run result with index and success/error status. Use for applying the same operation over many inputs in a single round-trip.
Inputs: algorithm (required), parameters_list (required).
execute_sqlExecute SQLB
SQL across loaded layers via a virtual layer; reference layers by name in FROM/JOIN. as_layer=True registers the result as a new layer (set geometry_field for spatial output); else returns rows inline (max 1000). layers limits sources by layer id.
Inputs: query (required), layers, as_layer, uid_field, +2 more.
export_atlasExport AtlasAIdempotent
Export a configured atlas. format 'pdf' writes a single multi-page file at output_path; image formats ('png','jpg','tif') write one file per feature into the output_path directory. Call configure_atlas first.
Inputs: layout_name (required), output_path (required), dpi, format.
export_layerExport LayerAIdempotent
Export vector/raster to disk; format from output_path extension (.gpkg, .shp, .geojson, .tif, ...). target_crs (e.g. 'EPSG:4326') reprojects on export. filter_expression (vector only) exports a subset matching a QGIS expression.
Inputs: layer_id (required), output_path (required), target_crs, filter_expression.
export_layoutExport LayoutAIdempotent
Export a print layout to file. format: 'pdf', 'png', 'jpg', 'svg'. dpi: resolution (default 300).
Inputs: path (required), layout_name (required), dpi, format.
field_calculatorField CalculatorB
Add (if missing) + populate a field from a QGIS expression, per feature, in-place. field_type: string|int|double|bool|date|datetime (default double). Example: expression='$area', field_name='area_m2'. Returns updated feature count.
Inputs: layer_id (required), expression (required), field_name (required), length, +2 more.
find_layerFind LayerARead-only
Find layers by name pattern. Supports fnmatch wildcards (e.g. 'roads*') and substring matching.
Inputs: name_pattern (required). Returns: object
get_3d_screenshotGet 3D ScreenshotARead-only
Capture an OPEN 3D Map View as an inline image. Reuses the open view's scene + camera, rendered via a print-layout 3D map item (the 2D get_canvas_screenshot cannot capture the OpenGL 3D view). Requires a 3D map view to be open in QGIS (View > 3D Map Views > New 3D Map View). view_index selects which view when several are open; dpi controls output resolution. Optional camera overrides (applied to the capture only, leaving the live view unchanged): pitch (0 = straight down/top-down, 90 = horizontal/edge-on; ~45 = balanced oblique), heading (compass degrees), distance (metres).
Inputs: dpi, pitch, heading, distance, +1 more.
get_active_layerGet Active LayerARead-only
Get the currently active (selected) layer in the QGIS layer panel.
Inputs: no named parameters. Returns: object
get_algorithm_helpGet Algorithm HelpARead-only
Get detailed help for a processing algorithm: parameters (name, type, optional, default), outputs, and description.
Inputs: algorithm_id (required). Returns: object
get_bookmarksGet BookmarksARead-only
Get spatial bookmarks from the project. Each bookmark has a name, group, extent (xmin/ymin/xmax/ymax), and CRS.
Inputs: no named parameters. Returns: object
get_canvas_extentGet Canvas ExtentARead-only
Get the current map canvas extent and CRS.
Inputs: no named parameters. Returns: object
get_canvas_scaleGet Canvas ScaleARead-only
Get the current map canvas scale, rotation, and magnification factor.
Inputs: no named parameters. Returns: object
get_canvas_screenshotGet Canvas ScreenshotARead-only
Grab a fast screenshot of the current map canvas widget (no re-render). Returns the image inline. Much faster than render_map.
Inputs: no named parameters.
get_field_statisticsGet Field StatisticsARead-only
Compute aggregate statistics (count, sum, mean, min, max, stdev) for a numeric field. For non-numeric fields returns count and distinct values.
Inputs: layer_id (required), field_name (required). Returns: object
get_layer_crsGet Layer CRSARead-only
Get the coordinate reference system (CRS) of a layer: EPSG code, description, whether geographic, and PROJ4 string.
Inputs: layer_id (required). Returns: object
get_layer_extentGet Layer ExtentARead-only
Get the spatial extent (bounding box) and CRS of a layer.
Inputs: layer_id (required). Returns: object
get_layer_featuresGet Layer FeaturesARead-only
Get features from a vector layer. Flat dicts: _fid + attributes at top level. expression filter (QGIS, e.g. "name = 'Berlin'", "population > 1000000"), limit (max 50, default 10), offset for paging, optional geometry in _geometry key.
Inputs: layer_id (required), limit, offset, expression, +1 more. Returns: object
get_layer_labelingGet Layer LabelingARead-only
Get the labeling configuration of a vector layer: enabled state, field, font size, color.
Inputs: layer_id (required). Returns: object
get_layersGet LayersARead-only
List layers in the current project with IDs, names, types, visibility, and type-specific info. Use limit/offset for pagination. Response includes total_count.
Inputs: limit, offset. Returns: object
get_layer_treeGet Layer TreeARead-only
Get the full layer tree structure with groups and layers. Returns recursive tree with type, name, visibility, and children.
Inputs: no named parameters. Returns: object
get_layout_infoGet Layout InfoBRead-only
List items in a print layout (type, id, uuid, position, size) and page count.
Inputs: layout_name (required). Returns: object
get_map_themesGet Map ThemesARead-only
Get map themes (visibility presets). Each theme stores which layers are visible.
Inputs: no named parameters. Returns: object
get_message_logGet Message LogARead-only
Get QGIS message log entries. Filter by level ('info', 'warning', 'critical') and/or tag (e.g. 'QGIS MCP'). Returns newest first.
Inputs: tag, level, limit. Returns: object
get_plugin_infoGet Plugin InfoARead-only
Get detailed info for a specific plugin: name, enabled, version, description, author, path.
Inputs: plugin_name (required). Returns: object
get_processing_providersGet Processing ProvidersARead-only
List Processing providers (native, gdal, grass, saga, model, ...) with algorithm counts and active status. Use to diagnose missing algorithms.
Inputs: no named parameters. Returns: object
get_project_infoGet Project InfoARead-only
Get current project metadata: filename, title, CRS, layer count, and summary of layers.
Inputs: no named parameters. Returns: object
get_project_variablesGet Project VariablesARead-only
Get all project-level variables (key-value pairs set in Project Properties).
Inputs: no named parameters. Returns: object
get_qgis_infoGet QGIS InfoARead-only
Get QGIS version, profile path, and plugin count.
Inputs: no named parameters. Returns: object
get_raster_infoGet Raster InfoARead-only
Get raster layer info: band count, dimensions, CRS, extent, per-band statistics, nodata values.
Inputs: layer_id (required). Returns: object
get_selectionGet SelectionARead-only
Get the current selection for a layer. Returns feature IDs and count.
Inputs: layer_id (required). Returns: object
get_settingGet SettingARead-only
Read a QGIS setting by key path (e.g. 'qgis/sketching/sketching_enabled').
Inputs: key (required). Returns: object
get_unique_valuesGet Unique ValuesARead-only
Return the distinct values of a field. Use 'limit' to cap results (-1 for all). Useful before building categorized symbology or filters.
Inputs: field (required), layer_id (required), limit. Returns: object
identify_featuresIdentify FeaturesARead-only
Identify features at a point [x, y] in project CRS across layers (map-click analogue). tolerance (map units) expands the search; 0 = exact hit. layer_ids limits the search (default: visible vector layers). limit caps features per layer.
Inputs: point (required), limit, layer_ids, tolerance.
list_layoutsList LayoutsARead-only
List all print layouts in the current project with names and page counts.
Inputs: no named parameters. Returns: object
list_pluginsList PluginsARead-only
List installed QGIS plugins with name, enabled status, and version. Set enabled_only=true to list only active plugins.
Inputs: enabled_only. Returns: object
list_processing_algorithmsList Processing AlgorithmsARead-only
Search for processing algorithms by keyword and/or provider. Returns id, name, provider for each match.
Inputs: search, provider. Returns: object
list_processing_modelsList Processing ModelsARead-only
List registered Processing models (the 'model' provider). Returns id, name, group for each. Use run_model to execute one.
Inputs: no named parameters. Returns: object
load_projectLoad ProjectC
Load a QGIS project from a .qgs/.qgz file path.
Inputs: path (required).
move_layer_to_groupMove Layer to GroupB
Move a layer into a layer group by group name.
Inputs: layer_id (required), group_name (required).
pingPingARead-only
Check connectivity to the QGIS plugin server. Returns pong if connected.
Inputs: no named parameters. Returns: object
raster_calculatorRaster CalculatorA
Band math via the QGIS raster calculator. Reference loaded raster layers in the expression as 'LayerName@band' (e.g. '("dem@1" > 1000) * 1'). Writes a GeoTIFF to output_path. Output grid/extent taken from reference_layer (layer id or name), defaulting to the first loaded raster.
Inputs: expression (required), output_path (required), reference_layer.
reload_pluginReload PluginADestructive
Reload a QGIS plugin by name. Cannot reload the MCP plugin itself. Useful during plugin development.
Inputs: plugin_name (required).
remove_bookmarkRemove BookmarkADestructive
Remove a spatial bookmark by its ID.
Inputs: bookmark_id (required).
remove_layerRemove LayerADestructive
Remove a layer from the project by its layer ID. This is irreversible.
Inputs: layer_id (required).
remove_layoutRemove LayoutBDestructive
Remove a print layout from the project.
Inputs: layout_name (required).
remove_map_themeRemove Map ThemeBDestructive
Remove a map theme by name.
Inputs: name (required).
rename_fieldRename FieldC
Rename a field in a vector layer.
Inputs: layer_id (required), new_name (required), old_name (required).
render_mapRender MapBIdempotent
Render the current map canvas to an image. Returns the image inline so you can see it. Optionally saves to a file path on disk.
Inputs: path, width, height.
run_modelRun ModelA
Run a Processing model by registered id (e.g. 'model:myflow') or by a .model3 file path. 'parameters' maps the model's input names to values (layer ids/paths, numbers, etc.).
Inputs: model (required), parameters.
sample_raster_valuesSample Raster ValuesARead-only
Sample raster pixel values at points. 'points' is a list of [x, y] in the raster's CRS. Omit 'band' to sample all bands. Use transform_coordinates first if your points are in a different CRS.
Inputs: points (required), raster_layer (required), band. Returns: object
save_projectSave ProjectBIdempotent
Save the current project. Optionally specify a new path.
Inputs: path.
save_style_qmlSave Style QMLC
Save a layer's style to a QGIS QML file.
Inputs: path (required), layer_id (required).
select_featuresSelect FeaturesBIdempotent
Select features in a layer by expression or feature IDs.
Inputs: layer_id (required), fids, expression.
set_active_layerSet Active LayerBIdempotent
Set the active layer in the QGIS layer panel by layer ID.
Inputs: layer_id (required).
set_canvas_extentSet Canvas ExtentAIdempotent
Set the map canvas extent. Coordinates should be in the specified CRS (default: project CRS).
Inputs: xmax (required), xmin (required), ymax (required), ymin (required), +1 more.
set_canvas_scaleSet Canvas ScaleAIdempotent
Set the map canvas scale and/or rotation. Provide scale as denominator (e.g. 50000 for 1:50000). Rotation in degrees (0-360).
Inputs: scale, rotation.
set_layer_crsSet Layer CRSA
Set the CRS of a layer (e.g. 'EPSG:4326'). This does NOT reproject data — it only changes how the layer's coordinates are interpreted.
Inputs: crs (required), layer_id (required).
set_layer_labelingSet Layer LabelingA
Configure labeling for a vector layer. Set enabled=false to disable labels. Set field_name to the attribute field to label with. Optional: font_size (float), color (hex like '#000000').
Inputs: layer_id (required), color, enabled, font_size, +1 more.
set_layer_orderSet Layer OrderAIdempotent
Reorder layer tree nodes; tree order is draw order. layer_ids is the ordered list of layer ids from top (drawn last) to bottom; unlisted layers keep their slots. Clears any custom draw order (it freezes a snapshot list — layers added later would silently draw behind everything).
Inputs: layer_ids (required).
set_layer_propertySet Layer PropertyAIdempotent
Set a layer property. Supported properties: opacity (0.0-1.0), name (string), min_scale, max_scale (float), scale_visibility (bool).
Inputs: value (required), layer_id (required), property (required).
set_layer_styleSet Layer StyleA
Set symbology. style_type: 'single' (one symbol), 'categorized' (unique values), 'graduated' (numeric ranges). field required for categorized/graduated. color_ramp: QGIS ramp name (e.g. 'Spectral', 'Viridis', 'Blues'). classes: graduated class count (default 5).
Inputs: layer_id (required), style_type (required), field, classes, +1 more.
set_layer_visibilitySet Layer VisibilityBIdempotent
Set a layer's visibility in the layer tree (show/hide on map).
Inputs: visible (required), layer_id (required).
set_project_crsSet Project CRSA
Set the project coordinate reference system (e.g. 'EPSG:4326', 'EPSG:3857'). This changes how layers are projected on the map canvas.
Inputs: crs (required).
set_project_variableSet Project VariableBIdempotent
Set a project-level variable. Variables are accessible in expressions as @key.
Inputs: key (required), value (required).
set_settingSet SettingADestructive
Write a QGIS setting. Use with care — incorrect settings can affect QGIS behavior.
Inputs: key (required), value (required).
spatial_joinSpatial JoinA
Join attributes by location (native:joinattributesbylocation). predicates int list: 0=intersects 1=contains 2=equals 3=touches 4=overlaps 5=within 6=crosses (default [0]). method: 0=one-to-many 1=first match (default) 2=largest overlap. join_fields = copied columns (default all). No output_path = in-memory layer.
Inputs: join_layer (required), target_layer (required), method, prefix, +3 more.
transform_coordinatesTransform CoordinatesARead-only
Transform coordinates between CRS. Accepts a point {x, y}, a point list [{x, y}, ...], or a bbox {xmin, ymin, xmax, ymax}. Returns the same format.
Inputs: source_crs (required), target_crs (required), bbox, point, +1 more. Returns: object
update_featuresUpdate FeaturesADestructive
Update feature attributes. updates: [{fid: 1, attributes: {field: value}}]. Returns count of updated features.
Inputs: updates (required), layer_id (required).
validate_expressionValidate ExpressionARead-only
Validate a QGIS expression. Returns whether it's valid, any parse errors, and referenced column names. Optionally test against a layer's fields.
Inputs: expression (required), layer_id. Returns: object
zonal_statisticsZonal StatisticsB
Per-polygon stats from a raster (native:zonalstatisticsfb). stats int codes: 0=count 1=sum 2=mean 3=median 4=stdev 5=min 6=max 7=range 8=minority 9=majority 10=variety 11=variance (default [0,1,2]). New columns prefixed by 'prefix'. No output_path = in-memory layer.
Inputs: raster_layer (required), polygon_layer (required), band, stats, +2 more.
zoom_to_layerZoom to LayerAIdempotent
Zoom the map canvas to the full extent of the specified layer.
Inputs: layer_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 103 tools
Most tools have clearly distinct purposes, but with 103 tools there is some potential for confusion, e.g., between screenshot tools (get_canvas_screenshot, get_3d_screenshot, render_map) and between execution commands (execute_processing, execute_processing_batch, execute_code, batch_commands). Descriptions help differentiate, but the sheer volume may cause an agent to misselect.
All tools follow a consistent snake_case verb_noun pattern (e.g., set_canvas_extent, get_canvas_screenshot, list_processing_algorithms). Even utility tools like 'ping' and 'diagnose' are acceptable standalone verbs. No mixing of conventions.
With 103 tools, the count is extremely high. While QGIS is a complex platform, this granularity far exceeds the typical well-scoped range of 3-15 tools. The surface feels bloated and could be consolidated (e.g., multiple layout addition tools, many field operations).
The tool set covers virtually all major QGIS functionalities: project management, layer CRUD, canvas control, processing algorithms, print layouts, atlas, expressions, SQL, and more. Missing features (e.g., direct geometry editing) can be achieved via execute_processing or execute_code, so no critical gaps.
Related MCP Connectors
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
Geospatial MCP server for earthquake, tsunami, volcano, disaster, and FX data queries.
Skills, agents and memory in the cloud, plus a gateway to your other MCP servers.
Related MCP Servers
- AlicenseBqualityAmaintenanceAn MCP server that enables AI assistants to directly control QGIS for tasks like layer management, feature editing, and map rendering. It provides a suite of 50 tools to execute processing algorithms and manage GIS projects through natural language commands.125429GPL 2.0
- FlicenseBqualityDmaintenanceQGISMCP connects QGIS to Claude AI through the Model Context Protocol (MCP), allowing Claude to directly interact with and control QGIS for project creation, layer loading, code execution, and more.151-
- AlicenseNot gradedqualityDmaintenanceConnects 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.GPL 2.0
- AlicenseNot gradedqualityBmaintenanceConnects QGIS to any MCP-speaking AI agent, exposing 125 tools that let the agent manage layers, edit features, run processing algorithms, render and style maps, author layouts and atlases, query across layers with SQL, and administer the QGIS session. Works with any MCP client and QGIS 3.28–4.x.GPL 2.0