laspalmas-avisos-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@laspalmas-avisos-mcpreporta una farola apagada en la calle Mayor, te paso la foto"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
laspalmas-avisos-mcp
Servidor MCP (y CLI de apoyo) para el sistema de avisos del Ayuntamiento de Las Palmas de Gran Canaria (LPGC Tu Ciudad / LPGC Avisa). Permite a un agente listar servicios y categorías, consultar avisos y crear avisos con inteligencia artificial — incluso desde una foto. La clave de app va integrada (es la de la propia app, pública en el APK).
La finalidad de este proyecto es hacer más fácil que los ciudadanos puedan reportar problemas al Ayuntamiento. Saca una foto de la incidencia (una papelera llena, una acera rota, una farola apagada…), pásasela al agente pidiéndole que genere un aviso para que describa el problema, seleccione servicio y categoría, añada la ubicación y lance el aviso al Ayuntamiento.
Inicio rápido
Las Palmas no usa cuentas: el API acepta la clave fija de la app y cada aviso lleva el email y teléfono del comunicante.
Añade el servidor a tu cliente MCP (ejemplos) o configúralo a mano:
{
"mcpServers": {
"laspalmas-avisos": {
"command": "npx",
"args": ["-y", "laspalmas-avisos-mcp"]
}
}
}Verifica:
list_servicesdebe devolver los 11 servicios.Pregunta al humano UNA vez su email (y teléfono) y guárdalos con la tool
set_identity. Se reutilizan en todos los avisos.Flujo del agente:
create_aviso_from_photo(foto → categoría → preview) → enseña el preview al humano →confirm: true+human_confirmed: true+preview_tokensolo con su "sí".
Todo corre en tu máquina; los avisos se crean con la identidad guardada.
Related MCP server: Smart Cities 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:3003/upload?filename=foto.jpg' # → {"file_id":"…","bytes":…}El preview devuelve
preview_image_base64(copia reducida) para visión y el envío usa siempre la original en base64.Local (stdio/CLI): pasa
image_path; el servidor lee y reduce sin que el modelo abra el fichero. O reduce tú connode 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/laspalmas-avisos # Hermes
cp -r skill ~/.claude/skills/laspalmas-avisos # Claude Code
# o descárgala: https://github.com/Naroh091/laspalmas-avisos-mcp/blob/main/skill/SKILL.mdInstálalo así (requiere Node 18+):
Sin credenciales: este MCP no necesita tokens ni cuentas. Solo el email y teléfono del humano (paso 3 del inicio rápido).
Instalación según tu cliente (comandos exactos): Claude Code (
claude mcp add … -- npx -y laspalmas-avisos-mcp), Hermes (hermes mcp add … --command npx … --args -y laspalmas-avisos-mcp) u OpenClaw (openclaw mcp add … --command npx --arg -y --arg laspalmas-avisos-mcp).Identidad: pregunta email y teléfono UNA vez y guárdalos con
set_identity(verifica conget_identity).Verifica (
mcp list/test/doctor --probesegún cliente): debes ver 8 tools.Uso: hay skill completa en
skill/SKILL.md. Lo esencial: solo incidencias genuinas;create_aviso_from_photoen fases (categoría → preview → envío solo con "sí" humano +confirm+human_confirmed+preview_token); foto porfile_id; la dirección es texto libre y las coordenadas van en el aviso.
Añadir el MCP vía npx
Requiere Node 18+.
Claude Code
claude mcp add laspalmas-avisos -- npx -y laspalmas-avisos-mcp
claude mcp list # verificarHermes
hermes mcp add laspalmas-avisos --command npx --args -y laspalmas-avisos-mcp
hermes mcp test laspalmas-avisos # verificar (lista las 8 tools)OpenClaw
openclaw mcp add laspalmas-avisos \
--command npx \
--arg -y \
--arg laspalmas-avisos-mcp
openclaw mcp doctor laspalmas-avisos --probe # verificarDesde código
npm install
npm run build
npx -y -p laspalmas-avisos-mcp laspalmas-avisos-mcp-http # HTTP en 127.0.0.1:3003/mcpHerramientas MCP
Tool | Qué hace |
| Identidad guardada (email, teléfono, uuid) o null. |
| Guarda email y teléfono (se preguntan una vez). |
| Servicios de LPGC Avisa (id + título). |
| Categorías de un servicio (id + título). |
| Sugiere servicio + categoría por palabras. |
| Avisos del email guardado (o el indicado). |
| Crea un aviso. Dry-run por defecto; |
| Aviso desde foto en fases: categoría → preview (GPS EXIF) y envío solo con |
Seguridad de envío
create_aviso es dry-run por defecto: devuelve el payload sin crear nada. Solo con
confirm: true hace el POST real — un aviso real que revisa personal municipal.
Envía únicamente incidencias reales.
create_aviso_from_photo exige confirmación humana en fases:
Categoría (sin
service_id/category_id): sugiere y no envía nada.Preview (
confirmausente/false): GPS EXIF (olat/lonmanuales), dirección en texto libre, payload +preview_token. No envía nada.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
node dist/cli.js services
node dist/cli.js categories 7
node dist/cli.js identity-set nombre@example.com 612345678
node dist/cli.js my-avisos
node dist/cli.js create 7 33 28.1235 -15.4363 "Calle Triana 1" -- "Papelera llena" # dry-run
node dist/cli.js create 7 33 28.1235 -15.4363 "Calle Triana 1" -- "Papelera llena" --send # ENVÍA de verdad
node dist/cli.js from-photo foto.jpg 7 33 "Papelera llena" # preview desde foto
node dist/cli.js prep-photo foto.jpg [foto-ligera.jpg] # reduce para el modelo, conserva EXIF/GPSServidor HTTP (opcional)
Por stdio cada uno corre su copia. La entrada HTTP sirve para exponer el servidor que corre en TU máquina para que un agente en OTRA máquina lo use.
export LASPALMAS_AVISOS_MCP_SECRET=<un-secreto-largo> # exige x-mcp-secret o Bearer
export LASPALMAS_AVISOS_ALLOWED_HOSTS=tu-host.tu-tailnet.ts.net # anti DNS-rebinding
npm run start:http # 127.0.0.1:3003/mcpVariables: LASPALMAS_AVISOS_HTTP_PORT (3003), LASPALMAS_AVISOS_HTTP_HOST (127.0.0.1),
LASPALMAS_AVISOS_HTTP_PATH (/mcp). Expón solo en red privada (p.ej. tailscale serve,
nunca funnel). Para persistencia, launchd/pm2/tmux o similar.
Arquitectura
src/client.ts— REST con clave+admin en query; POST JSON aentries.src/identity.ts— email/teléfono/uuid en JSON local (0600).src/avisos.ts— núcleo (servicios, categorías, mis avisos por email, creación conservice_id/category_id/address/description/lat/lon/photos).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 8 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
com.inventiaplus.laspalmasv3.1.0 + verificación en vivo de lecturas y dry-runs (sin crear avisos reales).
Licencia
AGPLv3. Ver LICENSE.
Available Tools
8 toolscreate_avisoA
Crea un aviso. 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 'identity'.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | latitud WGS84 | |
| lon | Yes | longitud WGS84 | |
| address | Yes | dirección en texto libre | |
| confirm | No | DEBE ser true para ENVIAR de verdad. Por defecto false = dry-run. | |
| identity | No | Sobrescribe la identidad guardada solo para esta llamada | |
| service_id | Yes | id de list_services (p.ej. 7 = Papeleras y contenedores) | |
| category_id | Yes | id de list_categories para ese servicio | |
| description | Yes | descripción del problema (texto que se publicará) | |
| image_paths | No | rutas locales a fotos (se mandan en base64) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does a good job disclosing the critical mutation gate: by default it is DRY-RUN and only returns the payload without creating anything, and confirm=true is required to actually send. It also notes that the saved identity is used unless overridden. It still omits auth requirements, rate limits, and error behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the core purpose and then immediately emphasize the critical dry-run caveat. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, a nested identity object, no annotations, and no output schema, the description adequately covers the dry-run default and identity handling. However, it does not explain what a successful real creation returns, error behavior, or how the many required fields relate to sibling listing tools, leaving meaningful gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already fully documented in the input schema. The description repeats the confirm and identity semantics but adds no new syntax, format, or edge-case meaning beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Crea un aviso') so an agent immediately understands it creates a notice report. It does not explicitly differentiate from the sibling create_aviso_from_photo, which is a clear alternative for creating a report from a photo, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives invocation guidance by explaining the dry-run default and that confirm=true is needed to actually create, which implies usage context. However, it never says when to choose this tool over alternatives like create_aviso_from_photo, leaving tool selection to inference.
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. Sin service_id/category_id → sugiere (need_category). Con todo → preview + preview_token SIN enviar. Envío: MISMOS campos + confirm:true + human_confirmed:true + preview_token (tras 'sí' humano). Sin las tres NO se envía. La foto viaja en el envío (base64).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | sobrescribe el GPS EXIF de la foto | |
| lon | No | sobrescribe el GPS EXIF de la foto | |
| address | No | ||
| confirm | No | true = ENVIAR de verdad (requiere preview_token + human_confirmed) | |
| file_id | No | VÍA PREFERIDA en remoto: id de PUT /upload | |
| identity | No | Sobrescribe la identidad guardada solo para esta llamada | |
| image_path | No | ruta local. Solo stdio/CLI en la máquina del servidor | |
| service_id | No | ||
| category_id | No | ||
| description | No | si falta, se pre-rellena y se marca para revisión | |
| image_base64 | No | ||
| category_hint | No | ||
| preview_token | No | ||
| human_confirmed | No | el humano vio el preview y dijo 'sí' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses the preview-then-send gating, that nothing is sent without all three flags, that the photo travels as base64 in the send call, and the need for human confirmation. This is exactly the kind of behavioral context annotations would otherwise supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and telegraphic but front-loaded with the workflow phases and free of filler; each clause carries routing or gating information. The compressed style costs some readability but wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, nested-object tool with no annotations and no output schema, the description covers the operationally critical path (upload, preview, confirmed send) thoroughly. Minor gaps remain on peripheral params (lat/lon override, identity override, category_hint), which the schema partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the description adds real meaning: it explains file_id's preferred-remote role, image_path's stdio-only constraint, the send-gating semantics of confirm/human_confirmed/preview_token, and that image_base64 travels in the send. It does not explain lat/lon/address/identity/category_hint, which remain schema-documented only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Aviso desde una FOTO') and immediately distinguishes itself from the sibling create_aviso by scoping to photo-based creation. The phased nature of the operation is named up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: preferred upload path (PUT /upload + file_id) vs stdio (image_path local), what happens without service_id/category_id (suggests, need_category), what happens with everything (preview, no send), and the exact conditions to actually send (confirm + human_confirmed + preview_token after human 'yes'). This is unusually complete when-to-use guidance.
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 guardada (email, teléfono, uuid) o null si aún no se preguntó.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the disclosure burden and does describe the return shape (identity fields or null), which is genuinely useful. It does not cover sensitivity/permissions of returning personal data or any other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste; it delivers the resource, the returned fields, and the null case in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no annotations or output schema, the description is nearly sufficient: it names the returned fields and the empty state. It would be stronger if it clarified what the null-prone state means for downstream calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description sensibly explains the returned data instead of inventing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Devuelve') and resource ('la identidad guardada') plus the exact fields returned (email, teléfono, uuid). The read semantics clearly separate it from the sibling set_identity, though that sibling is not named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the verb 'Devuelve' signals a read operation contrasted with set_identity, and the mention of 'null si aún no se preguntó' hints at the not-yet-collected state. There is no explicit when-to-use statement or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesC
Categorías de un servicio (id + título).
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about read-only nature, pagination, ordering, or auth requirements. For a list operation these traits matter, and only the vague noun phrase is offered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short phrase, front-loaded with the resource and with no filler. It is efficient, though so terse that it borders on under-specification rather than tight conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no annotations and no output schema, the description covers the resource and roughly the return fields. It still omits usage context and any behavioral traits, leaving meaningful gaps for an agent choosing among the seven siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. "De un servicio" does map implicitly to the service_id parameter (the service whose categories are returned), and "id + título" hints at the returned fields, but no format, type, or syntax detail is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource ("Categorías de un servicio") and even the return shape ("id + título"), so the agent knows it retrieves categories belonging to a service. However, the verb is only implied by the list_ prefix, and the description never distinguishes it from the sibling suggest_categories, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the closely related suggest_categories alternative. The agent must infer the context entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesC
Servicios de LPGC Avisa (id + título).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it discloses nothing about side effects, authentication, pagination, or ordering. The read-only nature is only weakly implied by the naming convention shared with sibling tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single compact fragment with no wasted words, but it is under-specified rather than truly concise, and it does not front-load an action verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (no params, no output schema), so the description must describe the return value; it hints at id + title but omits that a list of services is returned and gives no behavioral context at all.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline for this dimension is 4; there is no parameter semantics to clarify or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The fragment 'Servicios de LPGC Avisa (id + título)' merely restates the tool name's resource and adds the returned fields, with no verb to confirm it enumerates rather than creates or modifies services. It does not distinguish it from siblings like list_categories, which follow the same naming pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives such as list_categories, my_avisos, or get_identity. Usage can only be inferred from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_avisosC
Avisos del email guardado (o el indicado).
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| take | No | ||
| No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing. It does not state that the operation is read-only, that skip/take control pagination, what the result set looks like, or any auth requirements. Only the implicit 'fetch notices' framing suggests a safe read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and free of padding, which is good. But its brevity is under-specification rather than economy: the scope qualifier is present while the operation, pagination, and return shape are all absent. Efficient, but too thin to be called well-structured for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero annotations, 0% schema coverage, no output schema, and three undocumented parameters, the description should be doing the heavy lifting and instead does almost none. An agent cannot determine the operation type, paging behavior, or result format from this definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters. The description adds meaning only for 'email' (optional override of the saved account) and says nothing about 'skip' or 'take', whose pagination semantics are left entirely undefined. Two of three parameters remain opaque to the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys that the tool returns 'avisos' (notices) scoped to the saved email account or an explicitly supplied one, which is more than a bare restatement of the name. However, it uses a noun phrase with no verb, so an agent must infer that this is a retrieval/list operation rather than a creation or mutation. Sibling 'create_aviso' implies this is the read counterpart, but the description never says so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as create_aviso or create_aviso_from_photo. The parenthetical '(o el indicado)' hints that an email can be supplied instead of the default account, but that is parameter behavior, not usage guidance. An agent gets no routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_identityB
Guarda email y teléfono del comunicante (se preguntan UNA vez y se reutilizan; el uuid se genera solo).
| Name | Required | Description | Default |
|---|---|---|---|
| userEmail | Yes | email (identifica tus avisos) | |
| userPhone | No | teléfono español |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose two non-obvious traits: the UUID is auto-generated (so the agent must not supply one) and the values are persisted for reuse. But it omits overwrite/update semantics on repeat calls, validation failures, and persistence side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the core action front-loaded and the caveats parenthesized. Nothing is wasteful, though the dense parenthetical slightly compromises scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter write tool with no annotations and no output schema, the description covers what is stored and the once-only rule, which is the essential minimum. It still leaves ordering relative to create_aviso and repeat-call behavior unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented as 'email' and 'teléfono español'. The description adds only the reuse-once framing, which is not parameter-level syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource in Spanish: stores the communicant's email and phone. The implied save/read contrast with the sibling get_identity is reasonably inferable, though it is not named explicitly, so sibling differentiation is soft rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'se preguntan UNA vez y se reutilizan' implies this should be set once and reused across the session, which is useful usage context. However it never says when to call it relative to siblings like create_aviso, nor what happens if called again, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_categoriesB
Sugiere service_id + category_id por palabras (p.ej. 'contenedor desbordado').
| Name | Required | Description | Default |
|---|---|---|---|
| hint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It doesn't state that this is a non-mutating lookup, how many suggestions are returned, whether they are ranked or confidence-scored, or what happens when no match exists — all significant gaps for a suggestion/ambiguity-resolution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero filler; the action, output, and input modality are all front-loaded. Nothing could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and no schema descriptions, the description is the only documentation and it omits the return shape entirely — one suggestion or many, and in what structure. An agent cannot tell what it will receive back or how to consume it, so the definition is incomplete for this tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'hint' parameter has no schema description, so the description must compensate. It does partially: 'por palabras' clarifies the parameter is free text and the example 'contenedor desbordado' shows the expected granularity, but it doesn't say whether the hint is required or what language/format is accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (suggests) and the exact resources returned (service_id + category_id) plus the input modality (words), with a concrete example. It clearly distinguishes itself from list_services/list_categories, which enumerate rather than infer IDs from free text, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'por palabras (p.ej. ...)' implies the tool is for turning a free-text hint into IDs, which is an adequate contextual signal. However, it never says when to prefer this over list_categories, nor whether it should be called before create_aviso, so the routing decision 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
create_aviso - First observed
create_aviso_from_photo - First observed
get_identity - First observed
list_categories - First observed
list_services - First observed
my_avisos - First observed
set_identity - First observed
suggest_categories
TDQS
Scored across 8 tools
Tools generally target distinct resources and actions: identity get/set, service/category listing, category suggestion, aviso listing, and aviso creation. The main overlap is between create_aviso and create_aviso_from_photo, but the photo-specific workflow is clearly differentiated by description.
Most tool names follow a predictable snake_case pattern with verb_noun structure (get_identity, set_identity, list_services, create_aviso). The outlier my_avisos uses a possessive/noun phrase rather than a verb, but overall conventions remain readable and mostly consistent.
With 8 tools, the set is well-scoped for a municipal incident-reporting assistant. Each tool earns its place by covering identity, lookup, suggestion, listing, and creation workflows without excessive surface area.
Core lifecycle coverage exists: identity setup, service/category discovery, category suggestion, listing one's avisos, and creating avisos with or without a photo. Minor gaps include no explicit get_aviso detail or status tool and no update/cancel operation, though these may be outside the intended API scope.
Maintenance
Related MCP Connectors
Resolve any government entity worldwide and submit service requests. Open civic data for AI agents.
Provides access to Civic Plus - See Click Fix, allowing you to interact with your data via an LLM.…
Local government intelligence for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides access to real-time Winnipeg Transit data and 311 City Services, enabling AI assistants to plan trips, check bus arrivals, and search for reported city issues. It allows users to interact with city infrastructure data and transit schedules through natural language.81MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with IoT device data from a smart city, including public lighting, water, and gas meters. Supports querying and management via the Model Context Protocol.1MIT
- AlicenseAqualityBmaintenanceLets an AI agent query Yerevan's live municipal GIS data—air quality, cadastral parcels, zoning, construction, and transport—with no API key.247MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query Brazilian municipal transparency portals for payroll, expenses, contracts, bids, revenues, and legislation using natural language in Portuguese.MIT