Skip to main content
Glama
noemartinezoptima

mcp-bd-readonly

mcp-bd-readonly

Servidor MCP (Model Context Protocol) de solo lectura sobre una base de datos MySQL (esquema back). Expone herramientas para consultas de inventario/facturación sin ningún acceso de escritura.

Módulo autocontenido: este servidor es solo MySQL (back). No depende de zero-teams-mcp (Teams/Graph) ni de ningún otro MCP. En configs de cliente se registra de forma independiente; activar/desactivar otros MCPs no lo afecta.

Seguridad: combinación de barreras

  1. Parser en MCP (security.py) — toda query pasa por enforce_read_only() en QueryExecutor.run() antes de abrir conexión. Veta insert|update|delete|drop|truncate|alter|replace|create|grant|revoke|rename en cualquier statement (incluye statements encadenados con ; y precedidos por comentarios). Solo SELECT / SHOW / DESCRIBE / DESC / EXPLAIN / WITH.

  2. Driver sin multi-statement (pymysql) — CLIENT.MULTI_STATEMENTS desactivado por defecto: siquiera SELECT 1; SELECT 2 es rechazado por el driver (1064) antes de llegar a MySQL. Un SELECT 1; DROP TABLE x además lo veta el parser.

  3. Usuario MySQL dedicado de solo lectura — con GRANT SELECT únicamente sobre back.*, conecta por TCP 127.0.0.1:3306 (vía túnel SSH al host configurado en TUNNEL_HOST). Cualquier UPDATE/INSERT/DELETE falla incluso si el parser se evadiera: ERROR 1142 (42000): UPDATE command denied to user '...'@'localhost'. Verificado contra la BD real.

Si el parser falla, MySQL niega; si MySQL falla, el parser niega. Sin usuario de escritura configurado.

Related MCP server: MySQL MCP Server

Requisitos

  • Python 3.10+ (venv en .venv)

  • Acceso SSH al host remoto de MySQL (alias db-host en ~/.ssh/config, configurable con SSH_HOST / TUNNEL_HOST)

  • ~/.zt-readonly.env (modo 600) con las credenciales:

    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=13306
    MYSQL_DB=back
    MYSQL_USER=back_readonly
    MYSQL_PASSWORD=...
    DATA_DIR=./data
    TUNNEL_HOST=db-host

    No se invalida si el archivo no existe; las variables de entorno MYSQL_*/DATA_DIR/TUNNEL_HOST ganan sobre el archivo. En Windows el archivo cae en %USERPROFILE%\.zt-readonly.env.

Soporte Windows: el código es portable (pathlib + pymysql + os.environ, sin rutas Unix). Diferencias: entry point en .venv\Scripts\mcp-bd-readonly.exe, túnel con scripts/tunnel.ps1. Instrucción completa para Claude en SETUP-WINDOWS.md.

Uso

  1. Preparar SSH (solo una vez, antes del primer túnel). Si no existe la clave ~/.ssh/id_ed25519 ni el host db-host en ~/.ssh/config, genera ambos automáticamente — solo pide tu email:

    bash scripts/setup-ssh.sh

    Configura los valores reales con SSH_HOST/SSH_HOSTNAME/SSH_KEY/SSH_USER (o defaults en ~/.ssh/config). Al final imprime la clave pública para añadirla al servidor (1 paso manual). Verificado: ssh db-host 'echo OK'.

  2. Ejecutar el servidor MCP (stdio). El túnel SSH se gestiona solo: si 127.0.0.1:13306 no responde, el MCP lanza ssh -N -L 13306:127.0.0.1:3306 db-host como subproceso y lo cierra al terminar:

    .venv/bin/mcp-bd-readonly                # macOS/Linux
    .venv\Scripts\mcp-bd-readonly.exe        # Windows

    Para arranque manual previo del túnel (opcional, si quieres voz propia sobre la conexión):

    scripts/tunnel.sh            # macOS/Linux
    scripts\tunnel.ps1           # Windows

El host SSH a usar por el auto-túnel se configura con TUNNEL_HOST (default: host en ~/.zt-readonly.env o db-host).

Herramientas

Núcleo (Tabularis):

  • list_databases — bases visibles

  • list_tables(schema?) — tablas de un schema (default back)

  • describe_table(table) — columnas de una tabla

  • run_query(query, limit=100) — SELECT/SHOW/DESCRIBE libre con límite. Query correctas verificadas contra BD real: SELECT (con JOIN, WHERE, GROUP BY, subqueries, UNION), WITH (CTE), SHOW TABLES, DESCRIBE/DESC, EXPLAIN SELECT, y consultas precedidas por comentarios --. EXPLAIN UPDATE pasa el parser pero lo niega MySQL (1142, barrera #3). El LIMIT se inyecta en SQL solo para SELECT/WITH de un statement; para SHOW/DESCRIBE trunca en Python tras traer filas.

Finanzas:

  • facturas_venta(fecha_desde, fecha_hasta, cliente?) — facturas y total del periodo (Decimal exacto + formato es-ES 1.234,56 €)

  • resumen_iva(trimestre, anio) — base/IVA/total del trimestre

  • remesas_pendientes(max_n=50) — efectos de pago sin pagar, por fecha_vencimiento ASC (límite max_n) + total de pendientes. fecha_vencimiento puede ser null en BD real (efectos sin vencimiento).

  • cuadre_factura(factura_id) — comprueba que la suma de líneas == total de cabecera. Factura inexistente → ok:false, exists:false.

Auditoría:

  • conciliar_remesas() — total emitido vs acreditado (fecha_pagado IS NOT NULL)

  • saldos_cliente(cliente_id) — facturado vs cobrado (vía vista_efectos_pago) y pendiente

  • excepciones(fecha_desde, fecha_hasta, umbral) — facturas sobre umbral clasificadas por materialidad

  • informe_financiero(fecha_desde, fecha_hasta) — informe Markdown + CSV (;)

Aritmética

Todo el dinero es Decimal (nunca float). Sumas exactas con quantize(0.01, ROUND_HALF_UP); strings es-ES separador de miles . y decimal ,.

Auditoría de acceso

Cada llamada a tool registra una línea JSON en data_dir/audit.jsonl (DATA_DIR). No contiene credenciales.

Available Tools

13 tools
conciliar_remesasC

Total emitido vs acreditado de remesas (pago = fecha_pagado)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/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 discloses one useful semantic rule (pago = fecha_pagado) but says nothing about whether the operation is read-only, what permissions it needs, or whether it aggregates/mutates anything. For a zero-annotation tool this is a substantial gap.

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 compact line with no filler, and the key concept (emitido vs acreditado) is front-loaded. Points are withheld only because the terse phrasing borders on cryptic rather than self-explanatory.

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?

With no output schema, no annotations, and no parameters, the description is the only source of information about this tool, and it does not explain the returned shape, granularity, or scope. For a reconciliation/aggregation tool this leaves an agent under-informed.

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 per the rubric the baseline is 4. The parenthetical rule about pago/fecha_pagado adds a small amount of semantics but there are no parameters to clarify.

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 (remesas) and the comparison it performs (total emitido vs acreditado), which is more specific than a tautology. However, it is a noun phrase with no verb, so an agent cannot be fully certain whether this triggers a computation, returns a report, or mutates data. It is distinguishable from siblings like remesas_pendientes, but only by inference.

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, when not to, or which sibling (e.g. remesas_pendientes, cuadre_factura) it replaces. Usage is only implied by the name and the brief computation described.

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

cuadre_facturaC

Comprueba que la suma de líneas == total de cabecera

ParametersJSON Schema
NameRequiredDescriptionDefault
factura_idYes

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 behavioral burden. It confirms a validation action but does not state whether the tool is read-only, what permissions are needed, what it returns, or how failures are reported.

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 front-loaded sentence with no wasted words. It is appropriately terse, though its brevity reflects missing detail rather than strong conciseness.

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 one-parameter validation tool with no annotations or output schema, the description is incomplete. It states the check but omits parameter meaning, return behavior, and any operational context.

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

Parameters1/5

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

Schema description coverage is 0% and there is one parameter, factura_id, which the description never mentions. It does not explain what the parameter identifies or how it should be supplied, so it fails to compensate for the schema gap.

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 (Comprueba) and validation rule (suma de líneas == total de cabecera), so the agent can understand what the tool does. It does not distinguish this tool from siblings such as facturas_venta or resumen_iva, 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?

Gives no explicit guidance on when to use this tool versus alternatives. The purpose implies it is for invoice consistency checking, but there is no when/when-not context or routing to sibling tools.

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

describe_tableC

Columnas y tipos de una tabla (DESCRIBE).

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYes

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 behavioral burden. It implies a read-only metadata operation via '(DESCRIBE)', but never states that it is non-mutating, what permissions are required, or whether it errors on missing tables. For a tool with zero annotation coverage this is a notable gap.

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 terse sentence with no waste; the resource is front-loaded. It is efficient, though the brevity tips toward under-specification given the 0% schema coverage.

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 read operation with no output schema, the description minimally covers intent and return content. It stops short of naming the table identifier format or distinguishing itself from list_tables, which an agent working among many SQL siblings would need.

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

Parameters2/5

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

Schema description coverage is 0% and the single required parameter 'table' is undocumented in both schema and description. The word 'tabla' in the description loosely implies the subject, but no format (qualified name, schema.table) or identifier expectations are given.

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 states the tool's output (columns and types of a table) and mirrors the name's verb via '(DESCRIBE)', so the resource and result are identifiable. However, it does not differentiate from the sibling list_tables, leaving the agent to infer that this describes structure rather than enumerating names. Purpose is discernible but vague on scope.

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 guidance on when to use this versus list_tables or run_query. No preconditions, no mention of whether it works on views or requires prior database selection. The agent must guess from the name alone.

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

excepcionesC

Facturas sobre umbral clasificadas por materialidad

ParametersJSON Schema
NameRequiredDescriptionDefault
umbralYes
fecha_desdeYes
fecha_hastaYes

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 entire behavioral burden. It does not state whether this is a read-only operation, how results are ordered or returned, whether pagination applies, or what happens at the threshold boundary. Only the classification-by-materiality behavior is disclosed.

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

Conciseness3/5

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

A single front-loaded phrase with no filler, but its brevity tips into under-specification rather than efficient conciseness given three required parameters.

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 three-parameter tool with no annotations, no output schema, and no parameter descriptions, the definition is too thin to call confidently. Dates, threshold semantics, and the shape of the returned classification are all left to guesswork.

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

Parameters2/5

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

Schema description coverage is 0% for all three required parameters. The description hints that 'umbral' acts as an upper/lower cutoff and implies a date scope, but it never explains the expected date format, inclusivity, or units for the threshold, leaving fecha_desde and fecha_hasta effectively undocumented.

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 phrase names a concrete resource (facturas) with a filter condition (sobre umbral) and an organizing dimension (materialidad), so an agent can infer it returns invoices above a threshold grouped by materiality. It lacks an action verb and does not distinguish itself from siblings like facturas_venta or cuadre_factura, 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 indication of when to choose this tool over the many sibling reporting tools (facturas_venta, cuadre_factura, resumen_iva). Usage must be inferred purely from the noun phrase, with no exclusions or alternatives named.

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

facturas_ventaC

Facturas en un rango de fechas (max_n filas, default 200) + total_periodo exacto

ParametersJSON Schema
NameRequiredDescriptionDefault
max_nNo
clienteNo
fecha_desdeYes
fecha_hastaYes

TDQS

C2.9/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 disclosure burden, and it does add one genuinely useful behavioral fact beyond the schema: the row list is capped at max_n (default 200) while total_periodo stays exact, so truncation does not corrupt the total. It says nothing about permissions, date format expectations, or what happens when the range spans many invoices.

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 telegraphic fragment with no filler, and the most decision-relevant facts (date range, row cap, exact total) are front-loaded. It is under-specified rather than padded, which is a completeness problem more than a conciseness one.

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?

No output schema, no annotations, and 0% parameter coverage mean the description is the only source of information, yet it omits the cliente filter, date format, and any note on what each returned row contains. For a four-parameter financial query tool this leaves an agent guessing before invocation.

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

Parameters2/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 only partially does: it covers the date range and gives max_n's default, but the 'cliente' parameter is never mentioned and no date format is specified for fecha_desde/fecha_hasta, leaving two of four parameters ambiguous.

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 resource (facturas de venta) and scope (a date range) are stated concretely, plus the notable fact that it also returns an exact period total, so an agent can tell this is a filtered list-plus-aggregate call. There is no explicit verb and nothing that distinguishes it from siblings like resumen_iva or cuadre_factura.

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?

The description never says when to choose this tool over the twelve siblings, nor any prerequisite such as whether cliente filtering is optional or when the returned total should be trusted over resumen_iva. Usage must be inferred entirely from the name and the date-range phrasing.

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

informe_financieroC

Informe Markdown + CSV(;) de un periodo (max_n filas, default 200)

ParametersJSON Schema
NameRequiredDescriptionDefault
max_nNo
fecha_desdeYes
fecha_hastaYes

TDQS

C2.9/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the burden. It does disclose useful behavior: output formats (Markdown and semicolon-delimited CSV) and a row cap via max_n with default 200. It still omits whether the operation is read-only, what permissions are needed, and whether it aggregates or streams data.

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 compact sentence that front-loads output formats and the period scope. It avoids filler and repetition, though its extreme brevity contributes to the gaps in other dimensions.

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?

Given no annotations, no output schema, and 0% schema coverage, the description is too sparse. It provides output-format and row-limit hints, but leaves the required date semantics, report contents, and safety profile undefined for an agent to invoke the tool reliably.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate. It explains max_n as the row limit with default 200, but it says nothing about the required fecha_desde and fecha_hasta parameters beyond 'de un periodo', leaving date format and expected values ambiguous for two required inputs.

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 that the tool produces a Markdown + CSV(;) financial report for a period, which is a clear verb ('Informe' implies report generation) and resource. It does not, however, differentiate the report from siblings like resumen_iva or saldos_cliente, so an agent cannot tell exactly what financial content it returns.

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 explicit when-to-use guidance or mention of alternatives among the many sibling tools. Usage is only implied by the tool name and the phrase 'de un periodo', leaving the agent to guess when this report is preferred over resumen_iva, facturas_venta, or saldos_cliente.

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

list_databasesB

Lista las bases de datos disponibles (SHOW DATABASES).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 burden. It implies a read-only enumeration with no parameters, but does not state that it is side-effect-free, anonymous, or whether it returns all databases or a filtered subset. For a trivial listing this is acceptable, but the safety profile is only inferred from 'Lista'.

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 short sentence that front-loads the action and resource, with the SQL hint compactly reinforcing meaning. No waste.

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, low-complexity listing the definition is nearly sufficient, but with no annotations and no output schema it never describes what the return looks like (e.g., a list of database names). It is adequate rather than 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 tool takes zero parameters, so per the baseline there is nothing for the description to compensate for. It adds nothing beyond the schema, but nothing is needed.

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 ('Lista') and resource ('las bases de datos disponibles'), and the parenthetical SQL equivalent (SHOW DATABASES) confirms the operation. It does not explicitly differentiate itself from siblings like list_tables, though the resource noun makes the distinction largely self-evident.

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 explicit when-to-use, when-not-to-use, or alternative guidance. Usage is only implied by the natural pairing of the name with the SQL hint; nothing tells the agent how this routes versus list_tables or describe_table.

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

list_tablesC

Lista las tablas de un esquema (default 'back').

ParametersJSON Schema
NameRequiredDescriptionDefault
schemaNoback

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 carries the full behavioral burden, yet it only implies a read operation via 'Lista'. It says nothing about return format, pagination, permissions, or the failure mode when an unknown schema is passed.

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 compact sentence with no waste and the key information front-loaded. It is appropriately sized for a simple listing tool, though slightly terse.

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 one-parameter read tool this is close to minimally viable, but with no annotations, no output schema, and 0% schema coverage, the description should say more about what is returned and how it relates to sibling tools.

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%, so the description must compensate. It identifies the param's meaning (which schema's tables) and its default 'back', but the default is already declared in the schema, so the added value is marginal.

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 ('Lista las tablas de un esquema'), so an agent knows exactly what it returns. It does not explicitly differentiate itself from siblings like list_databases or describe_table, but the resource is distinct enough to be inferred.

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?

The description gives no guidance on when to choose this tool over list_databases or describe_table, nor any preconditions for use. The only contextual hint is the default schema name, which is not usage guidance.

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

remesas_pendientesC

Efectos pendientes (últimos por vencimiento, max_n límite) y total

ParametersJSON Schema
NameRequiredDescriptionDefault
max_nNo

TDQS

C2.9/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 some behavior: results are ordered by due date and an aggregate total is included. It says nothing about read-only safety, permissions, pagination beyond max_n, or what the total represents, so coverage is only partial.

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 compact parenthetical covering ordering, limit, and total — front-loaded with no filler. It is terse to the point of under-specification, but nothing is wasted.

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 list tool with no output schema and no annotations, the description conveys the essentials (what is returned, ordering, cap, total). It is still silent on usage context and the meaning/safety of the operation, leaving moderate 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 coverage is 0% for the single parameter, but the description does explain its role by labeling max_n as a limit on returned items. That is useful, though the schema's title 'Max N' and default of 50 already convey most of this, so added value is marginal.

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 a specific resource ('Efectos pendientes') and states the ordering and the aggregated total it returns, so the agent can infer it is a pending-items listing. However, there is no explicit verb and nothing that distinguishes it from related siblings such as conciliar_remesas, so purpose is only partially pinned down.

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 when-to-use or when-not-to-use guidance, and no sibling is named as an alternative despite several closely related tools (conciliar_remesas, facturas_venta, excepciones) in the toolset. The agent must infer usage context entirely from the tool name.

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

resumen_ivaC

Base/IVA/Total de un trimestre (anio + trimestre 1-4)

ParametersJSON Schema
NameRequiredDescriptionDefault
anioYes
trimestreYes

TDQS

C2.9/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. It reveals the return metrics but says nothing about data scope (which company/ejercicio, all invoices or a subset), permissions, or whether the figures are cached or computed live — significant gaps for a financial summary tool.

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 compact line with the key constraint parenthesized at the end; nothing is redundant. It is terse to the point of under-specification, but that is a completeness issue rather than padding.

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 annotations and no output schema, the description covers the essentials (inputs and the three output figures) but omits the calculation's data scope and the year format. It is minimally viable, 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 coverage is 0%: both parameters have only a title and no description or enum. The description compensates for one of them by supplying the valid range for 'trimestre' (1-4), which the schema does not encode, but it adds nothing for 'anio' (format, valid range, or default).

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 the resource (a quarter's IVA) and the three outputs it produces (Base/IVA/Total), which is enough to distinguish it from siblings like facturas_venta or informe_financiero. The verb is implicit rather than stated ('compute/get'), but the domain and scope are unambiguous.

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 versus informe_financiero, cuadre_factura, or saldos_cliente. The parameter list implies a quarterly tax-reporting use case, but that is inference, not guidance, and there are no prerequisites or exclusions stated.

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

run_queryB

SQL solo-lectura; devuelve {columns, rows} (JSON). limit clamp filas (default 100; 0=sólo conteo, None=todo).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

B3.2/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 does disclose the important traits: the query is read-only (safety profile), the return shape is {columns, rows}, and limit is clamped with special values. It omits error behavior, statement restrictions (single statement? dialect?), timeouts, and permission requirements, so it is only partially transparent.

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 zero filler; the read-only fact and return shape come first, limit semantics second. It is arguably over-terse for a 0%-coverage schema, but nothing is wasted.

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?

There is no output schema, and the description does cover the return shape, which is the main thing an agent needs. However, for a raw SQL execution tool with no annotations and 0% parameter documentation, the absence of dialect, permission, statement-count, and error-handling details leaves real 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 coverage is 0%, so the description must compensate. It does well for limit, specifying clamping, default 100, 0 = count only, and None = all rows — genuinely more than the bare integer schema. The query parameter itself is only implied by 'SQL solo-lectura'; no dialect, statement count, or format guidance is given.

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: executes read-only SQL and returns {columns, rows} as JSON. This distinguishes it from report-style siblings in kind (generic query vs. canned report), but it never explicitly contrasts itself with facturas_venta, resumen_iva, or the other domain tools, so the boundary is left to inference.

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 when-to-use guidance. With twelve siblings including several canned financial reports and a describe_table tool, the agent gets no signal about when to reach for ad-hoc SQL versus a purpose-built report tool, nor any prerequisite or exclusion.

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

saldos_clienteC

Facturado vs cobrado y pendiente de un cliente

ParametersJSON Schema
NameRequiredDescriptionDefault
cliente_idYes

TDQS

C2.4/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, and it discloses almost nothing beyond the calculation subject — no indication that it is read-only, no permission requirements, no note on whether figures are period-scoped or how they are aggregated.

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

Conciseness3/5

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

It is a single compact phrase with no wasted words and the subject is front-loaded, but the brevity reflects under-specification rather than efficient communication.

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?

With no annotations, no output schema, and an undocumented required parameter, this fragment leaves an agent without enough information to know what the tool returns or how to call it beyond supplying a client ID.

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

Parameters2/5

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

Schema description coverage is 0% for the single required parameter cliente_id, so the description must compensate and does not: it never mentions the parameter, its type, or how to identify a client. Only the phrase 'de un cliente' loosely implies a client scope.

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 identifies the resource (a client's balances) and the metrics computed (invoiced vs collected vs pending), which is more than a tautology. However, no verb frames the operation, and nothing distinguishes it from siblings like facturas_venta, cuadre_factura, or informe_financiero, so it is only minimally clear.

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 guidance on when to use this tool instead of facturas_venta, cuadre_factura, or the other financial siblings. Usage can only be inferred from the resource name, and no prerequisites or exclusions are stated.

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

setup_sshB

Prepara SSH para el túnel de BD: genera clave ed25519 si falta, añade el host al config, y devuelve la clave pública lista para Forge.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo

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 discloses primary side effects: conditional key generation, SSH config modification, and returning a public key. However, it omits permissions required, file locations, whether existing config is overwritten or backed up, and other operational details that an agent would need for safe invocation.

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 purpose and then lists the concrete actions. There is no redundant or filler text; every clause adds information.

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 setup tool with no output schema and no annotations, the description covers the main actions and return value. It is incomplete in two important ways: it does not explain the optional email parameter, and it does not disclose prerequisite permissions or config-file behavior. An agent can still call it without email, but the definition is not fully self-sufficient.

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

Parameters1/5

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

There is one optional parameter (email), and schema description coverage is 0%. The description never mentions the email parameter or what it controls, so it fails to compensate for the schema gap. An agent cannot tell whether or why to pass this argument.

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 and resource: prepares SSH for a DB tunnel. It then enumerates the exact actions (generate ed25519 key if missing, add host to config, return public key ready for Forge), which clearly distinguishes it from all database-query and financial 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 description implies usage context (setting up SSH for a database tunnel and Forge integration) but does not explicitly say when to use this tool versus alternatives, nor does it state prerequisites or exclusions. The implied context is enough for a basic call but leaves the agent to infer the calling situation.

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. 13 tool updatesv0.1.0
    • First observedconciliar_remesas
    • First observedcuadre_factura
    • First observeddescribe_table
    • First observedexcepciones
    • First observedfacturas_venta
    • First observedinforme_financiero
    • First observedlist_databases
    • First observedlist_tables
    • First observedremesas_pendientes
    • First observedresumen_iva
    • First observedrun_query
    • First observedsaldos_cliente
    • First observedsetup_ssh

TDQS

C2.9/5.0

Scored across 13 tools

Disambiguation3/5

Generic DB tools (list_databases, list_tables, describe_table, run_query) are clearly distinct, but several domain-report tools overlap: facturas_venta, excepciones, and informe_financiero all operate on invoices over periods, and cuadre_factura, conciliar_remesas, and saldos_cliente all touch reconciliation/balance concerns. Descriptions help differentiate but boundaries remain fuzzy.

Naming Consistency3/5

All names use snake_case, which is consistent, but the set mixes English generic verbs (list_databases, run_query, describe_table, setup_ssh) with Spanish noun-phrase domain tools (facturas_venta, resumen_iva, saldos_cliente, excepciones). Verb_noun and bare-noun patterns are intermixed without a clear rule.

Tool Count4/5

13 tools is a reasonable, well-scoped set: four generic DB primitives plus eight domain reports and one setup helper. Nothing feels redundant enough to trim, though setup_ssh sits slightly apart from the read-only query purpose.

Completeness4/5

The read-only surface covers discovery (databases/tables/columns), ad-hoc querying, and the main financial reporting workflows (invoices, VAT, remittances, reconciliation, balances, exceptions, reports). A generic export or trend/aggregation helper is missing, but run_query provides a solid fallback.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables safe interaction with MySQL databases through SELECT queries, table structure inspection, and database schema exploration. Provides read-only access to query data and examine database metadata.
    1
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides read-only access to MySQL databases, enabling schema exploration, table inspection, and safe SELECT query execution via MCP.
    1
    -
  • F
    license
    A
    quality
    A
    maintenance
    Security-hardened, read-only MySQL MCP server that enables safe, read-only access to MySQL databases for running SELECT queries, exploring schemas, and sampling data via MCP clients.
    9
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables read-only SQL querying and schema inspection across MSSQL, PostgreSQL, and MySQL databases via MCP tools.
    -