Skip to main content
Glama

bilbao-avisos-mcp

Servidor MCP (y CLI de apoyo) para el sistema de avisos del Ayuntamiento de Bilbao (MeJora Bilbao / Bilbo Hobetuz). Permite a un agente listar categorías, buscar calles, consultar avisos y crear avisos con inteligencia artificial — incluso desde una foto.

La finalidad de este proyecto es hacer más fácil que los ciudadanos puedan reportar problemas al Ayuntamiento de Bilbao. Saca una foto de la incidencia (por ejemplo, basura tirada en la calle, una farola que no funciona…) pásasela al agente pidiéndole que genere un aviso para que de forma autónoma describa el problema, seleccione la categoría más adecuada, añada la ubicación (la foto tiene que estar geolocalizada) y lance el aviso al Ayuntamiento.

Inicio rápido

Bilbao no usa cuenta de ciudadano: la app se autentica con una cuenta de servicio (Keycloak, grant password) y cada aviso lleva los datos del comunicante.

  1. Credenciales de servicio (las que usa la propia app; van en el entorno, no en el código):

    export BILBAO_AVISOS_USERNAME=999400
    export BILBAO_AVISOS_PASSWORD=s7rvq45XJ2

    Si el Ayuntamiento las rota, relee tu copia del APK de "Mejora Bilbao" (grep -o 'token_credentials:{[^}]*}' assets/public/main.*.js) o pide credenciales propias.

  2. Añade el servidor a tu cliente MCP (ejemplos) o configúralo a mano:

{
  "mcpServers": {
    "bilbao-avisos": {
      "command": "npx",
      "args": ["-y", "bilbao-avisos-mcp"],
      "env": { "BILBAO_AVISOS_USERNAME": "999400", "BILBAO_AVISOS_PASSWORD": "s7rvq45XJ2" }
    }
  }
}
  1. Verifica: check_auth debe devolver comprobarVersion con estadoVersion.

  2. Pregunta al humano UNA vez su idioma (es/eu), nombre, primer apellido y teléfono o email; guárdalo con la tool set_identity. Se reutiliza en todos los avisos.

  3. Flujo del agente: create_aviso_from_photo (foto → categoría → calle → preview) → enseña el preview al humano → confirm: true + human_confirmed: true + preview_token solo con su "sí" → attach_photo.

Todo corre en tu máquina; los avisos se crean con tu cuenta de servicio y los datos del comunicante guardados.

Related MCP server: Vancam MCP Server

Fotos demasiado grandes para el modelo

Algunos modelos rechazan fotos muy grandes (image decode limit exceeded). El servidor reduce en TypeScript (sin dependencias) conservando el GPS, así que el modelo nunca necesita procesar la original:

  • Remoto (HTTP): sube la foto con curl y usa el file_id (los bytes no pasan por el modelo). Requiere el secreto del servidor:

    curl -X PUT --data-binary @foto.jpg \
      -H "Authorization: Bearer ***" \
      'http://127.0.0.1:3000/upload?filename=foto.jpg'
    # → {"file_id":"…","bytes":…}

    El preview devuelve preview_image_base64 (copia reducida) para visión y adjunta siempre la original.

  • Local (stdio/CLI): pasa image_path; el servidor lee y reduce sin que el modelo abra el fichero. O reduce tú con node dist/cli.js prep-photo foto.jpg [foto-ligera.jpg].

¿Eres un agente IA? Lee esto primero

La skill (skill/SKILL.md) no se autoinstala: cópiala al directorio de tu cliente y abre sesión nueva.

cp -r skill ~/.hermes/skills/bilbao-avisos        # Hermes
cp -r skill ~/.claude/skills/bilbao-avisos        # Claude Code
# o descárgala: https://github.com/Naroh091/bilbao-avisos-mcp/blob/main/skill/SKILL.md

Instálalo así (requiere Node 18+):

  1. Credenciales: las de la propia app (BILBAO_AVISOS_USERNAME=999400, BILBAO_AVISOS_PASSWORD=s7rvq45XJ2) en el entorno del servidor. Sin ellas solo funcionan las llamadas sin auth (categorías, callejero).

  2. Instalación según tu cliente (comandos exactos): Claude Code (claude mcp add … -- npx -y bilbao-avisos-mcp), Hermes (hermes mcp add … --command npx … --args -y bilbao-avisos-mcp) u OpenClaw (openclaw mcp add … --command npx --arg -y --arg bilbao-avisos-mcp). Las credenciales viajan en el entorno de tu config.

  3. Identidad: pregunta idioma + nombre + primer apellido + teléfono o email UNA vez y guárdala con set_identity (verifica con get_identity). Sin identidad no se puede crear ni consultar.

  4. Verifica (mcp list / test / doctor --probe según cliente): debes ver 12 tools.

  5. Uso: hay skill completa en skill/SKILL.md. Lo esencial: solo incidencias genuinas; create_aviso_from_photo en fases (categoría → calle → preview → envío solo con "sí" humano + confirm + human_confirmed + preview_token); foto por file_id; sin GPS no adivines la ubicación; calle y portal siempre de search_street.

Añadir el MCP vía npx

Requiere Node 18+.

Claude Code

claude mcp add bilbao-avisos -e BILBAO_AVISOS_USERNAME=999400 -e BILBAO_AVISOS_PASSWORD=s7rvq45XJ2 -- npx -y bilbao-avisos-mcp
claude mcp list   # verificar

Hermes

hermes mcp add bilbao-avisos --command npx --env BILBAO_AVISOS_USERNAME=999400 --env BILBAO_AVISOS_PASSWORD=s7rvq45XJ2 --args -y bilbao-avisos-mcp
hermes mcp test bilbao-avisos   # verificar (lista las 12 tools)

OpenClaw

openclaw mcp add bilbao-avisos \
  --command npx \
  --arg -y \
  --arg bilbao-avisos-mcp \
  --env BILBAO_AVISOS_USERNAME=999400 \
  --env BILBAO_AVISOS_PASSWORD=s7rvq45XJ2
openclaw mcp doctor bilbao-avisos --probe   # verificar

Desde código

npm install
npm run build
npx -y -p bilbao-avisos-mcp bilbao-avisos-mcp-http   # HTTP en 127.0.0.1:3000/mcp

Herramientas MCP

Tool

Qué hace

check_auth

Token Keycloak + comprobarVersion (verifica la instalación).

get_identity

Identidad guardada del comunicante (o null).

set_identity

Guarda nombre/apellidos/contacto/idioma (se pregunta una vez).

list_categories

Servicios y temas (cada tema trae su serviceCode).

get_category

Detalle de un serviceCode (servicio, tipo A/S, tema).

suggest_categories

Sugiere serviceCode por palabras.

search_street

Callejero: calle → TECA_COD_CALLE, portales y coordenadas.

reverse_geocode

lon/lat → calle y portal cercanos.

my_avisos

Comunicaciones del comunicante (por teléfono/email).

create_aviso

Crea un aviso/sugerencia. Dry-run por defecto; confirm: true para enviar.

create_aviso_from_photo

Aviso desde foto en fases: categoría → calle → preview (GPS EXIF) y envío solo con confirm: true + human_confirmed: true + preview_token. Acepta image_base64, image_path o file_id.

attach_photo

Adjunta una foto a la comunicación (ide_comunicacion). Dry-run por defecto.

Son 12 tools.

Seguridad de envío

create_aviso es dry-run por defecto: devuelve el payload sin crear nada. Solo con confirm: true hace los POST reales — un aviso real que revisa personal municipal. Envía únicamente incidencias reales.

create_aviso_from_photo exige confirmación humana en fases:

  1. Categoría (sin serviceCode): sugiere y no envía nada.

  2. Calle (sin streetCode): pide calle/portal y no envía nada.

  3. Preview (confirm ausente/false): GPS EXIF (o lat/lng manuales), payload + preview_token. No envía nada.

  4. Envío: el agente muestra el preview al humano y espera su "sí"; solo entonces repite la llamada con los MISMOS campos + confirm: true + human_confirmed: true + preview_token. Si cambió cualquier campo, hay que repetir el preview.

Uso como CLI

export BILBAO_AVISOS_USERNAME=999400 BILBAO_AVISOS_PASSWORD=s7rvq45XJ2
node dist/cli.js check-auth
node dist/cli.js identity-set "Nombre" "Apellido1" "" 944000000 nombre@example.com es
node dist/cli.js categories
node dist/cli.js category LIM-OSLILI
node dist/cli.js street "Gran Via"
node dist/cli.js reverse -2.9234 43.2642
node dist/cli.js my-avisos
node dist/cli.js create A LIM-OSLILI 4040 1 "Contenedor desbordado"          # dry-run
node dist/cli.js create A LIM-OSLILI 4040 1 "Contenedor desbordado" --send   # ENVÍA de verdad
node dist/cli.js from-photo foto.jpg LIM-OSLILI "Cartones en la acera"      # preview desde foto
node dist/cli.js prep-photo foto.jpg [foto-ligera.jpg]   # reduce para el modelo, conserva EXIF/GPS

Servidor HTTP (opcional)

Por stdio cada uno corre su copia con sus credenciales. La entrada HTTP sirve para el caso contrario: exponer el servidor que corre en TU máquina (con TUS credenciales) para que un agente en OTRA máquina lo use — en ese caso actúa como tú, no como el dueño del agente remoto. Para uso personal normal no la necesitas.

export BILBAO_AVISOS_USERNAME=999400 BILBAO_AVISOS_PASSWORD=s7rvq45XJ2
export BILBAO_AVISOS_MCP_SECRET=<un-secreto-largo>            # exige x-mcp-secret o Bearer
export BILBAO_AVISOS_ALLOWED_HOSTS=tu-host.tu-tailnet.ts.net  # anti DNS-rebinding
npm run start:http     # 127.0.0.1:3000/mcp

Variables: BILBAO_AVISOS_HTTP_PORT (3000), BILBAO_AVISOS_HTTP_HOST (127.0.0.1), BILBAO_AVISOS_HTTP_PATH (/mcp). Expón solo en red privada (p.ej. tailscale serve, nunca funnel): quien llegue a la URL actúa como tu usuario. Para persistencia, launchd/pm2/tmux o similar.

Arquitectura

  • src/client.ts — HTTP: token Keycloak (grant password, auto-renovación ante 401) + Bearer, callejero sin auth.

  • src/identity.ts — perfil del comunicante en JSON local (0600), con las reglas del formulario.

  • src/avisos.ts — núcleo de negocio (reutilizado por MCP y CLI): versión, categorías, callejero, mis avisos, creación en 2 POST (persona + comunicación), foto.

  • src/photo.ts — foto: EXIF/GPS, subida a tmp, token de preview.

  • src/types.ts — esquemas zod de entrada + payload de creación.

  • src/mcp.ts — buildServer(): registra las 12 tools (compartido por stdio y HTTP).

  • src/server.ts — entrada stdio · src/http.ts — entrada HTTP (/mcp + PUT /upload) · src/cli.ts — CLI.

Notas

  • Ingeniería inversa del APK "Mejora Bilbao - Bilbo Hobetuz" v4.0.0 + verificación en vivo de los endpoints de lectura y del dry-run (sin crear avisos reales).

  • Si el Ayuntamiento rota la cuenta de servicio, actualiza las variables de entorno.

Licencia

AGPLv3. Ver LICENSE.

Available Tools

12 tools
attach_photoA

Adjunta una foto a una comunicación ya creada (ide_comunicacion de la respuesta del envío). Foto por file_id (PUT /upload), image_path local o image_base64. Dry-run por defecto; confirm=true para subirla.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
file_idNo
image_pathNo
image_base64No
ide_comunicacionYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does disclose the most important trait: dry-run is the default and confirm=true is required to actually upload. It also enumerates the three accepted photo sources. It omits auth requirements, size/format limits, and whether an existing photo is replaced.

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

Conciseness4/5

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

Two compact sentences, front-loaded with the action and its precondition, followed by the input modes and the dry-run flag. Dense but each clause carries information; no filler.

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 5-parameter, zero-coverage, no-annotation, no-output-schema tool, the description covers inputs and the dry-run behavior but leaves gaps: no return shape for a dry run, no auth or quota context, and no failure semantics. Adequate but not fully self-sufficient.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: file_id (from PUT /upload), image_path (local), image_base64, confirm (dry-run toggle) and ide_comunicacion (from the send response) are all given meaning. The 'o' listing implies the three photo sources are alternatives, though mutual exclusivity is not stated outright.

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?

States a precise verb+resource (attach a photo) scoped to an already-created communication, and ties the required ide_comunicacion to the prior send response. This clearly separates it from the create_* siblings that build a new aviso from a photo.

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

Usage Guidelines4/5

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

Explains the precondition (the communication must already exist) and where the key input comes from (the send response). It does not explicitly name the alternative tools or state when NOT to use it, so it stops short of full routing guidance.

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

check_authA

Comprueba la cuenta de servicio: pide token Keycloak y llama a comprobarVersion. Úsalo para verificar la instalación.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/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 behavioral burden. It usefully discloses that the tool makes network/auth calls (requests a Keycloak token, invokes comprobarVersion), which implies side effects and a dependency on the auth service. It says nothing about failure modes, whether it mutates state, or expected latency/errors.

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

Conciseness4/5

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

Two short sentences, front-loaded with the action and followed by the usage hint. Every clause contributes; nothing is padded.

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 zero-param diagnostic tool this covers the essentials of what and when, but with no output schema the description never indicates what a successful or failed check returns, which is the main thing an agent needs for a verification tool.

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 baseline of 4 applies; there is no parameter semantics to explain or compensate for.

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 ('Comprueba la cuenta de servicio') and even names the internal steps (Keycloak token, comprobarVersion), so the agent knows exactly what happens. It does not, however, differentiate itself from siblings like get_identity or set_identity, which also concern identity/auth.

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

Usage Guidelines4/5

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

'Úsalo para verificar la instalación' gives a clear when-to-use scenario (installation/setup verification). No when-not conditions or named alternatives are provided, but the intended context is unambiguous.

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

create_avisoA

Crea un aviso/sugerencia. IMPORTANTE: por defecto es DRY-RUN (confirm=false) y solo devuelve el payload que se enviaría, SIN crear nada. Para crear de verdad hay que pasar confirm=true. Usa la identidad guardada salvo que se pase 'identity'.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
kindYes'A' aviso/incidencia, 'S' sugerencia
portalNonúmero de portal (por defecto '00')
allCityNo
confirmNoDEBE ser true para ENVIAR de verdad. Por defecto false = dry-run.
identityNoSobrescribe la identidad guardada solo para esta llamada
portalBisNotrue si el portal es 'bis' (rama con dirBisComunicacion)
streetCodeYesTECA_COD_CALLE del callejero (search_street)
descriptionYesdescripción del problema (texto que se publicará)
serviceCodeYesSERVICIO-TEMA de list_categories (p.ej. LIM-OSLILI)
districtCodeNoTTRE_COD_DISEST del portal
neighbourhoodCodeNoTTRE_COD_BARRIO del portal

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well: it discloses that the default call creates NOTHING and only returns the payload, and that confirm=true is required to actually submit. It omits auth/permission requirements and any error or side-effect behavior for the real submission path.

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?

Front-loads the dry-run warning, which is the most important thing for an agent to know, and stays to a tight few sentences. No filler, though the IMPORTANT block could be marginally tighter.

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 13-parameter nested-object tool with no output schema and no annotations, the description covers the critical dry-run and identity behaviors but leaves many parameters and the return payload shape unexplained. It is adequate to avoid accidental writes but not complete.

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 77%, so the schema already documents most parameters (kind, confirm, identity, streetCode, etc.). The description reinforces confirm and identity semantics but adds no syntax or format detail beyond what the schema provides, so the baseline 3 is appropriate.

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 ('Crea un aviso/sugerencia') so the agent knows exactly what the tool produces. It does not, however, distinguish itself from the sibling create_aviso_from_photo, leaving the agent to infer which creation path to choose.

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

Usage Guidelines4/5

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

Gives clear operational context: default is dry-run, real creation requires confirm=true, and identity comes from storage unless overridden. It stops short of naming alternatives or stating when this tool is preferred over create_aviso_from_photo.

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

create_aviso_from_photoA

Aviso desde una FOTO en fases. VÍA PREFERIDA: sube la foto con PUT /upload (curl) y pasa file_id; por stdio usa image_path local. Fase 1: sin service_code → sugiere categorías (need_category). Fase 2: sin calle → pide calle/portal (need_street, con reversa del GPS). Fase 3 (confirm=false): preview + preview_token SIN enviar. Fase 4: MISMOS campos + confirm:true + human_confirmed:true + preview_token (tras 'sí' humano). Sin las tres NO se envía.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
latNosobrescribe el GPS EXIF de la foto
lngNosobrescribe el GPS EXIF de la foto
kindNopor defecto 'A'
portalNo
allCityNo
confirmNotrue = ENVIAR de verdad (requiere preview_token + human_confirmed)
file_idNoVÍA PREFERIDA en remoto: id de PUT /upload
identityNoSobrescribe la identidad guardada solo para esta llamada
portalBisNo
image_pathNoruta local a la foto. Solo stdio/CLI en la máquina del servidor
streetCodeNo
descriptionNosi falta, se pre-rellena y se marca para revisión
serviceCodeNoSERVICIO-TEMA. Si falta, devuelve sugerencias y no crea nada
districtCodeNo
image_base64Nofoto como base64 (puro o data URL). Solo fotos pequeñas ya visibles
category_hintNolo que se ve en la foto ('cartones apilados en acera')
preview_tokenNo
human_confirmedNoel humano vio el preview y dijo 'sí'
neighbourhoodCodeNo

TDQS

A4/5.0
Behavior4/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 well: it discloses the four-phase state machine, that phase 3 produces a preview without sending, and the hard gate that all three of confirm/human_confirmed/preview_token are required or nothing is sent. It does not cover auth requirements, rate limits, or error behavior.

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 purpose is front-loaded in the first clause, followed by the preferred path, then the phases in order. It is telegraphic and dense but every sentence carries workflow information, appropriate for a 21-param multi-phase tool with no waste.

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 complex stateful tool with 21 params, no annotations, and no output schema, the description covers the workflow and the per-phase outcomes (need_category, need_street, preview_token) that an agent needs to drive the loop. Gaps remain around the peripheral geographic/identity fields, but the call-critical path is 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?

Schema coverage is only 57% across 21 params, but the description compensates by explaining the operational meaning of the key gate fields: service_code missing returns suggestions instead of creating, confirm=true actually sends, and human_confirmed means a human approved the preview. Several fields (x, y, kind, portal, allCity, portalBis, districtCode, streetCode, neighbourhoodCode) remain undocumented in both places.

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 names a specific verb and resource ('Aviso desde una FOTO en fases') and makes the photo-driven, phased nature explicit, which distinguishes it from the plain create_aviso sibling. It does not name create_aviso directly as the non-photo alternative, so the differentiation is implied 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.

Usage Guidelines4/5

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

It gives concrete when-to-use routing per phase (no service_code → suggest categories; no street → ask for street; confirm=false → preview; confirm=true → send) and states the preferred upload path (PUT /upload + file_id in remote, image_path under stdio). It lacks an explicit 'do not use this when...' clause or a pointer to create_aviso for non-photo cases.

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

get_categoryC

Detalle de un serviceCode 'SERVICIO-TEMA': servicio, tipo (A aviso / S sugerencia) y tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
service_codeYes

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry the full behavioral burden. It implies a read operation but does not state read-only behavior, authorization needs, error handling, or side effects. It only lists the returned fields.

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 efficient sentence with no wasted words and front-loads the core purpose. It is appropriately sized for a simple getter.

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?

With no output schema, the description usefully names the returned fields (servicio, tipo, tema) and explains the type codes (A aviso / S sugerencia). However, it lacks usage context and does not explain when this tool is appropriate versus related siblings.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaning by showing the service_code format as 'SERVICIO-TEMA' (service-topic), which helps an agent construct the parameter value. However, it does not fully document the parameter beyond this hint.

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 it returns detail for a serviceCode, including service, type, and topic. This is a clear resource retrieval, though it does not explicitly contrast with siblings like list_categories or suggest_categories.

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 provided on when to use this tool versus list_categories or suggest_categories, nor any prerequisites or context for calling it. The description only describes the output.

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

get_identityA

Devuelve la identidad del comunicante guardada (nombre, apellidos, contacto, idioma) o null si aún no se preguntó.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/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 behavioral burden and it does disclose the return payload and the null case for the unset state. It does not mention any session/auth prerequisite (relevant given the sibling check_auth) or confirm the absence of side effects beyond the read verb.

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 that packs the verb, the resource, the returned fields, and the null fallback with no wasted words.

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?

No output schema and no annotations exist, so the description must explain the return value itself, which it does by listing fields and the null case. It is nearly complete for a zero-parameter getter, missing only any auth/session precondition.

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 has nothing to document and the baseline is 4. The description correctly adds no parameter guidance because none is needed.

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?

Specific verb ("Devuelve") plus resource ("identidad del comunicante") and it enumerates exactly which fields come back (nombre, apellidos, contacto, idioma). The read semantics are immediately distinguishable from the sibling set_identity.

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 null clause ("o null si aún no se preguntó") implicitly tells the agent this is a pre-check before asking the user, which is useful context. However, it never states when to call it, when not to, or points to set_identity as the write counterpart, so usage is only implied.

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

list_categoriesB

Servicios y temas de avisos (categorías municipales). Cada tema trae su serviceCode 'SERVICIO-TEMA' para crear avisos.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose one useful behavioral trait — that each returned topic carries a serviceCode in 'SERVICIO-TEMA' format — but says nothing about it being a read-only operation, the return shape, ordering, or whether the catalog is static.

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

Conciseness4/5

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

Two compact sentences with no padding, leading with the resource and then the key payload detail (serviceCode). Efficient, though the opening noun phrase is slightly opaque.

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 zero-parameter listing tool with no output schema, the description only partially covers the return contract: it explains the serviceCode convention but not the category fields, count, or ordering an agent would receive.

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 baseline is 4; there is nothing for the description to clarify beyond the schema, which is already complete at 100% coverage for an empty object.

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

Purpose3/5

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

The description names the resource ('Servicios y temas de avisos (categorías municipales)') and implies enumeration, but never states the action of listing or how it differs from the sibling tools get_category and suggest_categories. An agent can infer the domain but must guess the exact behavior relative to its siblings.

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?

It hints at the downstream use case by noting each topic's serviceCode 'SERVICIO-TEMA' is used 'para crear avisos', which implicitly points to create_aviso. However, it gives no explicit when-to-use, when-not, or comparison against get_category/suggest_categories.

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

my_avisosC

Comunicaciones del comunicante (filtra por su teléfono/email guardados; se pueden sobrescribir para la llamada).

ParametersJSON Schema
NameRequiredDescriptionDefault
userEmailNo
userPhoneNo

TDQS

C2.6/5.0
Behavior2/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 of behavioral disclosure. It reveals that results default to the caller's saved phone/email and that these can be overridden, which is useful, but it says nothing about read-only vs. write semantics, permissions, ordering, or result format for a tool with zero annotation coverage.

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 sentence that front-loads the resource and then the filtering behavior. It is appropriately sized with little waste, though the parenthetical makes it slightly dense.

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

Completeness2/5

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

For a tool with no annotations and no output schema, the description is too thin: it never states the operation type, what an 'aviso' contains, ordering/pagination, or the return shape. The agent is left to infer most of what it needs to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate, and it partially does: it explains that userPhone/userEmail act as filters based on saved values and that they can be overridden per call. It still omits expected formats and whether both are optional, but it adds real meaning beyond the bare schema.

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

Purpose3/5

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

The phrase 'Comunicaciones del comunicante' identifies the resource (the caller's communications/avisos) but uses a noun phrase with no explicit verb, so the agent must infer that this is a retrieval/list operation. It does distinguish the tool from the create_* siblings by scoping to the caller's own records, but the action itself is only implied by the filtering clause.

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 tool versus create_aviso, create_aviso_from_photo, or any sibling. The only usage hint ('se pueden sobrescribir para la llamada') explains parameter override behavior rather than selecting this tool over an alternative. No exclusions or prerequisites are given.

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

reverse_geocodeA

Calle y portal cercanos a unas coordenadas WGS84 (lon/lat, p.ej. del GPS de la foto).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes

TDQS

A3.6/5.0
Behavior3/5

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 input convention (lon/lat order, WGS84) and the shape of the result (nearest street plus portal), but says nothing about no-match behavior, result precision, or whether a single or multiple candidates are returned.

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 with the resource, the coordinate convention, and a concrete use case, all front-loaded with no filler.

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 two-parameter read tool with no output schema, the description covers the inputs and the gist of the return value, but leaves the response format and failure cases undefined. It is adequate but not fully self-contained.

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 description coverage is 0%, and the schema itself only labels both parameters as bare numbers. The description compensates by fixing the argument order (lon first, then lat) and the coordinate system (WGS84), which is exactly the information an agent would otherwise guess wrong.

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 resource and scope: it returns the nearest street and street number for a set of coordinates, and it names the coordinate system (WGS84). Combined with the tool name, an agent can distinguish it from forward-looking siblings like search_street, though the description never uses an explicit verb such as 'returns' or 'finds'.

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?

Usage is only implied via the example '(p.ej. del GPS de la foto)', which hints at the photo-geotagging scenario. There is no explicit statement of when to prefer this over search_street or what to do when coordinates are unknown or outside coverage.

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

search_streetB

Busca una calle en el callejero municipal. Devuelve candidatos con TECA_COD_CALLE, portales (TEPO_DIR_PORTAL), barrio/distrito y coordenadas X/Y del portal.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesnombre de la calle (p.ej. 'Gran Via')

TDQS

B3.4/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 usefully discloses that the tool returns multiple candidates (plural implies fuzzy/partial matching) and enumerates the returned fields, but gives no read-only confirmation, matching tolerance (accents, abbreviations), or result limits.

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

Conciseness5/5

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

Two tightly-packed sentences: the purpose leads, the return shape follows. Nothing is wasted and the ordering is front-loaded.

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

Completeness4/5

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

With no output schema and no annotations, the description compensates by listing the return fields (TECA_COD_CALLE, portales, barrio/distrito, X/Y), which an agent needs to interpret results. It leaves only minor gaps around matching behavior and authentication context.

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?

Only one parameter, fully documented in the schema (100% coverage) with an example ('Gran Via'). The description adds no formatting guidance beyond the schema, so 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 in Spanish: 'Busca una calle en el callejero municipal' (searches a street in the municipal street directory), and the second sentence enumerates the returned fields. It is clear what the tool does, though it never explicitly contrasts itself with the nearby reverse_geocode sibling.

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 indication of when to use this tool versus alternatives such as reverse_geocode (coordinate-based lookup) or other search tools. It also doesn't state prerequisites for getting useful results (e.g., partial vs. exact street names).

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

set_identityA

Guarda la identidad del comunicante (se pregunta UNA vez tras la instalación y se reutiliza). Valida: nombre y primer apellido obligatorios; teléfono o email obligatorios.

ParametersJSON Schema
NameRequiredDescriptionDefault
langYesidioma de las comunicaciones
nameYesnombre
apellido1Yesprimer apellido
apellido2Nosegundo apellido (opcional)
userEmailNoemail (obligatorio si no hay teléfono)
userPhoneNoteléfono de 9 dígitos (obligatorio si no hay email)

TDQS

A4/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 behavioral burden. It discloses validation rules (name and first surname required; phone or email required) and the reuse pattern, but omits authentication requirements, error behavior, and whether calling it again updates existing data.

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

Conciseness5/5

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

Two tight sentences: the first states purpose and usage context, the second lists validation constraints. Front-loaded and free of 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?

For a mutation tool with no annotations and no output schema, the description covers purpose, validation, and basic usage context. It lacks details on permissions and update semantics, but is largely sufficient for correct invocation.

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 baseline is 3. The description restates the required fields and the conditional phone/email requirement, which is already documented in the schema, adding no new syntax or format details.

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?

States a specific verb ('Guarda') and resource ('identidad del comunicante'), clearly distinguishing it from the sibling get_identity. The added note on being asked once after installation further specifies the intended use.

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

Usage Guidelines4/5

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

Provides clear context: it is asked once after installation and reused, implying a one-time setup call. However, it does not explicitly mention alternatives like get_identity 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.

suggest_categoriesB

Sugiere serviceCodes por palabras (p.ej. 'cartones apilados en acera').

ParametersJSON Schema
NameRequiredDescriptionDefault
hintNo

TDQS

B3.2/5.0
Behavior2/5

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 does not say whether results are ranked/scored, whether it is a read-only suggestion vs. an assignment, whether auth is required, or how many codes come back — real gaps for a tool whose whole output is a suggestion set.

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?

One tight sentence with the purpose front-loaded and the example appended, no filler. It is slightly under-specified rather than over-long, so length itself is not the problem.

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 tool with no output schema and no annotations, the description conveys the core idea (free text in, serviceCodes out) but omits the shape of the response and the exact nature of the hint, leaving the agent to guess at call details.

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 0% and the single 'hint' parameter has no schema description, so the description must compensate. It partially does by stating the input is free-text words and giving an example, but it does not clarify language, length, or whether keywords or full sentences are expected.

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 (sugiere/suggests) and resource (serviceCodes) along with the input modality (por palabras). It clearly describes a lookup-by-free-text purpose, though it never differentiates itself from the related list_categories/get_category siblings.

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 concrete example ('cartones apilados en acera') implies when the tool is useful — when the agent has a descriptive free-text hint rather than a known code — but there is no explicit when-to-use statement or routing against list_categories or search_street.

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. 12 tool updatesv0.1.1
    • First observedattach_photo
    • First observedcheck_auth
    • First observedcreate_aviso
    • First observedcreate_aviso_from_photo
    • First observedget_category
    • First observedget_identity
    • First observedlist_categories
    • First observedmy_avisos
    • First observedreverse_geocode
    • First observedsearch_street
    • First observedset_identity
    • First observedsuggest_categories

TDQS

B3.4/5.0

Scored across 12 tools

Disambiguation4/5

Most tools target distinct resources/actions (identity get/set, category list/get/suggest, street search vs coordinate reverse-geocode). The main overlap is create_aviso vs create_aviso_from_photo, which both create reports but differ by photo workflow, so some misselection is possible. get_category vs list_categories vs suggest_categories are also related but have distinguishable purposes.

Naming Consistency4/5

Almost all tools follow a consistent verb_noun snake_case pattern (check_auth, get_identity, set_identity, list_categories, create_aviso, attach_photo). The main deviation is 'my_avisos' (noun-only, no verb) and the mixed English/Spanish vocabulary (categories vs avisos), but readability stays high.

Tool Count5/5

12 tools is well within the ideal 3-15 range and each one covers a distinct facet of the reporting workflow (auth, identity, categories, geocoding, listing, creating, photo attachment). No obvious filler or redundant tools bloat the set.

Completeness3/5

The surface covers auth, identity, categories, geocoding, listing, creation, and photo attachment, but lacks lifecycle operations: no get_aviso for a single report's detail/status, no update/edit, and no cancel/delete. Agents can create and list but cannot inspect or modify an individual aviso, which is a notable gap.

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
    256 npm
    MIT