QGIS MCP
Allows automating QGIS through a plugin or headless QGIS Python process, providing tools to run PyQGIS code, list and inspect layers, add or remove layers, export maps, manage projects, and execute Processing algorithms such as native:buffer.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@QGIS MCPadd C:/data/roads.shp to the map and export it as a PNG"
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 — GIS GEORGIA
KA · English below
ქართულად
Claude Code (ან სხვა MCP კლიენტი) მართავს QGIS-ს ავტომატურად. პროექტი ორი ნაწილისგან შედგება:
QGIS ფლაგინი (
plugin/qgis_mcp_ge) — პატარა GUI პანელი ღილაკებით. QGIS-ის შიგნით უშვებს ლოკალურ სერვისს, რომელიც ასრულებს ბრძანებებს ღია სესიაში.MCP სერვერი (
src/qgis_mcp_ge_server) — Claude Code-ს აკავშირებს ფლაგინთან (GUI რეჟიმი) ან მუშაობს headless რეჟიმში (GUI-ს გარეშე, ცალკე QGIS Python პროცესით).
Claude Code ──stdio──> MCP სერვერი ──TCP 127.0.0.1 + ტოკენი──> QGIS ფლაგინი (GUI)
└────────── subprocess ──────────> QGIS Python (headless)ინსტრუმენტები (ეტაპი 1)
ინსტრუმენტი | რას აკეთებს |
| კავშირის შემოწმება, QGIS-ის ვერსია |
| PyQGIS კოდის შესრულება ( |
| ფენების სია / ფენის დეტალები (ველები, ობიექტების რაოდენობა) |
| ფენის დამატება / წაშლა |
| რუკის ექსპორტი სურათად |
| პროექტის ინფო, შენახვა, ჩატვირთვა |
| იგივე ბრძანებები GUI-ს გარეშე ( |
| Processing ალგორითმები ( |
უსაფრთხოება
სერვისი უსმენს მხოლოდ
127.0.0.1-ს; გარედან მიუწვდომელია.ყოველი მოთხოვნა საჭიროებს ტოკენს (პანელში გენერირდება, შედარება მუდმივ დროში). ტოკენი იწერება
~/.qgis-mcp-ge/session.json-ში, რომ MCP სერვერმა თავად იპოვოს.run_pyqgisთვითნებური კოდის შესრულებაა — პანელში გამოსართავი ჩექბოქსია. გამოიყენე მხოლოდ სანდო კლიენტთან.
ინსტალაცია
დააკოპირე
plugin/qgis_mcp_geQGIS-ის ფლაგინების საქაღალდეში (ან გაუშვიpython scripts/install_plugin.py) და ჩართე Plugins → Manage ში. QGIS 3.28+ და QGIS 4 მხარდაჭერილია.QGIS-ში გახსენი პანელი QGIS MCP, ენა აირჩიე (ქართული/English), დააჭირე გაშვება.
დააჭირე Claude Code ბრძანების კოპირება და გაუშვი ტერმინალში, ან ხელით:
claude mcp add qgis -- uvx --from git+https://github.com/GIS-GEORGIA/qgis-mcp qgis-mcp-geHeadless რეჟიმისთვის ფლაგინი არ არის საჭირო; თუ QGIS ავტომატურად ვერ მოიძებნა, დააყენე
QGIS_PYTHON(მაგ.C:\Program Files\QGIS 3.44.5\bin\python-qgis.bat) დაQGIS_PROCESS.
განვითარება და ტესტები
# Windows (PowerShell)
& "C:\Program Files\QGIS 3.44.5\bin\python-qgis.bat" tests\smoke_bridge.pyRelated MCP server: QGIS 4 MCP Server
English
Let Claude Code (or any MCP client) drive QGIS. Two parts:
QGIS plugin (
plugin/qgis_mcp_ge) — a small button-driven dock panel that runs a local service inside QGIS and executes commands in the open session.MCP server (
src/qgis_mcp_ge_server) — connects Claude Code to the plugin (GUI mode), or runs headless (no GUI, separate QGIS Python process).
Tools (stage 1)
qgis_status, run_pyqgis, list_layers, layer_info, add_layer, remove_layer, export_map, project_info, save_project, load_project, plus headless: headless_command, headless_algorithm, headless_list_algorithms.
Security
Listens on
127.0.0.1only.Every request needs a token (generated in the panel, constant-time comparison); it is written to
~/.qgis-mcp-ge/session.jsonso the MCP server can find it.run_pyqgisexecutes arbitrary code by design; it can be disabled with a checkbox in the panel. Only use it with clients you trust.
Install
Copy
plugin/qgis_mcp_geinto your QGIS plugins folder (or runpython scripts/install_plugin.py) and enable it. QGIS 3.28+ and QGIS 4 supported.Open the QGIS MCP panel, pick your language, press Start.
Register the MCP server:
claude mcp add qgis -- uvx --from git+https://github.com/GIS-GEORGIA/qgis-mcp qgis-mcp-geHeadless mode does not need the plugin; set
QGIS_PYTHON/QGIS_PROCESSif auto-detection fails.
Roadmap
Async long-running jobs, layer styling helpers, print layouts, recipes — inspired by ideas in QgisRemoteMCP, jjsantos01/qgis_mcp and nkarasiak/qgis-mcp. This codebase is written from scratch.
License
MIT — see LICENSE.
Available Tools
13 toolsadd_layerC
Add a layer from a file/URI. type: 'vector' or 'raster'. provider defaults to ogr/gdal. / ფენის დამატება.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| path | Yes | ||
| type | No | vector | |
| provider | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the type values and the provider fallback, but says nothing about duplicate-layer handling, permissions, whether the layer is registered in the current project, or failure behavior for an unreadable path.
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?
Short and front-loaded, but the trailing Georgian translation ('/ ფენის დამატება') is pure duplication that earns no space and adds no semantics.
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?
A 4-parameter mutation tool with no annotations, no output schema, and 0% schema coverage should do considerably more. Nothing tells the agent what state changes or what the return looks like after adding a layer.
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% across 4 params, so the description must compensate. It does add value by enumerating type values ('vector'/'raster') that are absent from the schema and by stating the ogr/gdal provider fallback, but leaves 'name' and 'path' completely bare.
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?
States a specific verb and resource ('Add a layer from a file/URI'), which clearly separates it from siblings like remove_layer and list_layers. It does not explicitly name any sibling, but the action is unambiguous.
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 when-to-use guidance, no prerequisites, and no mention of alternatives (e.g. load_project or headless_command for loading data). Usage must be inferred purely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_mapB
Render the map to an image (png/jpg). extent=[xmin,ymin,xmax,ymax] in project CRS; default = canvas. / რუკის ექსპორტი.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| width | No | ||
| extent | No | ||
| height | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it does disclose real behavior: supported formats (png/jpg) and that extent is interpreted in project CRS with a canvas default. It omits whether the file is overwritten, whether the project must be loaded/GUI open, and what the tool returns.
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?
Front-loaded and short, with the key constraint (extent format) placed after the primary purpose. However, the trailing Georgian translation ' / რუკის ექსპორტი.' merely restates the purpose and earns no place for an agent consuming the definition.
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 4-parameter file-writing tool with no annotations and no output schema, the description covers purpose and extent semantics but is silent on the write side effects (file creation/overwrite at path) and on the return value, leaving gaps an agent would have to discover empirically.
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 does explain the one non-obvious parameter well ('extent=[xmin,ymin,xmax,ymax] in project CRS; default = canvas'), which adds real meaning beyond the bare anyOf array, but path, width and height remain entirely unexplained (path format/location especially).
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?
States a specific verb and resource: 'Render the map to an image (png/jpg)'. No sibling tool performs map exporting (run_pyqgis and headless_command are generic execution paths), so the agent can identify it without ambiguity.
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 notes that extent defaults to the canvas, which is a useful behavioral default, but it gives no when-to-use guidance and never contrasts itself with the generic run_pyqgis or headless_command siblings that could also produce output files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
headless_algorithmC
Run a QGIS Processing algorithm (e.g. 'native:buffer') headlessly with a parameters dict. / Processing ალგორითმი.
| Name | Required | Description | Default |
|---|---|---|---|
| algorithm | Yes | ||
| parameters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says 'headlessly' but discloses nothing about execution duration, whether the algorithm runs on the current project state, error behavior for invalid algorithm IDs, or what is returned when an output schema is absent.
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 English sentence is tight and front-loaded, but the trailing Georgian fragment 'Processing ალგორითმი' adds no information and appears to be a truncated duplicate, diluting an otherwise efficient description.
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 whose core input is an arbitrary parameters dict and which has no output schema or annotations, the description is not complete enough: an agent gets no guidance on constructing the dict or on interpreting results.
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% across both parameters. The description compensates only for 'algorithm' by giving the example 'native:buffer'; the 'parameters' dict is a free-form nested object with additionalProperties=true and receives no explanation of expected keys or value formats.
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?
States a specific verb and resource: run a QGIS Processing algorithm headlessly, with a concrete example ('native:buffer'). However it does not distinguish itself from the sibling headless_command or headless_list_algorithms, which an agent must choose between.
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 statement of when to use this versus headless_command (which presumably runs arbitrary code/commands) or headless_list_algorithms (to discover algorithm IDs). No prerequisites or context given; usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
headless_commandB
Run any command (list_layers, layer_info, add_layer, export_map, run_pyqgis, ...) WITHOUT the QGIS GUI.
Pass project to load a .qgz first; save=True writes changes back. / ბრძანება GUI-ს გარეშე.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| params | No | ||
| command | Yes | ||
| project | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose two real behavioral traits: passing `project` loads a .qgz first, and save=True writes changes back to disk (an implicit mutation/persistence signal). It says nothing about error behavior, permissions, or that arbitrary commands may be destructive, so the disclosure is partial for a no-annotation 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?
The core is two tight, front-loaded sentences leading with the capability and the persistence semantics. The trailing Georgian sentence duplicates 'without the GUI' and adds no information for most agents, but the overall size is small and the important content comes first.
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 dispatcher with a free-form `params` object, no typed enum, and no output schema, the agent is left guessing the shape of `params` for each command and what is returned. The description aids discovery with an (open-ended '...') example list and covers persistence, but does not say how to enumerate the full command set or where per-command parameter shapes are documented.
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% for 4 parameters, so the description must compensate. It explains `project` (loads a .qgz first) and `save` (writes changes back), and implicitly defines `command` via the example list, but `params` — the argument dict passed to the chosen sub-command — is entirely undocumented, which is the most consequential gap for correct invocation.
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?
States a specific verb+resource ('run any command ... WITHOUT the QGIS GUI') and names concrete example commands (list_layers, layer_info, add_layer, export_map, run_pyqgis) that double as pointers to sibling tools, so an agent can see this is a GUI-less dispatcher. It stops short of explicitly framing the relationship to those siblings as alternatives, which keeps it from a 5.
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 'WITHOUT the QGIS GUI' phrasing implies the usage context (no GUI session available), and 'Pass `project` to load a .qgz first' gives a concrete prerequisite. However there is no explicit guidance on when to prefer headless_command over the sibling list_layers/add_layer/etc., or over headless_algorithm and headless_list_algorithms, which is the main routing decision an agent faces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
headless_list_algorithmsC
List Processing algorithms via qgis_process, optionally filtered by text. / ალგორითმების სია.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the whole burden. 'List' implies a read-only operation, but nothing is said about output size, pagination, whether the catalog is cached, or what happens with a limit of 100 by default.
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 English sentence is short and front-loaded, but the appended Georgian translation 'ალგორითმების სია' is pure duplication that adds no information for an agent selecting the tool.
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 catalog-listing tool with no annotations, no output schema, and 0% parameter coverage, the description should at minimum explain pagination/limit behavior and the shape of results; it does neither.
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 'filter' as a text filter but says nothing about 'limit', its default of 100, or how the two interact, leaving half the parameters undocumented.
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?
States a specific verb and resource ('List Processing algorithms via qgis_process'), which is clearly distinguishable from the sibling headless_algorithm that runs a single algorithm. It does not explicitly name that sibling, so it falls short of a 5.
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?
Only 'optionally filtered by text' hints at usage; there is no guidance on when to choose this over headless_algorithm, headless_command, or qgis_status, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layer_infoB
Details of one layer by id or name: fields, feature count, geometry, raster size. / ფენის ინფო.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the substance of the result (fields, feature count, geometry, raster size), which is meaningful since there is no output schema, but it never states that the operation is a read-only lookup or what happens if the id/name is not found.
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?
One front-loaded sentence that names the resource, the identifier options, and the returned fields with no filler. The appended Georgian translation is redundant for the primary audience but costs little.
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 low-complexity, single-parameter read tool with no output schema, the description covers the essentials, including the shape of the returned data. Only the read-only nature and error behavior are left unstated.
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% for the single 'layer' parameter, so the description must compensate. It does add useful meaning by stating the parameter accepts either an id or a name, but gives no format expectations, case sensitivity, or failure behavior for unmatched values.
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?
States a specific resource and what is retrieved: details of one layer identified by id or name, including fields, feature count, geometry and raster size. The singular 'one layer' implicitly distinguishes it from the sibling list_layers, though that distinction is not made explicit.
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 versus list_layers, project_info, or qgis_status. It does not state prerequisites (e.g. that a project/layer must be loaded) or when this tool is the wrong choice; the agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_layersB
List layers of the open project (id, name, type, crs, extent, visibility). / ფენების სია.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'List' implies a non-mutating read and the parenthetical discloses exactly which attributes come back, which is genuinely useful given there is no output schema. It says nothing about scoping limits (all layers vs. visible only) or result size, leaving gaps.
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 English sentence is short, front-loaded, and wastes nothing. The appended Georgian translation is redundant for an agent and slightly dilutes the density, which keeps it off a 5.
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?
With no output schema and no annotations, the description compensates by naming the returned fields and the implicit scope (the open project). It is complete enough to call correctly, though the absence of any relationship to layer_info or add_layer/remove_layer leaves the layer-tool cluster under-described.
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 tool takes zero parameters, so the baseline of 4 applies. The description correctly signals there is nothing to configure by scoping the call to 'the open project'.
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?
States a specific verb and resource ('List layers of the open project') and enumerates the returned fields, so an agent immediately knows what it gets. It does not distinguish itself from the close sibling layer_info, which also concerns layers, so it stops short of a 5.
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?
There is no when-to-use guidance, no statement of when not to use it, and no pointer to alternatives such as layer_info for per-layer detail. The agent must infer from the name alone that this is the bulk-enumeration option.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_projectC
Open a .qgz/.qgs project. / პროექტის ჩატვირთვა.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It reveals the accepted file formats (.qgz/.qgs) but says nothing about what loading does to the currently open project, error behavior for a missing/invalid path, or any permission requirements.
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?
Very short and front-loaded with the action and accepted formats. The bilingual duplication of the same sentence adds a redundant line, though it is a localization choice rather than padding.
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 state-mutating tool with no annotations, no output schema, and an undescribed required parameter, the definition is thin. It omits the side effects of loading a project and error handling, which an agent would need to call this safely.
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% for the single 'path' parameter, but the description partially compensates by implying the path points to a .qgz/.qgs project file. It adds format meaning but no syntax, absolute-vs-relative, or path-resolution details.
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?
States a specific verb (Open) and resource (.qgz/.qgs project), which is unambiguous and distinguishable from save_project and project_info by the verb alone. It does not explicitly name or contrast with any sibling, but the action is clear.
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 versus alternatives such as project_info or save_project, and no prerequisites stated. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_infoB
Current project file, title, CRS, layer count. / პროექტის ინფო.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose the return content (file, title, CRS, layer count), which is the primary behavioral trait for a parameterless read. It does not explicitly state that it is read-only, side-effect free, or requires a loaded project, leaving minor gaps.
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?
A single front-loaded sentence covering the resource and its return fields. The appended Georgian translation is redundant for most agents and slightly dilutes the signal, but the entry remains very short.
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?
No output schema, so the description's enumeration of returned fields is exactly the compensation needed, and no annotations or params exist to leave undocumented. Only the silence on prerequisites (a loaded project) and sibling boundaries keeps it from being 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?
Zero parameters, so there is nothing to document; baseline 4 applies. The description correctly adds no parameter noise.
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?
States a specific resource (the current project) and enumerates the returned fields: file, title, CRS, layer count. An agent immediately knows this is a read of project-level metadata. It does not, however, distinguish itself from siblings like qgis_status or layer_info, which could confuse selection.
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 when-to-use guidance at all: the description never says to call this before export/save, nor distinguishes it from qgis_status (overall app status) or layer_info (single-layer metadata). The agent must infer the boundary from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qgis_statusB
Check the connection to the QGIS plugin, return QGIS version and project. / კავშირის შემოწმება.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It does disclose the response content (version and project) and implies a non-mutating connectivity probe, but it says nothing about failure behavior when the plugin is unreachable, authentication needs, or any side effects.
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 English sentence is front-loaded and wastes no words. The duplicated Georgian line adds no information for most agents, but it is short and does not bury the core statement.
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 zero-parameter status tool with no output schema, the description adequately states what is returned. It is incomplete about the not-connected case and about how its result relates to sibling tools, leaving the agent to infer error-handling behavior.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter confusion is possible.
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 names a specific verb and resource ('Check the connection to the QGIS plugin') plus what it returns (QGIS version and project), so the purpose is unambiguous. It does not, however, distinguish itself from the sibling project_info, which plausibly overlaps with the 'return project' portion.
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?
There is no statement of when to call this versus alternatives such as project_info, nor a prerequisite like 'call before run_pyqgis to confirm connectivity'. A health-check tool's usage is somewhat self-evident, but the description provides no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_layerC
Remove a layer by id or name. / ფენის წაშლა პროექტიდან.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full behavioral burden. It implies destruction but says nothing about irreversibility, whether unsaved edits are discarded, what happens if the id/name matches nothing, or whether save_project is needed afterward.
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?
Short and front-loaded with the action first, which is good. However, the Georgian sentence restates the same content verbatim with slight added meaning ("from the project"), making it duplicative rather than additive for most readers.
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 destructive, un-annotated tool with no output schema, the description omits failure behavior, side effects on dependent layers, and required follow-up steps. Only the identifier forms are covered.
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 single parameter has 0% schema description coverage, so the description must compensate. It does add the useful fact that the identifier may be an id or a name, but gives no format, exact-match, or case-sensitivity guidance for either form.
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?
States a specific verb and resource ("Remove a layer") and identifies the accepted identifier forms. It is implicitly distinguishable from siblings like add_layer and list_layers, though it never names a sibling or the scope (project-level removal is only in the Georgian line).
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 versus list_layers/layer_info to resolve a layer first, nor any note about when removal is inappropriate. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_pyqgisB
Execute PyQGIS code inside the running QGIS session. Variables: iface, project, QgsProject, qgis.
Print output is returned; assign to result to return a value. / PyQGIS კოდის შესრულება QGIS-ში.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It usefully discloses the execution output contract (print output returned, assign to `result`) and the injected variables (iface, project, QgsProject, qgis), but says nothing about the fact that arbitrary code runs unsandboxed with write access to the live session and project data.
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 tight sentences with the essential scope statement front-loaded. The appended Georgian translation duplicates the same content without adding meaning, which is the only wasted space.
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 one-param arbitrary-code-execution tool with no annotations and no output schema, the description covers the variable environment and return mechanism but leaves out side-effect and safety context. Adequate but with a clear gap given the tool's risk profile.
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 single `code` parameter is undocumented in the schema. The description partially compensates by explaining which variables are in scope and how to return a value, which genuinely clarifies what to put in `code`, but omits format or length constraints.
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?
States a specific verb and resource — execute PyQGIS code — and scopes it to 'the running QGIS session', which implicitly separates it from the headless_command and headless_algorithm siblings. It stops short of naming those alternatives, so the differentiation is inferred rather than stated.
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 when-to-use guidance is given. With siblings like headless_command and headless_algorithm in the toolset, the agent gets no signal for choosing live-session execution over a headless path, nor any prerequisites (e.g. project must be open).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_projectB
Save the project (to path if given, else its current file). / პროექტის შენახვა.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses the default target (current project file if path is omitted), but omits whether saving overwrites, required permissions, error handling, and other mutation side effects.
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 short sentences, front-loaded with purpose and fallback behavior. The bilingual translation is compact and does not dilute the core instruction.
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 a simple one-parameter mutation tool with no annotations or output schema, the description covers purpose and default target. However, it omits when to use it over siblings and what side effects or return behavior to expect, leaving it only minimally self-contained.
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?
One optional parameter with 0% schema description coverage. The description explains that path is optional and falls back to the current file, adding meaning beyond the empty-string default, but it does not specify path format, relative vs. absolute, or validation.
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?
States a specific verb 'Save' and resource 'the project', with scope clarified as saving to a given path or the current file. This distinguishes it from siblings like load_project and project_info without needing to name them.
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 such as load_project, project_info, or export_map. It implies saving after changes but does not state prerequisites, exclusions, or contexts for selection.
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.
13 tool updates
v0.1.0- First observed
add_layer - First observed
export_map - First observed
headless_algorithm - First observed
headless_command - First observed
headless_list_algorithms - First observed
layer_info - First observed
list_layers - First observed
load_project - First observed
project_info - First observed
qgis_status - First observed
remove_layer - First observed
run_pyqgis - First observed
save_project
TDQS
Scored across 13 tools
Several capabilities are duplicated across GUI and headless modes: headless_command can invoke list_layers, layer_info, add_layer, export_map, and run_pyqgis, so an agent must decide between equivalent entry points. qgis_status and project_info also overlap in project details. The descriptions do explain GUI vs. headless context, but the boundaries remain somewhat loose.
Most names use snake_case, and the headless_* family is consistent. However the set mixes verb_noun (list_layers, add_layer, export_map) with noun_phrase (qgis_status, layer_info, project_info) and a proper-noun verb (run_pyqgis), so the pattern is readable but not uniform.
13 tools is reasonable for a QGIS bridge covering project, layer, export, scripting, and headless-processing workflows. The only redundancy is the meta headless_command, but it does not push the count into bloat.
Core workflows are covered: project load/save/info/status, layer add/remove/list/info, map export, PyQGIS, and headless Processing algorithms. Explicit layer update, project creation, and styling operations are absent, but run_pyqgis/headless_command provide escape hatches for many gaps.
Maintenance
Related MCP Connectors
QuLab MCP remote server (Streamable HTTP) for computational science and lab tools.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Create and manage trading strategies, bots, webhooks and signals from any MCP client.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseCqualityAmaintenanceAn MCP server that enables AI assistants to directly control QGIS for tasks like layer management, feature editing, and map rendering. It provides a suite of 50 tools to execute processing algorithms and manage GIS projects through natural language commands.125359GPL 2.0
- AlicenseNot gradedqualityCmaintenanceConnects AI assistants (Claude, Cursor, etc.) to QGIS 4.x via MCP, enabling natural language-driven GIS workflows through 37+ tools, including data loading, processing, and spatial analysis.GPL 2.0
- FlicenseBqualityBmaintenanceEnables interaction with QGIS (Quantum GIS) through an MCP plugin and server, allowing natural language commands to control QGIS.100-
- FlicenseNot gradedqualityBmaintenanceLets MCP clients inspect and manipulate the project open in the desktop application, including layers, geoprocessing, styles, and map/layout exports, all through tools that run inside the live QGIS session.-