Skip to main content
Glama

QGIS Python Build and Release License

QGIS MCP [PL]

English | Polski


English

1. Project description

QGIS MCP is a local MCP server that lets Claude Desktop (others as well) inspect and transform layers in the QGIS project you currently have open — summarize a layer in one call, filter and select features by expression, reproject, clip, and merge layers, compute field statistics, add computed fields, and export to common formats — all without leaving your machine.

The system is made of two cooperating processes that never share code:

Claude Desktop
   | stdio (MCP)
   v
server/            local Python process, connects over TCP — never imports qgis.*
   | 127.0.0.1:9876, newline-delimited JSON
   v
plugin/qgis_mcp/   QGIS plugin, runs inside QGIS's own interpreter
   v
QgsProject.instance()  (the project you have open)
  • server/ is what Claude Desktop launches and talks MCP to.

  • plugin/qgis_mcp/ is a QGIS plugin that runs a small command server inside QGIS and answers requests from server/ over a loopback-only socket (127.0.0.1) — nothing is ever exposed to the network.

Because everything runs locally over 127.0.0.1, your project data never leaves your machine except for the parts of the conversation you share with Claude.

2. Requirements

  • QGIS 3.22 or newer, installed and runnable on your machine.

  • Claude Desktop, installed and signed in.

  • Python 3.12+ to run the local MCP server (a dedicated virtual environment is created for it; it does not use QGIS's bundled Python).

  • macOS, Windows, or Linux — installing the plugin through QGIS's Plugin Manager (see below) works on all platforms. Some developer-only scripts in this repo (scripts/deploy_plugin.sh) are macOS-specific and are not needed for normal use.

3. Installing the QGIS Plugin

The plugin is distributed as a .zip file attached to the project's GitHub Releases page (qgis_mcp-<version>.zip).

  1. Download the latest qgis_mcp-<version>.zip from the Releases page.

  2. In QGIS, open Plugins → Manage and Install Plugins…

  3. Go to the Install from ZIP tab.

  4. Select the downloaded .zip file and click Install Plugin.

  5. Make sure QGIS MCP is checked/enabled in the plugin list.

Once enabled, the plugin automatically starts a command server listening on 127.0.0.1:9876 — there is nothing else to click or start. You can confirm it's running from the small toolbar icon / menu entry the plugin adds; that toggle only lets you stop the server, since it starts on its own so Claude Desktop can always reach it.

If you install a newer version of the plugin later, restart QGIS afterwards to make sure the updated code is loaded.

4. Downloading the server & configuring Claude Desktop

a) Get the server code

This project is managed with uv. With uv installed:

git clone https://github.com/piatkowski/qgis-mcp.git
cd qgis-mcp
uv sync

This creates a .venv and installs the exact dependency versions from uv.lock (fastmcp, httpx). Nothing from qgis.* is required here — this environment is completely separate from QGIS.

If you don't have uv installed, plain pip works too — dependencies are declared in pyproject.toml, no requirements.txt needed:

git clone https://github.com/piatkowski/qgis-mcp.git
cd qgis-mcp
python3 -m venv .venv
.venv/bin/pip install -e .

This installs the same packages, just without pinning to the exact locked versions in uv.lock.

b) Point Claude Desktop at it

Open Claude Desktop's config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Add (or merge) an entry under mcpServers, using the absolute path to the .venv you just created:

{
  "mcpServers": {
    "qgis-mcp": {
      "command": "/absolute/path/to/qgis-mcp/.venv/bin/python",
      "args": ["-m", "server"]
    }
  }
}

On Windows, command would instead point at ...\qgis-mcp\.venv\Scripts\python.exe.

c) Restart Claude Desktop

Quit and reopen Claude Desktop. With QGIS open and the plugin enabled, Claude should now be able to list and use the QGIS MCP tools.

d) Verify the connection (optional, for troubleshooting)

With QGIS running and the plugin enabled, you can check the two sides can talk directly from a terminal:

.venv/bin/python -c "from server.bridge import request; print(request('ping'))"

A successful response confirms the server can reach the plugin's command server inside QGIS.

5. Available tools

  • get_layer_summary – for any layer, returns the following at once: number of features, geometry type, CRS, extent, and a list of fields with types and sample values ​​– one call instead of five.

  • filter_layer_by_expression – sets a QGIS filter expression on the layer (subset string) and returns the number of features remaining after the filter.

  • select_features_by_expression – selects features that match the expression (e.g., "pop" > 1000) and returns their ID/number.

  • get_layer_extent_wkt – returns the layer extent as a WKT/bbox, ready for use in the next step (e.g., clipping).

  • reproject_layer – changes the layer's CRS and saves it as a new layer, with automatic validation of whether the transformation was successful.

  • clip_layer_to_extent – clips a layer to the extent of another layer or the specified bbox – one of the most common actions, but it's not explicitly provided.

  • merge_layers – merges multiple vector layers of the same geometry type into one, reporting field schema conflicts.

  • get_field_statistics – returns the min/max/average/sum/unique values ​​for a given numeric field without having to launch the processing toolbox.

  • add_field_with_values – adds a new field and populates it with values ​​from an expression (field calculator) in a single step.

  • export_layer – exports a layer to a format (GeoJSON/Shapefile/GPKG/CSV) with automatic parameter selection.

6. Troubleshooting

  • Claude doesn't show any QGIS tools / can't connect. Check that the mcpServers entry in claude_desktop_config.json uses an absolute path to .venv/bin/python (or .venv\Scripts\python.exe on Windows), that the JSON is valid, and that you fully restarted Claude Desktop after editing it.

  • Tool calls fail with a connection/timeout error. Make sure QGIS is running and the QGIS MCP plugin is enabled (check Plugins → Manage and Install Plugins). The plugin must be running inside QGIS for the server to reach it — the server only relays requests, it does not run QGIS itself.

  • Error message starts with [BridgeTimeout] or [BridgeError]. These indicate the server couldn't reach the plugin's socket at 127.0.0.1:9876 in time — QGIS may be closed, busy, or the plugin may not be enabled. Errors prefixed with a different type (e.g. [LayerNotFound], [UnsupportedLayerType]) come from the plugin itself and describe why the requested operation failed, not a connection problem.

  • You just installed/updated the plugin and nothing changed. QGIS does not hot-reload plugin code. Restart QGIS after installing a new version.

  • Port 9876 already in use / need a different port. Both sides read QGIS_MCP_HOST / QGIS_MCP_PORT environment variables independently. Set both consistently — for the server, in the env section of its mcpServers config entry; for the plugin, in the environment QGIS itself is launched with.

  • The plugin refuses to bind to a non-127.0.0.1 address. This is intentional: the command server only ever listens on loopback, by design, so nothing on your QGIS project is ever reachable from the network.


Related MCP server: QGISMCP

Polski

1. Opis projektu

QGIS MCP to lokalny serwer MCP, który pozwala Claude Desktop (i nie tylko) analizować i przekształcać warstwy w aktualnie otwartym projekcie QGIS — podsumować warstwę jednym wywołaniem, filtrować i zaznaczać obiekty wyrażeniem, przeprojektowywać, przycinać i łączyć warstwy, liczyć statystyki pól, dodawać pola obliczeniowe oraz eksportować do popularnych formatów — wszystko lokalnie, bez opuszczania Twojego komputera.

System składa się z dwóch współpracujących procesów, które nigdy nie dzielą kodu:

Claude Desktop
   | stdio (MCP)
   v
server/            lokalny proces Pythona, łączy się przez TCP — nigdy nie importuje qgis.*
   | 127.0.0.1:9876, dane JSON oddzielone znakiem nowej linii
   v
plugin/qgis_mcp/   wtyczka QGIS, działa wewnątrz interpretera samego QGIS
   v
QgsProject.instance()  (otwarty projekt)
  • server/ to proces uruchamiany przez Claude Desktop, komunikujący się z nim przez MCP.

  • plugin/qgis_mcp/ to wtyczka QGIS, która uruchamia niewielki serwer poleceń wewnątrz QGIS i odpowiada na żądania z server/ przez gniazdo dostępne wyłącznie lokalnie (127.0.0.1) — nic nie jest udostępniane w sieci.

Ponieważ wszystko działa lokalnie na 127.0.0.1, dane Twojego projektu nie opuszczają komputera, poza fragmentami rozmowy, którymi sam(a) zdecydujesz się podzielić z Claude.

2. Wymagania

  • QGIS w wersji 3.22 lub nowszej, zainstalowany i uruchamialny na Twoim komputerze.

  • Claude Desktop, zainstalowany i zalogowany.

  • Python 3.12+ do uruchomienia lokalnego serwera MCP (tworzone jest dla niego dedykowane środowisko wirtualne; nie korzysta z Pythona dołączonego do QGIS).

  • macOS, Windows lub Linux — instalacja wtyczki przez menedżer wtyczek QGIS (patrz niżej) działa na wszystkich platformach. Niektóre skrypty deweloperskie w tym repozytorium (scripts/deploy_plugin.sh) są przeznaczone wyłącznie dla macOS i nie są potrzebne do normalnego użytkowania.

3. Instalacja wtyczki QGIS

Wtyczka jest dystrybuowana jako plik .zip dołączony do strony GitHub Releases projektu (qgis_mcp-<wersja>.zip).

  1. Pobierz najnowszy plik qgis_mcp-<wersja>.zip ze strony Releases.

  2. W QGIS otwórz Wtyczki → Zarządzaj i instaluj wtyczki…

  3. Przejdź do zakładki Zainstaluj z ZIP.

  4. Wybierz pobrany plik .zip i kliknij Zainstaluj wtyczkę.

  5. Upewnij się, że wtyczka QGIS MCP jest zaznaczona/włączona na liście wtyczek.

Po włączeniu wtyczka automatycznie uruchamia serwer poleceń nasłuchujący na 127.0.0.1:9876 — nie trzeba nic dodatkowo klikać ani uruchamiać. Działanie serwera można potwierdzić z poziomu małej ikony na pasku narzędzi / wpisu w menu dodawanego przez wtyczkę; ten przełącznik pozwala jedynie celowo zatrzymać serwer, ponieważ uruchamia się on sam, tak by Claude Desktop zawsze mógł się z nim połączyć.

Jeśli w przyszłości zainstalujesz nowszą wersję wtyczki, zrestartuj potem QGIS, aby mieć pewność, że wczytany zostanie zaktualizowany kod.

4. Pobranie serwera i konfiguracja w Claude Desktop

a) Pobierz kod serwera

Ten projekt jest zarządzany za pomocą uv. Mając zainstalowane uv:

git clone https://github.com/piatkowski/qgis-mcp.git
cd qgis-mcp
uv sync

To polecenie tworzy .venv i instaluje dokładnie te wersje zależności, które są zapisane w uv.lock (fastmcp, httpx). Nie jest tu potrzebne nic z qgis.* — to środowisko jest całkowicie odseparowane od QGIS.

Jeśli nie masz zainstalowanego uv, zwykły pip też zadziała — zależności są zadeklarowane w pyproject.toml, plik requirements.txt nie jest potrzebny:

git clone https://github.com/piatkowski/qgis-mcp.git
cd qgis-mcp
python3 -m venv .venv
.venv/bin/pip install -e .

Zainstaluje to te same pakiety, tylko bez przypięcia do dokładnych, zablokowanych wersji z uv.lock.

b) Wskaż serwer w Claude Desktop

Otwórz plik konfiguracyjny Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Dodaj (lub połącz z istniejącą zawartością) wpis w sekcji mcpServers, używając bezwzględnej ścieżki do utworzonego przed chwilą .venv:

{
  "mcpServers": {
    "qgis-mcp": {
      "command": "/absolute/path/to/qgis-mcp/.venv/bin/python",
      "args": ["-m", "server"]
    }
  }
}

W systemie Windows command powinno wskazywać zamiast tego na ...\qgis-mcp\.venv\Scripts\python.exe.

c) Zrestartuj Claude Desktop

Zamknij i uruchom ponownie Claude Desktop. Przy otwartym QGIS i włączonej wtyczce Claude powinien teraz widzieć i móc używać narzędzi QGIS MCP.

d) Sprawdzenie połączenia (opcjonalnie, do diagnostyki)

Przy uruchomionym QGIS i włączonej wtyczce można bezpośrednio sprawdzić z terminala, czy obie strony się komunikują:

.venv/bin/python -c "from server.bridge import request; print(request('ping'))"

Poprawna odpowiedź potwierdza, że serwer może dotrzeć do serwera poleceń wtyczki działającego wewnątrz QGIS.

5. Lista narzędzi

  • get_layer_summary – dla dowolnej warstwy zwraca od razu: liczbę obiektów, typ geometrii, CRS, zasięg, listę pól z typami i przykładowymi wartościami – jedno wywołanie zamiast pięciu.

  • filter_layer_by_expression – ustawia filtr QGIS expression na warstwie (subset string) i zwraca ile obiektów zostało po filtrze.

  • select_features_by_expression – zaznacza obiekty spełniające wyrażenie (np. "pop" > 1000) i zwraca ich ID/liczbę.

  • get_layer_extent_wkt – zwraca zasięg warstwy jako WKT/bbox gotowe do użycia w kolejnym kroku (np. przycinaniu).

  • reproject_layer – zmienia CRS warstwy i zapisuje jako nową, z automatyczną walidacją czy transformacja się udała.

  • clip_layer_to_extent – przycina warstwę do zasięgu innej warstwy lub podanego bbox – jedna z najczęstszych czynności, a nie ma jej wprost.

  • merge_layers – łączy kilka warstw wektorowych tego samego typu geometrii w jedną, z raportem konfliktów schematu pól.

  • get_field_statistics – dla wskazanego pola liczbowego zwraca min/max/średnią/sumę/unikalne wartości bez konieczności odpalania processing toolboxa.

  • add_field_with_values – dodaje nowe pole i wypełnia je wartościami z wyrażenia (field calculator) w jednym kroku.

  • export_layer – eksportuje warstwę do formatu (GeoJSON/Shapefile/GPKG/CSV) z automatycznym doborem parametrów.


6. Rozwiązywanie problemów

  • Claude nie pokazuje żadnych narzędzi QGIS / nie może się połączyć. Sprawdź, czy wpis mcpServers w claude_desktop_config.json używa bezwzględnej ścieżki do .venv/bin/python (lub .venv\Scripts\python.exe w Windows), czy JSON jest poprawny, oraz czy Claude Desktop został w pełni zrestartowany po edycji pliku.

  • Wywołania narzędzi kończą się błędem połączenia/przekroczenia czasu. Upewnij się, że QGIS jest uruchomiony, a wtyczka QGIS MCP jest włączona (Wtyczki → Zarządzaj i instaluj wtyczki). Wtyczka musi działać wewnątrz QGIS, aby serwer mógł się z nią połączyć — sam serwer jedynie przekazuje żądania, nie uruchamia QGIS.

  • Komunikat błędu zaczyna się od [BridgeTimeout] lub [BridgeError]. Oznacza to, że serwer nie zdążył połączyć się z gniazdem wtyczki na 127.0.0.1:9876 — QGIS może być zamknięty, zajęty, albo wtyczka może być wyłączona. Błędy z innym prefiksem (np. [LayerNotFound], [UnsupportedLayerType]) pochodzą z samej wtyczki i opisują, dlaczego żądana operacja się nie powiodła — to nie jest problem z połączeniem.

  • Właśnie zainstalowano/zaktualizowano wtyczkę i nic się nie zmieniło. QGIS nie wczytuje kodu wtyczek na gorąco. Po instalacji nowej wersji zrestartuj QGIS.

  • Port 9876 jest zajęty / potrzebny inny port. Obie strony niezależnie odczytują zmienne środowiskowe QGIS_MCP_HOST / QGIS_MCP_PORT. Ustaw je spójnie po obu stronach — dla serwera w sekcji env jego wpisu w mcpServers, dla wtyczki w środowisku, w którym uruchamiany jest sam QGIS.

  • Wtyczka odmawia nasłuchiwania na adresie innym niż 127.0.0.1. To celowe zachowanie: serwer poleceń zawsze nasłuchuje wyłącznie lokalnie, dzięki czemu nic w Twoim projekcie QGIS nigdy nie jest dostępne z sieci.

Available Tools

10 tools
add_field_with_valuesB

Add a new field and populate every feature from a QGIS expression, in one step.

type is one of: integer, double, string, date, datetime, boolean. The add-and-populate happens inside a single edit session: if the expression fails to evaluate on any feature, the field addition is rolled back too.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeNodouble
lengthNo
precisionNo
expressionYes
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It reveals the atomic rollback on expression failure, which is important. However, it omits whether the operation modifies the original layer, permission requirements, side effects, or return value structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with minimal fluff. The first sentence front-loads the core action. The second adds crucial atomicity detail. Could be slightly more structured (e.g., bulleted types) but is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, no schema descriptions, and an existing output schema, the description covers the operation's unique behavior (atomicity, type options) but fails to explain parameters like length/precision or output. It's adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only explains the 'type' parameter's allowed values. Other parameters (name, expression, layer_name, length, precision) receive no additional meaning beyond the schema's basic type/defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it adds a new field and populates it from a QGIS expression in one step. It lists valid types and describes atomicity. This distinguishes it from sibling tools, none of which perform field addition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, trade-offs, or cases where it's inappropriate (e.g., existing field names). The default type and length/precision defaults are implied but not explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clip_layer_to_extentA

Clip a layer to a bounding-box extent, saving the result as a new layer.

Provide exactly one of reference_layer_name (clip to that layer's extent) or bbox as [xmin, ymin, xmax, ymax] (crs defaults to the source layer's CRS if omitted). This clips to the rectangular extent, not the reference layer's actual feature geometries. The original layer is left untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
crsNo
bboxNo
nameNo
layer_nameYes
reference_layer_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the original layer is left untouched, that a new layer is created, and that the clip is to a rectangular extent rather than feature geometries. It also mentions parameter defaults (crs). Lacks details on error handling or performance, but the essential behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two short paragraphs and four sentences. Every sentence adds value: the first states the main action, the second provides parameter guidance. No superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (5 parameters, output schema present), the description is largely complete. It covers the core operation, parameter constraints, and an important behavioral nuance (rectangular vs. feature clip). It does not address error cases or validation, but these are less critical for such a straightforward clipping operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the role of `reference_layer_name` and `bbox`, describes bbox format as [xmin, ymin, xmax, ymax], and notes crs default. The name parameter is implied by 'saving the result as a new layer'. This provides substantial meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'clip' and identifies the resource as 'a layer', while clearly stating the result is 'saving the result as a new layer'. It distinguishes itself from sibling tools like 'filter_layer_by_expression' by focusing on a bounding-box extent rather than attribute expressions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states to provide exactly one of `reference_layer_name` or `bbox`, and clarifies that the clip is to the rectangular extent, not the reference layer's geometries. It does not explicitly mention when to use this tool versus alternatives like 'get_layer_extent_wkt' or 'reproject_layer', but the guidance is clear enough for most use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_layerA

Export a layer to GeoJSON, Shapefile, GPKG, or CSV.

format is one of: geojson, shapefile, gpkg, csv - inferred from path's extension if omitted. CSV exports include geometry as a WKT column automatically, since GDAL's CSV driver drops geometry by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
formatNo
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals a key behavior: CSV exports automatically include a WKT geometry column because GDAL drops geometry by default, and explains format inference. This adds useful context beyond basic operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The first sentence states the core function; the second adds crucial behavioral details about format inference and CSV geometry handling. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers supported formats and a special case (CSV WKT), but it does not specify whether the export saves to disk or returns data, nor where the output goes. An output schema exists but is not visible; the absence of this context makes it only partially complete for a 3-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for 'format' (possible values and inference from path) and explains the WKT column for CSV, but does not clarify 'layer_name' or provide details about 'path' (e.g., local vs cloud storage). Partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Export a layer to GeoJSON, Shapefile, GPKG, or CSV,' specifying both the action and the supported formats. It distinguishes from sibling tools (e.g., filter, reproject) by focusing on export.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how 'format' is inferred from the path extension if omitted, providing context on parameter usage. However, it does not explicitly state when to use this tool versus alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

filter_layer_by_expressionA

Set a QGIS expression as the layer's subset filter (subset string).

Only features matching expression remain visible/queryable on the layer until the filter is changed or cleared. Pass an empty string to clear the filter. Returns the feature count remaining after the filter is applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYes
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full burden for behavioral disclosure. It reveals that the filter restricts visibility/queryability, that clearing is possible via empty string, and that it returns the remaining feature count. No destructive behavior is disclosed, which is appropriate for a filtering operation. The description adds value beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences covering purpose, behavior, clearing mechanism, and return value. No extraneous words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and no annotations, the description covers the core behavior and return value. However, it omits explanation of the 'layer_name' parameter and does not provide guidance on expression syntax. With an output schema present, return value is partially addressed, but missing parameter semantics reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only explains the 'expression' parameter (e.g., 'Pass an empty string to clear the filter'), but does not describe the 'layer_name' parameter at all. This leaves a significant gap for the agent to understand the latter's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Set a QGIS expression as the layer's subset filter.' It uses a specific verb ('Set') and resource ('subset filter'), and the action is distinct from sibling tools like 'select_features_by_expression' which is for selection, not filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the filter persists until changed or cleared, and provides guidance on using an empty string to clear. However, it lacks explicit when-to-use or when-not-to-use guidance relative to sibling tools, leaving usage context partially implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_field_statisticsA

Get min/max/mean/sum and distinct-value count for a numeric field.

Fails with UnsupportedFieldType if the field isn't numeric. Also includes a capped preview of distinct values seen on the field.

ParametersJSON Schema
NameRequiredDescriptionDefault
field_nameYes
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the error condition for non-numeric fields and mentions a capped preview of distinct values. With no annotations, this provides useful behavioral context, though it omits details like auth requirements or potential performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences: the first states the core purpose, and the second adds error behavior and additional output. No superfluous information, well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (two string parameters, clear output schema exists), the description covers the main functionality, error condition, and output highlights. It does not specify the cap size for previews, but overall it is sufficient for an agent to understand and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, leaving the description to compensate. However, it does not define or add constraints to the parameters (layer_name, field_name) beyond their names. While the names are self-explanatory, the description fails to add meaning or constraints, earning a low score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves min/max/mean/sum and distinct-value count for a numeric field. It is a specific verb-resource combination, and the sibling tools operate at the layer level, distinguishing this as a field-specific statistics tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use on numeric fields (fails with UnsupportedFieldType otherwise) but does not explicitly state when to use this tool vs. alternatives or provide when-not guidance. Siblings do not offer field-level statistics, so competition is minimal, but explicit guidance is lacking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_layer_extent_wktA

Get a layer's extent as both a bbox and ready-to-use WKT polygon.

Useful as an input to a following step, e.g. clip_layer_to_extent or a Processing algorithm that takes a geometry parameter.

ParametersJSON Schema
NameRequiredDescriptionDefault
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry full weight. It mentions the output format but does not disclose potential side effects, error conditions, or read-only nature. Adequate for a simple retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main purpose and output format. Every word is informative and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema, the description covers the essential purpose, output, and usage context. Could mention that the output is a geometry or return format if not already in output schema, but still complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema specifies a single required parameter layer_name with no description. The tool description does not elaborate on this parameter, missing an opportunity to clarify valid inputs or constraints. Schema coverage is 0%, so description should compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a layer's extent and specifies the output format as both bbox and WKT polygon. This differentiates it from sibling tools like get_layer_summary or clip_layer_to_extent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly suggests using this tool as input to subsequent steps, with concrete examples like clip_layer_to_extent. Context is clear but does not include when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_layer_summaryA

Summarize a layer in one call: feature count, geometry type, CRS, extent, and fields.

Replaces the usual five round-trips (layer_info + list_fields + samples) with a single response. For vector layers, each field comes with up to 3 example values pulled from the first features scanned - not a full distinct-value enumeration. Raster layers get the shared metadata (id/name/type/crs/extent) with geometry_type, feature_count, and fields set to null.

ParametersJSON Schema
NameRequiredDescriptionDefault
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It clearly explains that for vector layers, fields come with up to 3 example values (not full enumeration) and that raster layers have null fields. This discloses behavioral traits beyond the basic summary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs with the key action in the first sentence. It efficiently covers vector/raster differences without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema is rich, the description effectively explains what the output includes for both layer types and notes limitations (example values not full distinct). It is complete for the tool's purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description adds no detail about the sole parameter 'layer_name' beyond its implied meaning. It does not specify format, completeness, or constraints, relying entirely on the parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb 'Summarize' and specifies the resource 'a layer' along with the exact outputs: feature count, geometry type, CRS, extent, and fields. It distinguishes from sibling tools by explaining it replaces five separate calls, while siblings like filter_layer_by_expression or reproject_layer serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states this tool replaces five round-trips (layer_info, list_fields, samples) with a single response, implying it is the go-to for quick summary. However, it does not explicitly list when not to use it or compare to alternatives among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_layersA

Merge multiple vector layers of the same geometry type into one new layer.

Fails with GeometryTypeMismatch if the layers don't all share one geometry type. crs defaults to the first layer's CRS if omitted. Returns schema_conflicts: field names that aren't present on every input layer (missing values are left null on features from layers that lack that field).

ParametersJSON Schema
NameRequiredDescriptionDefault
crsNo
nameNo
layer_namesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully takes on behavioral disclosure. It reveals error conditions (GeometryTypeMismatch), default behavior (crs), and output features (returns `schema_conflicts` with nulls for missing fields). It could be improved by stating that original layers are not modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses four sentences with no wasted words. The core purpose is front-loaded in the first sentence, followed by clear details on failure, defaults, and output. Every sentence serves a distinct purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description need not detail return values, but it does mention `schema_conflicts`. It covers key edge cases (geometry mismatch, crs default, missing fields). Missing details about attribute handling beyond conflicts (e.g., duplicate field values, feature merging strategy) leave minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description is the sole source of parameter meaning. It explains `crs` default behavior and implicitly clarifies `layer_names` via context. However, `name` (the output layer name) is not described at all. The description adds value by explaining geometry type constraint and schema conflict output, partially compensating for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb ('Merge') and specifies the resource ('multiple vector layers') and condition ('of the same geometry type'). It distinctly separates this tool from siblings like filter, clip, and reproject by focusing on combining layers into one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states that the tool fails with GeometryTypeMismatch if layers don't share a geometry type, implying it should only be used for same-type layers. It also notes `crs` defaults to the first layer's CRS. However, it does not explicitly contrast when to use merge versus other operations like append or union.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reproject_layerA

Reproject a vector layer to a new CRS, saving the result as a new layer.

The original layer is left untouched. The new in-memory layer is added to the project and validated: validated is true only if the output CRS matches target_crs and its feature count matches the source layer's.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
layer_nameYes
target_crsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses key behaviors: the original layer remains unchanged, a new in-memory layer is added to the project, and validation criteria are detailed ('validated is true only if the output CRS matches target_crs and its feature count matches the source layer's'). Since no annotations are provided, the description carries the full burden and excels.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two clear sentences. The first states the primary purpose, and the second adds essential behavioral details. No redundant or irrelevant information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and a low-parameter description coverage, the description adequately covers the tool's purpose, behavior, and validation. It does not explain return values, but an output schema exists. The description is sufficient for a tool with moderate complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has three parameters: name, layer_name, target_crs. The description only indirectly explains layer_name (as 'vector layer') and target_crs (as 'new CRS') but does not clarify the format for target_crs (e.g., EPSG code) or the purpose of the optional 'name' parameter. With 0% schema description coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Reproject a vector layer to a new CRS, saving the result as a new layer.' It uses a specific verb (reproject) and resource (vector layer), and the outcome is well-defined. This distinguishes it from sibling tools like filtering or exporting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly advises when to use the tool (when a reprojected copy is needed) and explicitly notes the original layer is untouched, implying no destructive side effects. It does not provide explicit alternatives or when-not-to-use conditions, but the context from sibling tools suggests no overlap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_features_by_expressionB

Select features on a layer matching a QGIS expression, e.g. "pop" > 1000.

mode controls how the match combines with any existing selection: "set" (replace, default), "add", "intersect", or "remove". Returns the total selected count and a preview of matched feature ids (capped; the count is always exact even when the id list is truncated).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoset
expressionYes
layer_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description has full responsibility for behavioral disclosure. It describes the return values (count and preview of feature ids) and the effect of different 'modes' on existing selection. However, it does not state whether the tool is read-only or if it modifies the layer permanently, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief, consisting of two sentences that convey essential information. It is well-structured with a clear separation between the general purpose and the parameter behavior. There is no extraneous content, but a slightly more structured format could improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main aspects: purpose, parameters, and return values. However, given the existence of an output schema (implied by context signals), the description could rely on it for return details but instead provides them, which is good. Still, it lacks comparison with siblings and fails to mention edge cases or limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It thoroughly explains the 'mode' parameter and provides an example for 'expression', but 'layer_name' is not described. This gives partial coverage but leaves one parameter without additional semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it selects features based on a QGIS expression, specifying the verb 'select' and the resource 'features on a layer'. However, it does not differentiate from the sibling tool 'filter_layer_by_expression', which may have similar functionality, leading to potential confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an example expression and explains the 'mode' parameter in detail, which helps in usage. However, it does not offer explicit guidance on when to use this tool over alternatives like 'filter_layer_by_expression' or mention prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 125 tool updatesv0.1.3
    • Addedadd_field_with_values
    • Removedattributes_add_field
    • Removedattributes_calculate
    • Removedattributes_delete_field
    • Removedattributes_list_fields
    • Removedattributes_rename_field
    • Removedattributes_statistics
    • Removedattributes_unique_values
    • Removedattributes_update_feature
    • Addedclip_layer_to_extent
    • Removedcrs_assign_by_guess
    • Removedcrs_detect_zone_2000
    • Removedcrs_height_transform
    • Removedcrs_list_polish
    • Removedcrs_transform_point
    • Removedemuia_search
    • Addedexport_layer
    • Removedfeatures_clear_selection
    • Removedfeatures_count
    • Removedfeatures_get
    • Removedfeatures_get_selected
    • Removedfeatures_select_by_expression
    • Removedfeatures_select_by_location
    • Removedfeatures_select_by_rectangle
    • Addedfilter_layer_by_expression
    • Removedgeocode_batch_csv
    • Removedgeocode_gugik_prg
    • Removedgeocode_nominatim
    • Removedgeocode_photon
    • Removedgeocode_reverse
    • Removedgeoportal_add_service
    • Addedget_field_statistics
    • Addedget_layer_extent_wkt
    • Removedget_layer_sample
    • Removedget_layer_schema
    • Addedget_layer_summary
    • Removedgugik_bdoo
    • Removedgugik_bdot10k
    • Removedgugik_download_lidar
    • Removedgugik_download_nmt_tiles
    • Removedgugik_kieg_wms
    • Removedgugik_kiub
    • Removedgugik_nmpt
    • Removedgugik_nmt_wms
    • Removedgugik_ortofoto
    • Removedgugik_osnowa
    • Removedgugik_prg_boundaries
    • Removedgugik_skorowidze
    • Removedkodpocztowy_lookup
    • Removedlabels_configure
    • Removedlabels_disable
    • Removedlabels_enable
    • Removedlayer_duplicate
    • Removedlayer_info
    • Removedlayer_join
    • Removedlayer_remove
    • Removedlayer_rename
    • Removedlayer_reorder
    • Removedlayer_set_crs
    • Removedlayer_set_filter_teryt
    • Removedlayer_set_opacity
    • Removedlayer_set_scale_visibility
    • Removedlayer_set_subset_filter
    • Removedlayer_set_visibility
    • Removedmap_get_extent
    • Removedmap_get_scale
    • Removedmap_identify_at_point
    • Removedmap_pan_to
    • Removedmap_refresh
    • Removedmap_rotate
    • Removedmap_set_background
    • Removedmap_zoom_full
    • Removedmap_zoom_scale
    • Removedmap_zoom_to_extent
    • Removedmap_zoom_to_layer
    • Removedmap_zoom_to_selection
    • Addedmerge_layers
    • Removednetwork_service_area
    • Removednetwork_shortest_path_layer
    • Removedosm_download_by_tag
    • Removedosm_download_roads_pl
    • Removedosm_overpass_query
    • Removedows_list_capabilities
    • Removedprng_search
    • Removedproject_info
    • Removedproject_list_layers
    • Removedproject_new
    • Removedproject_open
    • Removedproject_save
    • Removedproject_set_crs
    • Removedproject_set_metadata
    • Removedproject_snapshot
    • Removedqgis_algorithm_help
    • Removedqgis_list_algorithms
    • Removedqgis_ping
    • Removedqgis_run_algorithm
    • Addedreproject_layer
    • Removedroute_isochrone
    • Removedroute_matrix
    • Removedroute_optimize_tsp
    • Removedroute_osrm
    • Removedroute_valhalla
    • Addedselect_features_by_expression
    • Removedstyle_copy_between_layers
    • Removedstyle_load_qml
    • Removedstyle_save_qml
    • Removedstyle_set_blend_mode
    • Removedstyle_set_categorized
    • Removedstyle_set_cluster
    • Removedstyle_set_graduated
    • Removedstyle_set_heatmap
    • Removedstyle_set_raster_renderer
    • Removedstyle_set_rule_based
    • Removedstyle_set_single_symbol
    • Removedteryt_lookup
    • Removedteryt_to_geometry
    • Removeduldk_by_parcel_id
    • Removeduldk_by_point
    • Removeduldk_get_region
    • Removedwcs_add_layer
    • Removedwfs_add_layer
    • Removedwms_add_layer
    • Removedwms_get_feature_info
    • Removedwmts_add_layer
    • Removedxyz_add_layer
  2. 115 tool updatesv0.1.2
    • First observedattributes_add_field
    • First observedattributes_calculate
    • First observedattributes_delete_field
    • First observedattributes_list_fields
    • First observedattributes_rename_field
    • First observedattributes_statistics
    • First observedattributes_unique_values
    • First observedattributes_update_feature
    • First observedcrs_assign_by_guess
    • First observedcrs_detect_zone_2000
    • First observedcrs_height_transform
    • First observedcrs_list_polish
    • First observedcrs_transform_point
    • First observedemuia_search
    • First observedfeatures_clear_selection
    • First observedfeatures_count
    • First observedfeatures_get
    • First observedfeatures_get_selected
    • First observedfeatures_select_by_expression
    • First observedfeatures_select_by_location
    • First observedfeatures_select_by_rectangle
    • First observedgeocode_batch_csv
    • First observedgeocode_gugik_prg
    • First observedgeocode_nominatim
    • First observedgeocode_photon
    • First observedgeocode_reverse
    • First observedgeoportal_add_service
    • First observedget_layer_sample
    • First observedget_layer_schema
    • First observedgugik_bdoo
    • First observedgugik_bdot10k
    • First observedgugik_download_lidar
    • First observedgugik_download_nmt_tiles
    • First observedgugik_kieg_wms
    • First observedgugik_kiub
    • First observedgugik_nmpt
    • First observedgugik_nmt_wms
    • First observedgugik_ortofoto
    • First observedgugik_osnowa
    • First observedgugik_prg_boundaries
    • First observedgugik_skorowidze
    • First observedkodpocztowy_lookup
    • First observedlabels_configure
    • First observedlabels_disable
    • First observedlabels_enable
    • First observedlayer_duplicate
    • First observedlayer_info
    • First observedlayer_join
    • First observedlayer_remove
    • First observedlayer_rename
    • First observedlayer_reorder
    • First observedlayer_set_crs
    • First observedlayer_set_filter_teryt
    • First observedlayer_set_opacity
    • First observedlayer_set_scale_visibility
    • First observedlayer_set_subset_filter
    • First observedlayer_set_visibility
    • First observedmap_get_extent
    • First observedmap_get_scale
    • First observedmap_identify_at_point
    • First observedmap_pan_to
    • First observedmap_refresh
    • First observedmap_rotate
    • First observedmap_set_background
    • First observedmap_zoom_full
    • First observedmap_zoom_scale
    • First observedmap_zoom_to_extent
    • First observedmap_zoom_to_layer
    • First observedmap_zoom_to_selection
    • First observednetwork_service_area
    • First observednetwork_shortest_path_layer
    • First observedosm_download_by_tag
    • First observedosm_download_roads_pl
    • First observedosm_overpass_query
    • First observedows_list_capabilities
    • First observedprng_search
    • First observedproject_info
    • First observedproject_list_layers
    • First observedproject_new
    • First observedproject_open
    • First observedproject_save
    • First observedproject_set_crs
    • First observedproject_set_metadata
    • First observedproject_snapshot
    • First observedqgis_algorithm_help
    • First observedqgis_list_algorithms
    • First observedqgis_ping
    • First observedqgis_run_algorithm
    • First observedroute_isochrone
    • First observedroute_matrix
    • First observedroute_optimize_tsp
    • First observedroute_osrm
    • First observedroute_valhalla
    • First observedstyle_copy_between_layers
    • First observedstyle_load_qml
    • First observedstyle_save_qml
    • First observedstyle_set_blend_mode
    • First observedstyle_set_categorized
    • First observedstyle_set_cluster
    • First observedstyle_set_graduated
    • First observedstyle_set_heatmap
    • First observedstyle_set_raster_renderer
    • First observedstyle_set_rule_based
    • First observedstyle_set_single_symbol
    • First observedteryt_lookup
    • First observedteryt_to_geometry
    • First observeduldk_by_parcel_id
    • First observeduldk_by_point
    • First observeduldk_get_region
    • First observedwcs_add_layer
    • First observedwfs_add_layer
    • First observedwms_add_layer
    • First observedwms_get_feature_info
    • First observedwmts_add_layer
    • First observedxyz_add_layer

TDQS

A3.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: summary, filtering, selection, extent retrieval, reprojection, clipping, merging, statistics, field addition, and export. No two tools overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case, e.g., get_layer_summary, filter_layer_by_expression, reproject_layer. No mixing of conventions.

Tool Count5/5

10 tools is well-scoped for a GIS MCP server covering common operations: information, filtering, selection, manipulation, and export. Not too few or too many.

Completeness3/5

Covers core data manipulation but lacks a tool to list available layers, which is a notable gap. Missing delete field/update field operations, but add and export are present.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    F
    maintenance
    Connects Claude AI to QGIS through the Model Context Protocol, allowing Claude to directly interact with and control QGIS for tasks like project creation, layer manipulation, and code execution.
    15
    1,074
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Connects QGIS to Claude AI through the Model Context Protocol, enabling AI-assisted project creation, layer manipulation, processing algorithm execution, and Python code running within QGIS.
    7
    -
  • 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
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Connects OpenAI Codex Desktop to QGIS Desktop for natural language GIS operations, including project management, layer manipulation, and algorithm execution.
    4
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/piatkowski/qgis-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server