Servidor MCP headless para QGIS (PyQGIS standalone)
Server has 20 tools with mostly complete schemas and descriptions in Spanish. Naming follows verb_noun pattern (load_project, save_project, list_layers). Descriptions average ~80 chars, meeting baseline minimums. However, critical gaps exist: (1) No output schemas documented for any tool, LLMs cannot predict return structure; (2) Parameter descriptions are minimal (often 1-2 words); (3) No error handling guidance, tools return {ok: bool, error: str} but don't guide recovery; (4) execute_pyqgis is an unguarded escape hatch with IRREVERSIBLE risk; (5) Missing enum constraints on classification_type, orientation, field_type despite fixed valid values. Tools like calculate_field and get_attribute_table show good internal validation but don't expose it in descriptions. Per-tool average: 62/100.
Carga un ráster al proyecto.
Carga un vector (shapefile, GeoPackage, etc.) al proyecto.
Equivalente a la calculadora de campos. field_type: int/double/string/bool.
Crea una lámina de impresión lista para exportar: mapa con las capas indicadas, título, leyenda, escala gráfica y grilla de coordenadas opcional. Sin 'layer_ids' usa todas las capas del proyecto; sin 'extent' usa el fijado con set_extent() o la extensión de las capas.
Corre código PyQGIS arbitrario. Usar solo cuando ninguna tool estructurada cubre la necesidad. Variables disponibles: project, qgs_app, qgis_core, qt_core, processing. Deja el resultado en una variable llamada 'result'.
Exporta un layout existente a PDF.
No output schemas documented for any of 20 tools. LLMs cannot predict return structure, forcing them to guess field names and types for downstream tool chaining. Pattern:response-shaper requires documented output schemas.
execute_pyqgis is an unguarded escape hatch accepting arbitrary Python code with IRREVERSIBLE risk. No confirmation step, no dry-run, no sandboxing. Violates pattern:confirmation-request for destructive operations.
Parameter descriptions are minimal (1-3 words). E.g., 'Ruta al archivo de proyecto' for load_project.path lacks format guidance, encoding hints, or error recovery. Pattern:tool-description requires 10-1024 chars with actionable context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Renderiza capas específicas (o todo el proyecto) a un PNG en 'path'.
Parámetros esperados de un algoritmo (tipos, opcionalidad, default). Llamar antes de usar un algoritmo que no se haya usado ya en la sesión.
Lee datos de la tabla de atributos. Indispensable para verificar resultados.
Esquema de campos, CRS, extensión y proveedor de una capa (id o nombre).
Busca el id exacto de un algoritmo de Processing por palabra clave.
Lista id, nombre, tipo, CRS y conteo de objetos de cada capa cargada.
Abre un proyecto .qgz/.qgs existente.
Versión de QGIS y confirmación de que el backend responde.
Quita una capa del proyecto (id o nombre).
Ejecuta cualquier algoritmo nativo/GDAL/SAGA/GRASS de Processing. Los valores de 'parameters' que coincidan con un layer_id o nombre de capa cargada se resuelven automáticamente a la capa real.
Guarda el proyecto actual (mismo path si se omite).
Define un extent explícito [xmin, ymin, xmax, ymax] en el CRS indicado.
Aplica un QML, o una simbología simple (categorized/graduated) por campo.
Devuelve el extent de una capa (headless: úsalo como extent explícito para export_map_image, no hay lienzo interactivo real).
Fixed-value parameters lack enum constraints. E.g., set_layer_style.classification_type accepts 'categorized|graduated' but is defined as free-form string. calculate_field.field_type accepts 'int|double|string|bool' but no enum. Invites hallucinated values.
Error responses provide no recovery guidance. Tools return {ok: false, error: str} but descriptions don't explain what the LLM should do next (retry, lookup, ask user). Pattern:recovery-guide requires actionable error classification.