Skip to main content
Glama
QGIS MCP Server
by awheeler262

Quantum GIS (QGIS) MCP

This project explores ways to interact with QGIS using the QGIS MCP Plugin and an MCP Server.

  1. Install QGIS MCP Plugin.

  2. Set configuration to start MCP server on start-up.

  3. Configure Claude as directed, mostly. Best to add -s user to 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-server
  4. Ask 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 Server

Test with:

uv run pytest -v

Run with:

uv run python -m app.main

Related 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 tools
add_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 FeaturesA
Destructive

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 ThemeA
Idempotent

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 SelectionC
Idempotent

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 FeaturesA
Destructive

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 FieldC
Destructive

Delete a field from a vector layer.

Inputs: layer_id (required), field_name (required).

diagnoseDiagnoseA
Read-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 ExpressionA
Read-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 CodeA
Destructive

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 AtlasA
Idempotent

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 LayerA
Idempotent

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 LayoutA
Idempotent

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 LayerA
Read-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 ScreenshotA
Read-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 LayerA
Read-only

Get the currently active (selected) layer in the QGIS layer panel.

Inputs: no named parameters. Returns: object

get_algorithm_helpGet Algorithm HelpA
Read-only

Get detailed help for a processing algorithm: parameters (name, type, optional, default), outputs, and description.

Inputs: algorithm_id (required). Returns: object

get_bookmarksGet BookmarksA
Read-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 ExtentA
Read-only

Get the current map canvas extent and CRS.

Inputs: no named parameters. Returns: object

get_canvas_scaleGet Canvas ScaleA
Read-only

Get the current map canvas scale, rotation, and magnification factor.

Inputs: no named parameters. Returns: object

get_canvas_screenshotGet Canvas ScreenshotA
Read-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 StatisticsA
Read-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 CRSA
Read-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 ExtentA
Read-only

Get the spatial extent (bounding box) and CRS of a layer.

Inputs: layer_id (required). Returns: object

get_layer_featuresGet Layer FeaturesA
Read-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 LabelingA
Read-only

Get the labeling configuration of a vector layer: enabled state, field, font size, color.

Inputs: layer_id (required). Returns: object

get_layersGet LayersA
Read-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 TreeA
Read-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 InfoB
Read-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 ThemesA
Read-only

Get map themes (visibility presets). Each theme stores which layers are visible.

Inputs: no named parameters. Returns: object

get_message_logGet Message LogA
Read-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 InfoA
Read-only

Get detailed info for a specific plugin: name, enabled, version, description, author, path.

Inputs: plugin_name (required). Returns: object

get_processing_providersGet Processing ProvidersA
Read-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 InfoA
Read-only

Get current project metadata: filename, title, CRS, layer count, and summary of layers.

Inputs: no named parameters. Returns: object

get_project_variablesGet Project VariablesA
Read-only

Get all project-level variables (key-value pairs set in Project Properties).

Inputs: no named parameters. Returns: object

get_qgis_infoGet QGIS InfoA
Read-only

Get QGIS version, profile path, and plugin count.

Inputs: no named parameters. Returns: object

get_raster_infoGet Raster InfoA
Read-only

Get raster layer info: band count, dimensions, CRS, extent, per-band statistics, nodata values.

Inputs: layer_id (required). Returns: object

get_selectionGet SelectionA
Read-only

Get the current selection for a layer. Returns feature IDs and count.

Inputs: layer_id (required). Returns: object

get_settingGet SettingA
Read-only

Read a QGIS setting by key path (e.g. 'qgis/sketching/sketching_enabled').

Inputs: key (required). Returns: object

get_unique_valuesGet Unique ValuesA
Read-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 FeaturesA
Read-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 LayoutsA
Read-only

List all print layouts in the current project with names and page counts.

Inputs: no named parameters. Returns: object

list_pluginsList PluginsA
Read-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 AlgorithmsA
Read-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 ModelsA
Read-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).

pingPingA
Read-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 PluginA
Destructive

Reload a QGIS plugin by name. Cannot reload the MCP plugin itself. Useful during plugin development.

Inputs: plugin_name (required).

remove_bookmarkRemove BookmarkA
Destructive

Remove a spatial bookmark by its ID.

Inputs: bookmark_id (required).

remove_layerRemove LayerA
Destructive

Remove a layer from the project by its layer ID. This is irreversible.

Inputs: layer_id (required).

remove_layoutRemove LayoutB
Destructive

Remove a print layout from the project.

Inputs: layout_name (required).

remove_map_themeRemove Map ThemeB
Destructive

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 MapB
Idempotent

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 ValuesA
Read-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 ProjectB
Idempotent

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 FeaturesB
Idempotent

Select features in a layer by expression or feature IDs.

Inputs: layer_id (required), fids, expression.

set_active_layerSet Active LayerB
Idempotent

Set the active layer in the QGIS layer panel by layer ID.

Inputs: layer_id (required).

set_canvas_extentSet Canvas ExtentA
Idempotent

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 ScaleA
Idempotent

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 OrderA
Idempotent

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 PropertyA
Idempotent

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 VisibilityB
Idempotent

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 VariableB
Idempotent

Set a project-level variable. Variables are accessible in expressions as @key.

Inputs: key (required), value (required).

set_settingSet SettingA
Destructive

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 CoordinatesA
Read-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 FeaturesA
Destructive

Update feature attributes. updates: [{fid: 1, attributes: {field: value}}]. Returns count of updated features.

Inputs: updates (required), layer_id (required).

validate_expressionValidate ExpressionA
Read-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 LayerA
Idempotent

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

    B3/5.0

    Scored across 103 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count1/5

    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).

    Completeness5/5

    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

    Related MCP Servers

    • A
      license
      B
      quality
      A
      maintenance
      An 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.
      125
      429
      GPL 2.0
    • F
      license
      B
      quality
      D
      maintenance
      QGISMCP 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.
      15
      1
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      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.
      GPL 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Connects 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