Skip to main content
Glama

chiclana-avisos-mcp (GECOR Avisos MCP)

Servidor Model Context Protocol (MCP) para gestionar avisos e incidencias municipales en Chiclana de la Frontera (Cádiz) y cualquier municipio soportado por la plataforma GECOR.

Inspirado en el diseño y patrones de seguridad de madrid-avisos-mcp.

Permite que un agente de IA pueda:

  • Recibir una foto y dirección o referencia escrita, y extraer GPS EXIF cuando exista.

  • Elegir categorías oficiales GECOR y aclarar dudas antes de actuar.

  • Previsualizar un aviso sin enviarlo y registrarlo solo tras confirmación explícita del resumen exacto.

  • Consultar incidencias previamente registradas y su estado.


📦 Instalación

Requiere Node.js 20 o superior. El paquete se publica en npm como chiclana-avisos-mcp y se ejecuta con npx, sin clonar el repositorio.

1. Obtener el token de GECOR

Autentica con GECOR y obtén el token de la sesión (por ejemplo, desde localStorage en DevTools de gecorweb.com, clave user → campo token). El servidor únicamente acepta GECOR_TOKEN en el entorno de su propio proceso MCP. No guarda sesiones ni admite inicio de sesión con email y contraseña.

2. Configurar en tu cliente MCP

Claude Desktop

Añade a claude_desktop_config.json:

{
  "mcpServers": {
    "chiclana-avisos": {
      "command": "npx",
      "args": ["-y", "chiclana-avisos-mcp"],
      "env": {
        "GECOR_TOKEN": "<tu-token-gecor>",
        "GECOR_AYTO_ID": "268"
      }
    }
  }
}

Claude Code

claude mcp add chiclana-avisos \
  -e GECOR_TOKEN=<tu-token-gecor> \
  -e GECOR_AYTO_ID=268 \
  -- npx -y chiclana-avisos-mcp

Otros clientes MCP (OpenCode, Hermes, etc.)

Cualquier cliente que lance servidores MCP por stdio necesita los mismos tres elementos: comando, argumentos y entorno.

  • command: npx

  • args: ["-y", "chiclana-avisos-mcp"]

  • env: GECOR_TOKEN y GECOR_AYTO_ID (por defecto 268)

Consulta la documentación de tu cliente para el formato exacto del fichero de configuración.

Confirmar una previsualización envía un aviso real al ayuntamiento. Antes de enviar, el agente siempre te muestra el resumen y espera tu «sí».

Para agentes de IA

Si eres un agente configurando este servidor para un usuario:

  1. Pide al usuario su token de GECOR (ver 1. Obtener el token de GECOR); no lo busques ni lo extraigas por tu cuenta.

  2. Configura la entrada MCP con npx -y chiclana-avisos-mcp y el token en env de esa entrada. Chiclana es GECOR_AYTO_ID=268; para otro municipio, obtén su ID con list_ayuntamientos.

  3. Reinicia el cliente y llama a whoami: confirma el municipio activo y que hay token configurado, pero no valida el token. Para comprobar que GECOR lo acepta, llama a list_my_avisos (solo lectura).

  4. Sigue el flujo de skill/SKILL.md: previsualizar, mostrar el resumen y enviar solo tras confirmación explícita.

  5. Confirmar envía un aviso real al ayuntamiento: llama al envío confirmado únicamente después de un «sí» explícito de la persona al resumen exacto mostrado. Nunca confirmes por inferencia, por silencio ni ante una respuesta ambigua.

Desde el código

git clone https://github.com/dfernandezdaw/chiclana-avisos-mcp.git
cd chiclana-avisos-mcp
npm install
npm run build

Y apunta tu cliente MCP a dist/index.js (por ejemplo, en claude_desktop_config.json):

{
  "mcpServers": {
    "chiclana-avisos": {
      "command": "node",
      "args": ["/ruta/absoluta/a/chiclana-avisos-mcp/dist/index.js"],
      "env": {
        "GECOR_AYTO_ID": "268",
        "GECOR_TOKEN": "<tu-token-gecor>"
      }
    }
  }
}

Configura el token directamente en env para cada entrada MCP que inicie este servidor. No uses una exportación global del token: así las credenciales quedan limitadas al proceso MCP correspondiente.


Related MCP server: Catastro GPS MCP server

⚙️ Configuración

Variables de entorno leídas por el proceso MCP:

Variable

Por defecto

Descripción

GECOR_TOKEN

(vacío)

Token de sesión GECOR. Obligatorio para list_my_avisos y para enviar avisos; también identifica al peticionario.

GECOR_AYTO_ID

268

Municipio activo inicial (Chiclana de la Frontera).

GECOR_API_URL

https://gecorapiwe.azurewebsites.net/api

URL base de la API de GECOR.

GECOR_PROCEDENCIA_WEB

1390

Procedencia del aviso cuando la ficha del ayuntamiento en GECOR no incluye ProcedenciaWeb. Valores que no sean enteros positivos usan el defecto.

GECOR_LANGUAGE

es

Idioma de las consultas a GECOR (p. ej. listado de municipios).

GECOR_TIMEOUT_MS

20000

Tiempo máximo por petición, en ms. Valores no válidos usan el defecto; el máximo es 120000.

GECOR_PHOTO_DIRS

tmp, ~/Downloads, ~/Pictures, ~/Desktop, ~/.hermes

Directorios permitidos para image_path, separados por : (; en Windows). Solo rutas absolutas; sustituyen a los valores por defecto.

GECOR_MAX_PHOTO_BYTES

20971520 (20 MB)

Tamaño máximo de la foto recibida.


🛠️ Herramientas MCP Disponibles

Tool

Descripción

whoami

Muestra el municipio activo y si GECOR_TOKEN está configurado.

list_ayuntamientos

Lista los municipios que usan GECOR, con su AyuntamientoID (filtro opcional search).

set_ayuntamiento

Cambia el municipio activo de la sesión MCP (ayuntamientoID).

list_categories

Lista las familias, elementos/subcategorías y tipologías de avería disponibles (admite filtro de texto: ej. farola, basura).

resolve_location

Con lat+lng, devuelve hasta 5 calles cercanas (radio 150 m) con CalleID y Numero. Con street_name, busca en el callejero oficial y devuelve hasta 10 coincidencias (CalleID, Nombre, TipoVia) sin coordenadas: no es geocodificación.

create_aviso_from_photo

Única herramienta pública para avisos: previsualiza con descripción, categoría GECOR, ubicación y una foto obligatoria (image_path o image_base64, no ambos); procesa EXIF, reduce la foto si procede y devuelve un resumen con foto y un preview_token válido 10 minutos y de un solo uso, más una miniatura como contenido de imagen para que el agente redacte y verifique la descripción. Sin description, devuelve phase: need_description con la miniatura y sin token. Tras confirmación explícita, acepta únicamente preview_token, confirm: true y human_confirmed: true. La foto se sube solo en el envío confirmado.

list_my_avisos

Lista las incidencias registradas por el usuario del token con su estado de tramitación. Es la comprobación obligatoria tras un envío ambiguo.


🔒 Seguridad y confirmación explícita

El flujo de envío requiere confirmación explícita; la previsualización por sí sola no crea ningún aviso ni sube la foto, pero confirmarla envía un aviso real al ayuntamiento:

  1. Usa create_aviso_from_photo para ambas fases. Para previsualizar, envía los campos del aviso y una foto no vacía mediante image_path o image_base64, sin token ni campos de confirmación. Usa list_categories para identificar categorías. La herramienta procesa EXIF internamente durante la previsualización; no existe una herramienta independiente parse_photo_gps.

  2. Muestra un resumen breve de categoría, descripción, dirección/referencia, foto y ubicación disponible. No incluyas peticionario, tokens, payload crudo ni identidad privada.

  3. Espera un sí inequívoco al resumen exacto en la misma conversación. Ante cambios o respuesta ambigua, crea una previsualización nueva y vuelve a pedir confirmación.

  4. Tras confirmar, llama al mismo tool solo con preview_token, confirm: true y human_confirmed: true. Haz esta llamada solo tras un «sí» explícito al resumen exacto. Si falla la validación o la subida de la foto, informa que el aviso NO se envió; nunca reintentes una escritura posiblemente completada.

  5. estado: ENVIADO_EXITOSAMENTE en la respuesta wrapper de Chiclana indica que la llamada MCP/API tuvo éxito, no que ese sea el estado de tramitación municipal. Comunica únicamente lo que devolvió la API: informa un número oficial de ticket o estado de tramitación solo si aparece en resultado devuelto por GECOR o está verificado inequívocamente; no lo adivines.

La dirección textual no se geocodifica en este proyecto: resolve_location por nombre de calle solo devuelve el CalleID. Si la foto no aporta GPS EXIF, solicita coordenadas explícitas; nunca inventes ubicación. Prefiere la foto original para conservar EXIF. No se admite subida remota HTTP.

Fotos

  • Formatos: solo JPEG o PNG, detectados por su contenido. HEIC no se admite: conviértela antes (en iPhone, Ajustes › Cámara › Formatos › «Más compatible»).

  • Tamaño máximo: 20 MB (GECOR_MAX_PHOTO_BYTES).

  • image_path debe estar dentro de los directorios permitidos (GECOR_PHOTO_DIRS; por defecto el temporal del sistema, ~/Downloads, ~/Pictures, ~/Desktop y ~/.hermes) y apuntar a un fichero regular. Si no, usa image_base64 (admite prefijo data:image/...;base64,).

  • GPS: solo se lee el EXIF de JPEG. Los PNG, las fotos reenviadas por apps que eliminan metadatos (p. ej. Telegram, salvo envío como archivo) y las capturas no aportan coordenadas.

  • Reducción: los JPEG cuyo lado mayor supera 2048 px se reducen a 2048 px (calidad 85) conservando los segmentos EXIF/XMP originales, incluida la orientación. Si la reducción no es posible, se sube el original y la previsualización lo indica en foto.aviso_reduccion. Los PNG se suben sin cambios.

  • Miniatura: la previsualización devuelve al modelo una imagen JPEG de lado mayor ≤ 1024 px (calidad 80) sin EXIF ni GPS, con la orientación ya aplicada; los PNG de hasta 1 MB se devuelven tal cual y los mayores no tienen miniatura. La miniatura nunca se sube: GECOR recibe la copia de 2048 px con EXIF. Si no se puede generar, la previsualización continúa sin ella.

  • La previsualización incluye foto con mime, original_bytes, upload_bytes, width, height, reducida, exif_conservado y miniatura (más aviso_miniatura si no se pudo generar).

Errores y reintentos

  • Cada petición a GECOR expira tras GECOR_TIMEOUT_MS (20 s por defecto). Las consultas (get*) se reintentan una vez ante timeout, error de red o 5xx; las escrituras nunca se reintentan automáticamente.

  • El preview_token se consume antes de cualquier efecto: un mismo token no puede crear dos avisos.

  • Si falla la subida de la foto, no se crea ningún aviso; genera una nueva previsualización.

  • Si la creación devuelve «Envío NO confirmado» tras timeout, error de red o 5xx, el resultado es ambiguo: el aviso podría haberse creado. Consulta list_my_avisos y, solo si no aparece, crea una nueva previsualización y pide confirmación otra vez. Un 4xx sí descarta la creación.

Skill reutilizable

El artefacto de instrucciones, independiente de cualquier plataforma o harness, está en skill/SKILL.md. Su instalación es manual: colócalo en el directorio de skills que admita tu cliente. Mantén el proceso MCP en un entorno con acceso a las rutas locales que le proporciones; este proyecto no modifica configuraciones externas.


🌐 Soporte Multi-Ayuntamiento

Aunque está preconfigurado por defecto para Chiclana de la Frontera (ID 268), el servidor está pensado para los municipios que usan GECOR (Torremolinos, Vélez-Málaga, Viladecans, etc.).

Para listar todos los municipios disponibles:

node dist/cli.js ayuntamientos

Para usar otro municipio por defecto, define la variable de entorno:

export GECOR_AYTO_ID=143 # Ejemplo: Torremolinos

💻 CLI de Apoyo

Se incluye una utilidad de línea de comandos para realizar pruebas directas:

node dist/cli.js ayuntamientos [filtro]    # Buscar municipios GECOR
node dist/cli.js whoami                   # Ver estado de configuración
node dist/cli.js categories [filtro]      # Ver categorías y tipologías
node dist/cli.js photo <foto.jpg>         # Inspeccionar metadatos GPS EXIF (misma restricción de directorios)
node dist/cli.js calles [filtro]          # Consultar callejero oficial

🏗️ Construcción y Desarrollo

npm install
npm run build
npm run typecheck
npm test

📄 Licencia

MIT. Consulta LICENSE.

Inspirado en madrid-avisos-mcp.

Available Tools

7 tools
create_aviso_from_photoA

Única herramienta para avisos, en dos fases. Para previsualizar, llama con los campos del aviso y una foto obligatoria (image_path o image_base64), sin preview_token ni campos de confirmación. La previsualización devuelve además una miniatura de la foto (imagen JPEG ≤1024 px sin EXIF, o el PNG pequeño tal cual) para que redactes la descripción y compruebes la categoría con lo visible; si omites description, devuelve phase: need_description con la miniatura y sin preview_token. Enseña el resumen exacto y espera un sí explícito. Solo entonces vuelve a llamar con únicamente preview_token, confirm:true y human_confirmed:true. Si el usuario pide cambios, crea una nueva previsualización; nunca envíes por inferencia. La previsualización no envía nada; confirmar envía un aviso real al ayuntamiento y la foto se sube únicamente durante ese envío confirmado.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitud; puede omitirse si la foto aporta GPS EXIF.
lngNoLongitud; puede omitirse si la foto aporta GPS EXIF.
calleIDNoID de calle; usa 0 si no se resolvió en el callejero.
confirmNoSolo true tras el sí explícito al resumen exacto.
tipoIncNoNombre del tipo de incidencia.
numCalleNoNúmero del portal, si se conoce.
tipoIncIDNoID del tipo de incidencia de list_categories.
image_pathNoRuta local de una foto JPEG o PNG dentro de los directorios permitidos (GECOR_PHOTO_DIRS; por defecto tmp, Downloads, Pictures, Desktop y ~/.hermes). Máximo 20 MB salvo GECOR_MAX_PHOTO_BYTES.
descriptionNoDescripción factual del desperfecto, redactada por el agente a partir de lo visible en la foto y lo que diga el usuario (1–2 frases; no inventes datos). Si se omite, la previsualización devuelve la miniatura para redactarla.
desUbicacionNoDirección formateada o referencia textual del lugar.
image_base64NoFoto JPEG o PNG en base64 (admite prefijo data:image/...;base64,) si no se dispone de una ruta local.
preview_tokenNoSolo para la segunda fase: token exacto devuelto por la previsualización.
tipoElementoIDNoID de elemento/subcategoría de list_categories.
desTipoElementoNoNombre del elemento/subcategoría.
human_confirmedNoSolo true tras la confirmación humana explícita.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so well: it discloses that the preview sends nothing, that confirming sends a REAL aviso to the city council, and that the photo is only uploaded during that confirmed send — an irreversible side effect clearly flagged. It also documents the return payload (JPEG ≤1024px sans EXIF thumbnail, or the raw small PNG, and the need_description phase).

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

Conciseness4/5

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

Dense but front-loaded — the two-phase nature and the preview-vs-confirm split arrive first, with the thumbnail/phase:need_description detail trailing. Some sentences run long, but each carries actionable constraints (mandatory photo, confirmation gating, no inference submission) rather than filler.

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

Completeness5/5

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

For a 15-parameter mutation tool with no annotations and no output schema, the description supplies the workflow, side-effect profile, error branch, and return-value semantics an agent needs. Little is missing to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real meaning by assigning parameters to phases: which fields belong to the preview call and which (preview_token, confirm, human_confirmed) are confirmation-only. This sequencing context is not derivable from the flat schema.

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

Purpose5/5

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

Opens with a specific verb+resource in the domain's own vocabulary ('Única herramienta para avisos, en dos fases'), immediately distinguishing it from the read-only siblings (list_my_avisos, list_categories). An agent knows this is the write path for filing a report.

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

Usage Guidelines5/5

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

Explicit two-phase flow: preview with aviso fields + mandatory photo and no token, then confirm only with preview_token/confirm/human_confirmed. It states when-not (never submit by inference) and the recovery path (if the user requests changes, create a new preview). Nothing is left to inference.

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

list_ayuntamientosB

Lista todos los municipios soportados por la plataforma GECOR (con sus identificadores y nombres).

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro opcional por nombre de municipio (ej: 'Chiclana', 'Torremolinos').

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, but 'Lista' clearly signals a read-only enumeration and it discloses the shape of the returned data (ids and names). It says nothing about authentication, pagination, or whether the list is static or filtered by the caller's tenant.

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

Conciseness4/5

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

A single, front-loaded sentence with no filler. It could be slightly tighter but every clause contributes (scope, platform, returned fields).

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

Completeness4/5

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

For a simple, parameterless read-only list tool with no output schema, the description is adequate: it states the scope and what each entry contains. The missing pieces (auth, whether results are exhaustive) are minor for this complexity level.

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

Parameters3/5

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

Schema description coverage is 100%, so the single 'search' parameter is already documented in the schema with examples. The description adds no filtering semantics beyond what the schema provides, which is the expected baseline.

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

Purpose4/5

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

The description gives a specific verb+resource ('Lista todos los municipios') and even states the returned content (identificadores y nombres). It is clearly distinguishable from set_ayuntamiento, though it doesn't name siblings explicitly.

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

Usage Guidelines2/5

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

There is no statement of when to use this versus alternatives. The natural use case – looking up a municipality identifier before calling set_ayuntamiento – is left entirely to inference.

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

list_categoriesA

Obtiene el catálogo de tipologías de incidencias (familias, elementos/subcategorías y tipos de incidencia) para el ayuntamiento activo.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro opcional de texto para buscar por familia, elemento o tipo de avería (ej: 'farola', 'basura', 'acera').

TDQS

A3.5/5.0
Behavior3/5

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 is clearly a read-only catalog fetch and it usefully discloses the shape of the returned taxonomy (families, elements/subcategories, types), which substitutes for a missing output schema. However, it says nothing about whether results are cached, paginated, or how large the catalog is.

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

Conciseness4/5

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

A single, front-loaded sentence with no filler. Slightly dense parenthetical enumeration, but every clause earns its place by describing the returned taxonomy.

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

Completeness4/5

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

For a simple catalog-listing tool with one optional parameter and no output schema, the description is largely sufficient: it names the resource, its scope (active ayuntamiento), and the structure of the returned data. Only the when-to-use framing and any behavioral caveats are missing.

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

Parameters3/5

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

Schema coverage is 100% with a single optional 'search' parameter fully documented in the schema. The description adds no parameter detail beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb+resource: retrieves the catalog of incident typologies (families, elements/subcategories, types) for the active ayuntamiento. This is clearly distinguishable from the sibling tools (whoami, list_ayuntamientos, set_ayuntamiento, resolve_location, etc.), which handle identity, municipality selection, and location rather than taxonomy. It doesn't explicitly name a sibling, but the resource is specific enough.

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

Usage Guidelines3/5

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

No explicit when/when-not guidance or named alternatives. The phrase 'para el ayuntamiento activo' implicitly signals a dependency on set_ayuntamiento having run first, which is useful implied context, but it is left for the agent to infer. Minimum-viable implied usage.

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

list_my_avisosB

Consulta los avisos previamente registrados por el usuario para consultar su estado de tramitación.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It indicates the tool reads previously registered notices and returns their processing status, but does not state read-only safety, authentication requirements, pagination, or return format.

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

Conciseness4/5

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

The description is a single sentence, front-loading the action. However, it redundantly uses 'Consulta' and 'para consultar', slightly reducing efficiency.

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

Completeness3/5

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

For a parameterless list tool with no output schema and no annotations, the description gives the basic purpose and the type of information returned (processing status). However, it omits usage context, behavioral traits, and return format details, leaving some gaps for an agent to infer.

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

Parameters4/5

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

The tool takes zero parameters, so the schema provides no parameter semantics. Per the rubric, zero parameters yields a baseline score of 4.

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

Purpose4/5

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

The description states a specific verb ('Consulta') and resource ('avisos'), and adds the scoping detail that these are the user's previously registered notices, queried to check processing status. It does not explicitly differentiate from sibling list tools (e.g., list_ayuntamientos, list_categories), but the resource is distinct enough for an agent to distinguish.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives, nor are any exclusions or prerequisites stated. The purpose implies usage, but the description does not explicitly say when an agent should select this over other listing tools.

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

resolve_locationB

Valida y resuelve una ubicación en el municipio activo mediante coordenadas GPS o búsqueda de calles en el callejero oficial de GECOR.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitud GPS (ej: 36.4165)
lngNoLongitud GPS (ej: -6.1461)
street_nameNoNombre de la calle o texto de búsqueda si no se tienen coordenadas exactas.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the state dependency on the 'municipio activo' (implying set_ayuntamiento must run first) and that resolution is against the official GECOR callejero, which implies a read-only lookup. It does not say what is returned, how ambiguous street matches are handled, or what happens when coordinates fall outside the municipality.

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

Conciseness4/5

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

A single efficient sentence with the action front-loaded and the two input modes trailing. No filler, though the purpose and the mode list are packed into one clause with no visual separation.

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

Completeness3/5

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

No output schema exists, so the description arguably should say what a resolved location looks like (canonical street, ID, coordinates). It also omits what happens with no required parameters supplied and whether the active municipality is a hard prerequisite. Adequate but with clear gaps for a 3-param resolver with no annotations.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents lat, lng and street_name with examples. The description's only added semantics is that coordinates and street search are alternative modes rather than a combined query, which is genuine but modest value on top of the schema.

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

Purpose4/5

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

States a specific verb pair (valida y resuelve) and resource (una ubicación), plus the scope (municipio activo) and the two accepted input modes. An agent can tell it apart from the siblings (whoami, list_avisos, create_aviso_from_photo) without opening the schema, though it doesn't explicitly name any sibling.

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

Usage Guidelines3/5

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

The description implies when the tool applies by naming two entry paths (GPS coordinates or street lookup in the callejero), which is useful routing information. However, it gives no explicit when-not guidance, no prerequisites (e.g. that an active municipality must first be set), and no error/ambiguity handling.

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

set_ayuntamientoA

Cambia el ayuntamiento activo para las consultas e incidencias.

ParametersJSON Schema
NameRequiredDescriptionDefault
ayuntamientoIDYesID del ayuntamiento (ej: 268 para Chiclana de la Frontera).

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations the description carries the full burden, and it does disclose the effect scope (the active municipality applies to queries and incidents), which is real behavioral context. However, it is silent on persistence across sessions, permission requirements, and what happens with an invalid ID.

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

Conciseness5/5

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

A single front-loaded sentence with zero waste; the action and its effect are stated immediately.

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

Completeness3/5

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

For a simple one-parameter state-setting tool with no output schema, the description covers the essential purpose. It omits the practical prerequisite of sourcing a valid ayuntamientoID (e.g., via list_ayuntamientos) and any persistence/error behavior, leaving modest gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the single parameter ayuntamientoID is already documented in the schema with an example value. The description adds nothing beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: 'Cambia el ayuntamiento activo' (changes the active municipality). An agent can tell it is a setter of session context, distinct from the sibling list_ayuntamientos which enumerates them. It does not explicitly name a sibling to differentiate against, keeping it 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.

Usage Guidelines3/5

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

'para las consultas e incidencias' implies the change scopes subsequent queries and incident calls, which is implicit usage guidance. There is no explicit when-to-use, no note that the ID should first be obtained from list_ayuntamientos, and no when-not-to-use.

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

whoamiA

Muestra el municipio activo y si GECOR_TOKEN está configurado.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the two pieces of state returned (active municipality, token configuration), which implies a read-only diagnostic, but never states that it is non-mutating, what permissions it needs, or whether it makes a network call. Minimum viable for a trivial zero-param tool.

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

Conciseness5/5

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

A single sentence that front-loads the primary output and adds the token-check detail second. No filler, no redundancy.

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

Completeness4/5

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

With no output schema and no annotations, the description must explain what comes back, and it does name both return values. It could specify the response format (e.g. booleans, string names), but for a trivial state-check tool it is essentially complete.

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

Parameters4/5

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

The schema defines zero parameters, so there is nothing for the description to clarify. Baseline of 4 applies since no parameter ambiguity exists.

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

Purpose4/5

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

The description gives a concrete verb and two specific outputs: it shows the active municipality and whether GECOR_TOKEN is configured. This is clearer than the bare name 'whoami' and distinguishes it from setters like set_ayuntamiento. It does not explicitly name the sibling it differs from, 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.

Usage Guidelines2/5

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 tool, when not to, or which alternative to prefer. Usage is only implied by the fact that it reports current state. An agent gets no routing guidance versus list_ayuntamientos or set_ayuntamiento.

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.

  1. 7 tool updatesv1.1.0
    • First observedcreate_aviso_from_photo
    • First observedlist_ayuntamientos
    • First observedlist_categories
    • First observedlist_my_avisos
    • First observedresolve_location
    • First observedset_ayuntamiento
    • First observedwhoami

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

Each tool targets a distinct action: identity check, listing municipalities, setting active municipality, catálogos, location resolution, aviso creation, and listing own avisos. The overlapping but functional pair of list_ayuntamientos/set_ayuntamiento is clearly differentiated by verb. create_aviso_from_photo is a single tool handling both preview and confirm, reducing ambiguity.

Naming Consistency4/5

Mostly consistent snake_case verb_noun (list_ayuntamientos, set_ayuntamiento, list_categories, resolve_location, list_my_avisos). whoami and create_aviso_from_photo deviate slightly but remain readable and domain-appropriate.

Tool Count5/5

Seven tools is well-scoped for a municipal incident-reporting MCP. Each tool serves a clear role in the workflow without redundancy.

Completeness4/5

Covers the core lifecycle: authentication, municipality selection, category lookup, location resolution, incident creation, and status listing. Missing update/delete or detail view for avisos, but an agent can work around via create+list for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables incident management through natural language, with tools for searching, retrieving, creating, updating, and commenting on issues, simulating upstream events, creating GitHub issues, and listing side effects.
    10
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to look up official cadastral parcels across 31 European country and region codes by reference, coordinates, or free-text Spanish address, returning location, area, land use, and outlines while also estimating solar and agricultural potential, market prices, and investment scores.
    9
    107 npm
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to report street incidents to Valencia City Council by listing categories, geocoding streets, checking existing reports, and creating nuevos avisos from text or photos with human-confirmed previews. Supports stdio and HTTP transports, with identity and device registration handled locally.
    11
    13 npm
    1
    AGPL 3.0