QGIS MCP
This server provides tools to inspect, analyze, and transform geospatial layers in an open QGIS project, all locally without data leaving your machine. Supported operations include:
Summarize layers: Get feature count, geometry type, CRS, extent, and field details with sample values for both vector and raster layers.
Filter layers: Apply a QGIS expression as a subset filter; pass an empty string to clear.
Select features: Select features by expression with replace, add, intersect, or remove modes.
Get extent: Retrieve layer extent as bounding box and WKT polygon.
Reproject layers: Change CRS and save result as a new layer with validation.
Clip layers: Clip to another layer's extent or a custom bounding box, creating a new layer.
Merge layers: Combine multiple vector layers of the same geometry type, with field conflict reporting.
Field statistics: Compute min, max, mean, sum, and distinct value count for numeric fields, with a preview of distinct values.
Add computed fields: Add a new field and populate it using a QGIS expression in one step.
Export layers: Export to GeoJSON, Shapefile, GPKG, or CSV with automatic format detection; CSV exports include WKT geometry.
Provides tools to interact with a live QGIS project, including layer management, styling, labeling, selections, running Processing algorithms, querying and editing attributes, geocoding, and executing PyQGIS code.
Click on "Install 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 MCPshow me the layers in my project"
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.
QGIS MCP [PL]
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 fromserver/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).
Download the latest
qgis_mcp-<version>.zipfrom the Releases page.In QGIS, open Plugins → Manage and Install Plugins…
Go to the Install from ZIP tab.
Select the downloaded
.zipfile and click Install Plugin.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 syncThis 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.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.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
mcpServersentry inclaude_desktop_config.jsonuses an absolute path to.venv/bin/python(or.venv\Scripts\python.exeon 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 at127.0.0.1:9876in 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_PORTenvironment variables independently. Set both consistently — for the server, in theenvsection of itsmcpServersconfig entry; for the plugin, in the environment QGIS itself is launched with.The plugin refuses to bind to a non-
127.0.0.1address. 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 zserver/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).
Pobierz najnowszy plik
qgis_mcp-<wersja>.zipze strony Releases.W QGIS otwórz Wtyczki → Zarządzaj i instaluj wtyczki…
Przejdź do zakładki Zainstaluj z ZIP.
Wybierz pobrany plik
.zipi kliknij Zainstaluj wtyczkę.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 syncTo 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.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.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
mcpServerswclaude_desktop_config.jsonużywa bezwzględnej ścieżki do.venv/bin/python(lub.venv\Scripts\python.exew 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 na127.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 sekcjienvjego wpisu wmcpServers, 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 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | No | double | |
| length | No | ||
| precision | No | ||
| expression | Yes | ||
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| crs | No | ||
| bbox | No | ||
| name | No | ||
| layer_name | Yes | ||
| reference_layer_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| format | No | ||
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | ||
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| field_name | Yes | ||
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| crs | No | ||
| name | No | ||
| layer_names | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| layer_name | Yes | ||
| target_crs | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | set | |
| expression | Yes | ||
| layer_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
125 tool updates
v0.1.3- Added
add_field_with_values - Removed
attributes_add_field - Removed
attributes_calculate - Removed
attributes_delete_field - Removed
attributes_list_fields - Removed
attributes_rename_field - Removed
attributes_statistics - Removed
attributes_unique_values - Removed
attributes_update_feature - Added
clip_layer_to_extent - Removed
crs_assign_by_guess - Removed
crs_detect_zone_2000 - Removed
crs_height_transform - Removed
crs_list_polish - Removed
crs_transform_point - Removed
emuia_search - Added
export_layer - Removed
features_clear_selection - Removed
features_count - Removed
features_get - Removed
features_get_selected - Removed
features_select_by_expression - Removed
features_select_by_location - Removed
features_select_by_rectangle - Added
filter_layer_by_expression - Removed
geocode_batch_csv - Removed
geocode_gugik_prg - Removed
geocode_nominatim - Removed
geocode_photon - Removed
geocode_reverse - Removed
geoportal_add_service - Added
get_field_statistics - Added
get_layer_extent_wkt - Removed
get_layer_sample - Removed
get_layer_schema - Added
get_layer_summary - Removed
gugik_bdoo - Removed
gugik_bdot10k - Removed
gugik_download_lidar - Removed
gugik_download_nmt_tiles - Removed
gugik_kieg_wms - Removed
gugik_kiub - Removed
gugik_nmpt - Removed
gugik_nmt_wms - Removed
gugik_ortofoto - Removed
gugik_osnowa - Removed
gugik_prg_boundaries - Removed
gugik_skorowidze - Removed
kodpocztowy_lookup - Removed
labels_configure - Removed
labels_disable - Removed
labels_enable - Removed
layer_duplicate - Removed
layer_info - Removed
layer_join - Removed
layer_remove - Removed
layer_rename - Removed
layer_reorder - Removed
layer_set_crs - Removed
layer_set_filter_teryt - Removed
layer_set_opacity - Removed
layer_set_scale_visibility - Removed
layer_set_subset_filter - Removed
layer_set_visibility - Removed
map_get_extent - Removed
map_get_scale - Removed
map_identify_at_point - Removed
map_pan_to - Removed
map_refresh - Removed
map_rotate - Removed
map_set_background - Removed
map_zoom_full - Removed
map_zoom_scale - Removed
map_zoom_to_extent - Removed
map_zoom_to_layer - Removed
map_zoom_to_selection - Added
merge_layers - Removed
network_service_area - Removed
network_shortest_path_layer - Removed
osm_download_by_tag - Removed
osm_download_roads_pl - Removed
osm_overpass_query - Removed
ows_list_capabilities - Removed
prng_search - Removed
project_info - Removed
project_list_layers - Removed
project_new - Removed
project_open - Removed
project_save - Removed
project_set_crs - Removed
project_set_metadata - Removed
project_snapshot - Removed
qgis_algorithm_help - Removed
qgis_list_algorithms - Removed
qgis_ping - Removed
qgis_run_algorithm - Added
reproject_layer - Removed
route_isochrone - Removed
route_matrix - Removed
route_optimize_tsp - Removed
route_osrm - Removed
route_valhalla - Added
select_features_by_expression - Removed
style_copy_between_layers - Removed
style_load_qml - Removed
style_save_qml - Removed
style_set_blend_mode - Removed
style_set_categorized - Removed
style_set_cluster - Removed
style_set_graduated - Removed
style_set_heatmap - Removed
style_set_raster_renderer - Removed
style_set_rule_based - Removed
style_set_single_symbol - Removed
teryt_lookup - Removed
teryt_to_geometry - Removed
uldk_by_parcel_id - Removed
uldk_by_point - Removed
uldk_get_region - Removed
wcs_add_layer - Removed
wfs_add_layer - Removed
wms_add_layer - Removed
wms_get_feature_info - Removed
wmts_add_layer - Removed
xyz_add_layer
115 tool updates
v0.1.2- First observed
attributes_add_field - First observed
attributes_calculate - First observed
attributes_delete_field - First observed
attributes_list_fields - First observed
attributes_rename_field - First observed
attributes_statistics - First observed
attributes_unique_values - First observed
attributes_update_feature - First observed
crs_assign_by_guess - First observed
crs_detect_zone_2000 - First observed
crs_height_transform - First observed
crs_list_polish - First observed
crs_transform_point - First observed
emuia_search - First observed
features_clear_selection - First observed
features_count - First observed
features_get - First observed
features_get_selected - First observed
features_select_by_expression - First observed
features_select_by_location - First observed
features_select_by_rectangle - First observed
geocode_batch_csv - First observed
geocode_gugik_prg - First observed
geocode_nominatim - First observed
geocode_photon - First observed
geocode_reverse - First observed
geoportal_add_service - First observed
get_layer_sample - First observed
get_layer_schema - First observed
gugik_bdoo - First observed
gugik_bdot10k - First observed
gugik_download_lidar - First observed
gugik_download_nmt_tiles - First observed
gugik_kieg_wms - First observed
gugik_kiub - First observed
gugik_nmpt - First observed
gugik_nmt_wms - First observed
gugik_ortofoto - First observed
gugik_osnowa - First observed
gugik_prg_boundaries - First observed
gugik_skorowidze - First observed
kodpocztowy_lookup - First observed
labels_configure - First observed
labels_disable - First observed
labels_enable - First observed
layer_duplicate - First observed
layer_info - First observed
layer_join - First observed
layer_remove - First observed
layer_rename - First observed
layer_reorder - First observed
layer_set_crs - First observed
layer_set_filter_teryt - First observed
layer_set_opacity - First observed
layer_set_scale_visibility - First observed
layer_set_subset_filter - First observed
layer_set_visibility - First observed
map_get_extent - First observed
map_get_scale - First observed
map_identify_at_point - First observed
map_pan_to - First observed
map_refresh - First observed
map_rotate - First observed
map_set_background - First observed
map_zoom_full - First observed
map_zoom_scale - First observed
map_zoom_to_extent - First observed
map_zoom_to_layer - First observed
map_zoom_to_selection - First observed
network_service_area - First observed
network_shortest_path_layer - First observed
osm_download_by_tag - First observed
osm_download_roads_pl - First observed
osm_overpass_query - First observed
ows_list_capabilities - First observed
prng_search - First observed
project_info - First observed
project_list_layers - First observed
project_new - First observed
project_open - First observed
project_save - First observed
project_set_crs - First observed
project_set_metadata - First observed
project_snapshot - First observed
qgis_algorithm_help - First observed
qgis_list_algorithms - First observed
qgis_ping - First observed
qgis_run_algorithm - First observed
route_isochrone - First observed
route_matrix - First observed
route_optimize_tsp - First observed
route_osrm - First observed
route_valhalla - First observed
style_copy_between_layers - First observed
style_load_qml - First observed
style_save_qml - First observed
style_set_blend_mode - First observed
style_set_categorized - First observed
style_set_cluster - First observed
style_set_graduated - First observed
style_set_heatmap - First observed
style_set_raster_renderer - First observed
style_set_rule_based - First observed
style_set_single_symbol - First observed
teryt_lookup - First observed
teryt_to_geometry - First observed
uldk_by_parcel_id - First observed
uldk_by_point - First observed
uldk_get_region - First observed
wcs_add_layer - First observed
wfs_add_layer - First observed
wms_add_layer - First observed
wms_get_feature_info - First observed
wmts_add_layer - First observed
xyz_add_layer
TDQS
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.
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.
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.
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
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
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
- AurentiaOAuthfr.aurentia
Your Aurentia workspace — projects, CRM, tasks, deliverables — in Claude, Cursor or any MCP client.
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Share context and questions between Claude instances — VS Code, claude.ai web, and mobile.
Related MCP Servers
- FlicenseBqualityFmaintenanceConnects 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.151,074-
- FlicenseNot gradedqualityDmaintenanceConnects 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-
- 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-
- FlicenseNot gradedqualityDmaintenanceConnects OpenAI Codex Desktop to QGIS Desktop for natural language GIS operations, including project management, layer manipulation, and algorithm execution.4-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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