ensmcp
ensmcp es un servidor MCP offline que pone las medidas de seguridad del ENS (Anexo II del RD 311/2022) y el cuestionario de auditoría de la CCN-STIC 808 al alcance de cualquier cliente MCP.
Explorar el Anexo II: listar categorías (
list_categories) y medidas con filtros por categoría, dimensión o nivel (list_measures), recuperar una medida por código exacto (get_measure) o buscar por texto en código, título, cuestionario y redacción del RD (search_measures).Preparar la Declaración de Aplicabilidad: valorar cada dimensión (confidencialidad, integridad, disponibilidad, autenticidad, trazabilidad) y obtener la categoría del sistema, las medidas exigibles, su nivel y sus refuerzos obligatorios o alternativos (
declaracion_aplicabilidad).Planificar la auditoría: obtener el temario real de verificación con los requisitos acumulados por tramo y el nivel de madurez mínimo exigible (
alcance_auditoria).Consultar el cuestionario CCN-STIC 808 en bruto: preguntas por medida o por tramo, marcando los requisitos esenciales (
requisitos_auditoria).Verificar el articulado del RD 311/2022: comprobaciones documentales y de gobierno como DdA firmada, categorización o INES (
requisitos_articulos).Saber qué documentación preparar: evidencias documentales que puede pedir el auditor, por medida o todas (
evidencias_auditoria).Conocer el origen y la frescura de los datos servidos, incluida la edición de la guía 808 (
snapshot_status).
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., "@ensmcpCalculate the applicability matrix for high availability and medium integrity"
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.
What it is
ensmcp is an MCP (Model Context Protocol) server that brings the security measures of ENS Navegable (Annex II of RD 311/2022) within reach of Claude Desktop, Claude Code and any other MCP client. It is an independent server and is not affiliated with, endorsed by or maintained by the CCN, CCN-CERT or CNI.
The data ships in the package as a snapshot, so the server responds instantly and works offline. The default mode is offline: it does not open Chrome or access the network. --check-updates checks the official source without replacing the snapshot and --live allows temporarily adopting the live data.
In addition to Annex II, it includes the verification questionnaire from the CCN-STIC 808 guide (edition for RD 311/2022): the audit questions per measure, the checks on the RD articles and the documentary evidence the auditor may request.
Main features
Feature | Description |
MCP server over stdio | Integrable into Claude Desktop, Claude Code and other MCP clients |
Works offline | The full corpus ships as a snapshot in the package |
Deterministic snapshot | The default mode always serves the packaged corpus |
Explicit check |
|
Applicability matrix | Calculates the regulatory basis to prepare the Applicability Statement |
CCN-STIC 808 audit | Audit syllabus, essential requirements, RD articles and documentary evidence |
Related MCP server: nist-mcp
Available tools
Annex II query
Tool | Args | Description |
| — | The Annex II categories with their group ( |
|
| Measures filtered by category, security dimension or level. |
|
| A measure by exact code (e.g. |
|
| Text search in code, title, description and RD wording (case- and accent-insensitive). |
Applicability Statement and audit
Tool | Args | Description |
|
| The base regulatory matrix to prepare the DdA: each dimension is rated ( |
| same as the DdA | The system's audit syllabus: the applicable measures with their accumulated verification questions and the minimum maturity level required. |
|
| The raw CCN-STIC 808 questionnaire, per measure or per tier, marking the essential requirements. |
| — | The audit checks on the RD articles (formal DdA, categorization, INES...). |
|
| The documentation the auditor may request, per measure. |
Status and updates
Tool | Args | Description |
| — | Checks the official site now and updates the data if it has changed. |
| — | Origin and freshness of the data being served. |
What a measure returns
Each measure carries two texts, and both are needed: norm_text is the wording of RD 311/2022 (what the measure requires) and description is the CCN-STIC 808 questionnaire (what the auditor asks). The reinforcements come paired with the level that requires them and with their wording in the RD:
{
"code": "mp.s.4",
"title": "Protección frente a denegación de servicio",
"description": "Categoría Media 1.1 ¿Se ha planificado y dotado al sistema de capacidad suficiente ...?",
"norm_text": "Se establecerán medidas preventivas frente a ataques de denegación de servicio ...",
"category_code": "mp.s",
"dimensions": ["disponibilidad"],
"levels": ["medio", "alto"],
"reinforcements": [
{ "code": "R1", "level": "alto", "alternative": false, "text": "R1-Detección y reacción. ..." }
],
"raw_levels": { "bajo": "n.a.", "medio": "aplica", "alto": "+ R1" }
}alternative distinguishes the mandatory reinforcements (+ R1 + R2) from the alternative ones (+ [R1 or R2], where any single one suffices): confusing them changes what must be implemented.
Applicability Statement
The ENS does not apply one level to the whole system: it applies one per dimension. Each one is rated and the tool returns what that system must comply with:
{
"categoria_sistema": "alta",
"measures": [
{ "code": "op.acc.5", "title": "Mecanismo de autenticación (usuarios externos)",
"required_level": "alto",
"required_reinforcements": [
{ "code": "R2", "alternative": true, "text": "R2-..." },
{ "code": "R5", "alternative": false, "text": "R5-..." }
] }
]
}The rule comes from RD 311/2022: the system's category is the highest of the rated levels (Annex I, section 4), measures marked "Category" are required according to the system's category, those protecting dimensions according to the level of those dimensions, and an unrated dimension leaves out the measures that only protect it.
Audit scope
If the DdA answers "what do I have to implement?", alcance_auditoria answers "what is the auditor going to ask me?". For each applicable measure, it returns the verification requirements accumulated up to its enforceable level and the minimum maturity level required by the guide:
Category | Minimum maturity level |
BASIC | L2 — Reproducible, but intuitive |
MEDIUM | L3 — Defined process |
HIGH | L4 — Managed and measurable |
The nuance matters: the tiers that ENS Navegable labels "Basic / Medium / High Category" are cumulative according to CCN-STIC 808 §5 — "Basic Category" means enforceable for all categories, not only for basic systems. A medium-category system answers the basic questions and the medium ones. For a system with C=high, I=medium, D=low, A=medium, T=medium, the real syllabus is 382 questions (136 essential, whose non-compliance blocks certification), not the 73 in its tier.
requisitos_articulos and evidencias_auditoria cover the other half of the audit: the checks on the RD articles (whether the DdA exists and is signed, whether the system is formally categorized, whether it is reported to INES...) and the 365 documentary evidence items the guide proposes. This data comes from CCN-STIC 808; ENS Navegable does not publish it.
Where the data comes from
src/ensmcp/data/anexo_ii.json— the ENS Navegable corpus (measures, RD texts, questionnaire, applicability by levels), captured from the official site. Each query is an in-memory lookup.src/ensmcp/data/guia_808.json— the data extracted from the CCN-STIC 808 guide with its attribution (the guide itself is not redistributed).snapshot_statusindicates which edition it comes from.
To regenerate the snapshot:
python scripts/build_snapshot.pyThe server does not open Chrome or use the network by default. To check for changes explicitly:
ensmcp --offline
ensmcp --check-updates
ensmcp --liveIt can also be configured with ENSMCP_MODE=offline|check-updates|live.
Requirements
Python 3.12-3.14
Only to update the snapshot (refresh_live_page, the startup check, scripts/build_snapshot.py) you also need:
Google Chrome installed
A display (or
xvfbon servers without one)
Installation
To use the server from PyPI:
pip install ensmcp
ensmcp --offlineTo enable the live check:
pip install "ensmcp[live]"
ensmcp --check-updatesDevelopment
git clone https://github.com/seifreed/ensmcp.git
cd ensmcp
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r pylock.toml # versiones exactas, verificadas por hash
pip install -e . --no-deps # el propio paquete, sin re-resolver
patchright install chromiumOn a freshly installed Linux it may also be necessary:
patchright install-deps chromiumpyproject.toml is the only place where dependencies are declared; pylock.toml is an artifact generated from it (PEP 751) that pins all dependencies —runtime and development together— to exact version and hash, with markers for Windows, Linux and macOS on x64 and ARM. To update dependencies, edit the ranges in pyproject.toml and regenerate:
uv pip compile pyproject.toml --all-extras --universal --python-version 3.12 \
--format pylock.toml -o pylock.tomlQuick start
python -m ensmcpConfigure it in an MCP client (e.g. Claude Desktop / Claude Code) pointing to the virtual environment interpreter:
{
"mcpServers": {
"ensmcp": { "command": "ensmcp", "args": ["--offline"] }
}
}No further configuration is needed: queries are answered from the package snapshot.
For compliance decisions, the BOE, the Technical Security Instructions, the current official guides and the criteria of the corresponding auditing or certification entity prevail.
To inspect it manually:
npx @modelcontextprotocol/inspector venv/bin/python -m ensmcpContributing
Contributions are welcome.
Fork the repository
Create your feature branch (
git checkout -b feature/new-feature)Commit your changes (
git commit -m 'Add new feature')Push the branch (
git push origin feature/new-feature)Open a Pull Request
Make sure all quality and security gates pass without errors or warnings before submitting the PR.
Support the project
If this project is useful to you, you can support its development:
Author
Marc Rivero López | @seifreed
Repository: github.com/seifreed/ensmcp
Available Tools
19 toolsalcance_auditoriaARead-onlyIdempotent
El temario de auditoría de un sistema: qué le van a preguntar.
Mismos argumentos que declaracion_aplicabilidad — el nivel de cada
dimensión, u omitida si el sistema no la valora.
Devuelve sólo las medidas que le aplican y, por cada una, los requisitos de verificación exigibles acumulados: los de "Categoría Básica" se exigen a todas las categorías, los de "Media" a MEDIA y ALTA, y los de "Alta" sólo a ALTA (CCN-STIC 808 §5). Un sistema medio responde los de básica y los de media.
nivel_madurez_requerido es el mínimo CMM que el auditor exige a cada
medida según la categoría (CCN-STIC 808 §6), con su code y su
name: BÁSICA → L2 "Reproducible, pero intuitivo", MEDIA → L3
"Proceso definido", ALTA → L4 "Gestionado y medible". essential marca los
requisitos cuyo incumplimiento hace que la medida entera cuente como no
implantada.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| compact | No | ||
| integridad | No | ||
| autenticidad | No | ||
| trazabilidad | No | ||
| measure_codes | No | ||
| disponibilidad | No | ||
| confidencialidad | No | ||
| include_evidence | No | ||
| include_norm_text | No | ||
| include_questions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered structurally. The description adds genuine behavioral context beyond that: the category-based accumulation rules (Básica applies to all, Media to MEDIA/ALTA, Alta only to ALTA, CCN-STIC 808 §5), the meaning of `nivel_madurez_requerido`, and the `essential` flag semantics. This enriches what the raw annotations convey. No contradiction with annotations — the compute/read behavior described matches readOnlyHint=true.
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 description is dense but every sentence earns its place: purpose, input contract, accumulation rules, maturity levels, and the `essential` flag semantics. It is front-loaded with the purpose statement and organized in logical paragraphs. It is somewhat long and technical (CCN-STIC references, CMM level names), but the complexity of the domain justifies the length.
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 an output schema exists (so return values need not be spelled out) and 12 parameters, the description covers the core semantics thoroughly: dimension inputs, accumulation behavior, maturity requirements, and essential flags. The only real gap is the output-formatting/pagination parameters (limit, cursor, compact, include_*) left unexplained, but those are largely self-evident from their names. It is complete enough for an agent to call the tool correctly for its primary purpose.
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 carries the burden of explaining parameters. It does map the key semantic inputs — the dimension levels (integridad, autenticidad, disponibilidad, confidencialidad, trazabilidad) and their 'omitted if not valued' behavior — and explains output fields like `nivel_madurez_requerido` and `essential`. However, it never mentions `limit`, `cursor`, `compact`, `include_evidence`, `include_norm_text`, or `include_questions`, leaving 6 of 12 parameters undocumented in both schema and description. It compensates only partially for the coverage gap.
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 opening line states a specific purpose — the audit syllabus of a system, i.e., what will be asked — and the description makes clear it returns applicable measures with their accumulated verification requirements. It provides a concrete resource and verb. However, it does not differentiate itself from close siblings like `requisitos_auditoria` or `evidencias_auditoria`, which an agent could easily confuse with this tool, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit calling context: takes the same arguments as `declaracion_aplicabilidad` (dimension level per dimension, or omitted if not valued), explaining the input semantics needed to invoke it correctly. It also states the accumulation logic clearly. It does not, however, state when NOT to use this tool versus its siblings, so the guidance is strong on how but weaker on selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ddaC
Crea y persiste una DdA completa para un sistema o subsistema.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | ||
| record_id | Yes | ||
| subsystem_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, covering the safety profile. The description adds only 'persiste', confirming a write; it does not disclose the non-idempotent consequence (duplicate DdAs on repeat calls) or any auth/permission requirements, leaving real behavioral gaps.
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 efficient sentence with the action verb front-loaded and no filler. It is appropriately terse, though terseness here borders on under-specification given the schema complexity.
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?
This is a creation tool over a deeply nested, 10-def schema with 0% description coverage; an output schema exists so return values need not be explained, but the description omits the structure of the required 'profile' object, the meaning of record_id, and subsystem nesting. For this complexity the definition is thin.
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 schema itself documents none of record_id, profile, or subsystem_id. The description supplies no parameter meaning whatsoever, not even what record_id references or how subsystem_id relates to profile.subsystems, so it fails to compensate for the coverage gap.
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 pair (creates and persists) and a resource (a complete DdA), scoped to a system or subsystem. However, the acronym 'DdA' is never expanded and no sibling is referenced, so an agent must infer how this differs from get_dda or update_dda_measure_status.
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 clause 'para un sistema o subsistema' hints at scope, but there is no guidance on when to create vs. update an existing DdA, no prerequisites (e.g., must a record_id already exist), and no mention of alternatives despite a crowded sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaracion_aplicabilidadBRead-onlyIdempotent
Medidas y refuerzos exigibles a un sistema, para su DdA.
Cada dimensión toma "bajo", "medio" o "alto" — el nivel al que está valorada en ese sistema (Anexo I). Se acepta "basico" por compatibilidad y se omite si el sistema no la valora. Hay que valorar al menos una.
Devuelve la categoría del sistema (el mayor de esos niveles) y, por
cada medida exigible, el nivel al que se le exige y los refuerzos de
ese nivel. Un refuerzo con alternative: true es una opción entre
varias: basta implantar uno de los marcados así en ese nivel.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| compact | No | ||
| integridad | No | ||
| autenticidad | No | ||
| trazabilidad | No | ||
| measure_codes | No | ||
| disponibilidad | No | ||
| confidencialidad | No | ||
| include_norm_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, and the description's 'Devuelve' is consistent with those — no contradiction. Beyond annotations, the description adds valuable behavioral context: accepted dimension values ('bajo'/'medio'/'alto', with 'basico' tolerated for compatibility), the rule that at least one dimension must be valued, omission when a dimension is not valued, the category being the highest level, and the semantics of `alternative: true` reinforcements (only one needed). This meaningfully exceeds what the annotations signal.
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 description front-loads the purpose in the first line and uses line breaks to separate the recurrence of the input rules, output contract, and alternative-reinforcement semantics. Each sentence earns its place; there is minimal filler. The phrasing 'se omite si el sistema no la valora' is slightly unwieldy but not bloated. It is efficient for the amount of rule context it conveys.
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 tool with 10 parameters and 0% schema coverage, the description covers the core dimension semantics and the output shape (category, required measures, reinforcement levels, alternative behavior), and an output schema exists to reduce the return-value burden. However, it does not address pagination (limit/cursor), the behavior or filtering effect of measure_codes, the meaning of compact, or what include_norm_text toggles. These gaps leave an agent uncertain about controlling output scope for a complex tool.
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 carries the burden. It usefully explains the five dimension parameters (integridad, autenticidad, trazabilidad, disponibilidad, confidencialidad) by specifying their value vocabulary and rules. However, the remaining five parameters — limit, cursor, compact, measure_codes, and include_norm_text — are left unexplained beyond their names; measure_codes as an output filter and compact/include_norm_text as format controls are not described. The compensation for the schema gap is partial.
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 clear, specific function: compute measures and reinforcements required of a system for its DdA (Declaración de Aplicabilidad), returning the system category and per-measure required levels. The verb 'Devuelve' plus the resource (system applicability) makes the purpose understandable. It does not explicitly name a sibling to distinguish from, but the computation-based nature is evidently distinct from listing tools like list_measures and search_measures.
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 description implies the use case — querying required measures for a system given its dimension security levels — but gives no explicit when-to-use vs alternatives, no exclusions, and no mention of sibling tools (list_measures, get_measure, search_measures, snapshot_status). An agent must infer that this tool aggregates applicability from dimension levels rather than listing static measures. There is no when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_system_profileCRead-onlyIdempotent
Evalúa un perfil completo y sus subsistemas contra el Anexo II.
Los máximos se calculan con las dimensiones del sistema, sus activos de información y sus servicios. Cada resultado conserva la justificación y el origen que llevó a ese nivel. Los subsistemas pueden heredar esos máximos o evaluarse de forma aislada.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and closed-world, so safety is covered. The description adds genuinely useful domain behavior: maxima derive from system dimensions/assets/services, results carry justification and origin, and subsystems may inherit maxima or be evaluated in isolation. It does not disclose output shape or error/validation behavior.
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-loaded with the action, no filler. Slightly abstract phrasing but well-bounded.
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 takes one deeply nested, undocumented object and has an output schema (so return values needn't be explained), yet the description leaves key input fields (scope, compliance_profiles, active_compliance_profile) and constraint relationships unclear. The inheritance note is the main added value; more is needed for a single complex structured argument.
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?
There is a single parameter (profile) and schema description coverage is 0%, so the schema is title-only. The description hints at the profile structure (dimensions, information assets, services, subsystems) and inheritance semantics, but does not explain the critical fields an agent must populate (scope, active_compliance_profile, compliance_profiles).
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 verb 'Evalúa' with resource 'un perfil completo y sus subsistemas' against 'Anexo II' gives a recognizable purpose, but it is vague about what the evaluation produces and does not differentiate from siblings like declaracion_aplicabilidad or explain_applicability, which also touch applicability/assessment semantics.
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?
No explicit when-to-use, when-not-to-use, or alternative routing guidance. The sentence about subsystems inheriting vs. isolated evaluation is behavioral, not a usage rule for the agent choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evidencias_auditoriaARead-onlyIdempotent
Qué documentación puede pedir el auditor, por medida.
code: una medida concreta, p. ej. "org.1". Omitido, todas. Un código que no sea una medida del Anexo II es un error.
Responde a "¿qué papeles preparo?", que es el trabajo de las
semanas previas a la auditoría. Se une por measure_code con lo que
devuelven alcance_auditoria y declaracion_aplicabilidad.
Fuente: CCN-STIC 808 §6.2, no el ENS Navegable.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds beyond annotations: the error behavior for a non-Annex II code, the join key (measure_code) linking it to sibling outputs, and the authoritative source. This gives the agent behavioral detail the annotations do not include.
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 description is compact and front-loaded: purpose first, then parameter semantics, then use-case and source context. It is dense but every sentence earns its place. Slightly run-on in the parameter section, but no filler words or redundancy.
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 has an output schema, so return values don't need explanation. The description covers the selection semantics, error case, join relationship with sibling tools, and source authority. The only minor gap is no explicit indication of pagination or result limits, but for a single-parameter lookup tool this is sufficient.
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 only parameter is a bare 'code' field with anyOf string/null. The description fully compensates: it explains the format with a concrete example ('org.1'), the omission semantics ('Omitido, todas'), and the error condition for invalid codes. This is complete, actionable parameter documentation.
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 opens with a clear statement of what the tool returns: the documentation an auditor can request, per measure. It grounds the resource precisely (Annex II measures) and hints at differentiation from siblings via the source note ('no el ENS Navegable') and the join relationship with alcance_auditoria and declaracion_aplicabilidad. It slightly misses full sibling differentiation but the verb+resource+scope is unambiguous.
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 description explicitly names the question it answers ('¿qué papeles preparo?') and places it in the pre-audit preparation phase. It also signals the source (CCN-STIC 808 §6.2, not the ENS Navegable), which helps an agent route to the correct data lineage. It does not state explicit when-not-to-use cases, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_applicabilityCRead-onlyIdempotent
Explica por qué una medida aplica, no aplica o fue forzada por un perfil.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| profile | Yes | ||
| subsystem_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-open-world operation. The description adds that the output is an explanation of applicability status (applies, does not apply, forced), which is useful behavioral context beyond the annotations, but it does not describe permissions, scope, or limitations.
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 description is a single front-loaded sentence with no wasted words. It is concise, though its brevity contributes to the under-specification captured in other dimensions.
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 takes a complex nested profile object and has 0% schema description coverage, yet the description is only one sentence. Although an output schema exists, the description does little to help an agent understand required inputs, optional subsystem scoping, or how to construct the profile.
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, but it only loosely maps 'una medida' to code and 'un perfil' to profile. It gives no meaning, format, or role for subsystem_id and does not explain the complex SystemProfile input.
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 names a specific action and target: it explains why a measure applies, does not apply, or was forced by a profile. It is clear enough to distinguish from generic measure lookup, but it does not name or contrast with siblings such as declaracion_aplicabilidad or evaluate_system_profile.
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 explicit guidance about when to use this tool versus alternatives, nor any when-not condition. The description only states what the tool does, leaving the agent to infer usage from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_ddaARead-onlyIdempotent
Exporta una DdA como JSON, CSV, Markdown, XLSX, ODS o DOCX en base64.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes | ||
| output_format | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds a genuinely non-obvious behavioral detail beyond the structured fields: the payload is returned base64-encoded, which tells the agent to expect an encoded blob rather than plain text.
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 filler; the format list and encoding detail are packed into one clause without redundancy.
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?
An output schema exists, so return-structure documentation is unnecessary, and the base64 note covers the one surprising aspect of the response. For a two-parameter, enum-driven export tool this is nearly complete, with only record_id provenance left implicit.
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 carry parameter meaning; it enumerates the six valid output_format values, which compensates partially. However, record_id is left undefined (no hint about identifier format or provenance from list_dda/get_dda).
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 ("Exporta") and resource ("una DdA") plus the full set of output formats, which distinguishes it from the read-oriented siblings like get_dda. The sibling set is not referenced by name, so the differentiation is implicit 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?
No guidance on when to choose export_dda over get_dda or list_dda, and no stated prerequisites (e.g. whether the DdA must exist or be finalized). The agent must infer the use case purely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ddaBRead-onlyIdempotent
Obtiene una DdA persistida con todas sus medidas y evidencias.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety profile is covered. The description adds useful context about what is returned (all measures and evidences), but does not explain error behavior, permissions, or what happens if the record is absent.
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 description is a single, front-loaded sentence with no wasted words. It is efficient, though very short, leaving substantial detail to structured fields.
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?
An output schema exists, so return value details need not be in the description, and annotations cover safety. However, the lone parameter is undocumented in both schema and description, and there is no usage guidance, leaving meaningful gaps for an 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 0%, so the description should compensate, but it never explains what record_id represents or its format. The only hint comes from the phrase "DdA persistida," which minimally implies an identifier for a specific persisted DdA.
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 ("Obtiene") and resource ("DdA persistida") with an explicit scope of included data ("todas sus medidas y evidencias"). It does not explicitly distinguish itself from the sibling list_dda, but the singular persisted DdA makes the retrieval-by-identifier intent inferable.
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 explicit statement of when to use this tool versus alternatives such as list_dda or get_measure. Usage is only weakly implied by the retrieval verb and the required record_id parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_measureCRead-onlyIdempotent
Obtiene una medida de seguridad por su código exacto, p. ej. "org.1".
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the description needn't restate safety. The description adds the exact-code matching constraint, which is mildly useful, but says nothing beyond annotations about error behavior or scope.
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, front-loaded with the verb and resource. The example 'org.1' adds concrete value without bloat.
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?
Output schema exists so return values needn't be explained. But with 0% parameter schema coverage and no sibling differentiation among many similar list/search tools, the description is only minimally complete for correct tool selection.
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 'code' parameter has no schema description. The description clarifies that the code must be exact (e.g. 'org.1'), which compensates somewhat, but lacks format or validation details. For 1 param with no schema description, this is a modest addition.
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 (obtiene) and resource (medida de seguridad) retrieved by exact code. However, it does not distinguish this from sibling tools like search_measures, list_measures, or get_dda, leaving ambiguity about when exact-code lookup is appropriate versus search.
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?
No guidance on when to use this tool versus alternatives such as search_measures or list_measures. The 'código exacto' phrase hints at exact-match retrieval but doesn't contrast with siblings or state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesARead-onlyIdempotent
Lista todas las categorías del Anexo II (org, op.pl, mp.if, ...).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds minimal context about the category examples, but does not disclose other behavioral traits (e.g., return format, pagination, errors). Since annotations cover the key behavioral aspects, a 3 is appropriate.
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 description is a single, concise sentence that gets straight to the purpose with no filler. It is appropriately sized and front-loaded.
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 tool with an output schema present, the description is complete. It clearly states what the tool lists and provides examples, leaving no ambiguity for an agent to call it correctly.
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 has zero parameters, so the schema already fully covers this aspect. The baseline for 0 params is 4, and the description adds nothing beyond the schema, which is acceptable.
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 clearly states the tool lists all categories of Annex II, with specific examples (org, op.pl, mp.if). It uses an explicit verb (list) and resource (categories), distinguishing it from sibling tools focused on measures or other entities.
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 description does not provide explicit guidance on when to use this tool versus alternatives. It only describes what it does, without mentioning exclusions or alternative tools. The purpose is clear, but there is no explicit context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_data_packsBRead-onlyIdempotent
Lista los crosswalks externos, su procedencia, cobertura y vigencia.
| Name | Required | Description | Default |
|---|---|---|---|
| include_inactive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety profile is covered. The description usefully discloses the returned facets (provenance, coverage, validity), but says nothing about the active/inactive default behavior implied by the single parameter.
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, front-loaded with the verb and resource. Nothing is wasted, though it is arguably too terse for the behavioral details it omits.
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?
An output schema exists, so return values need not be explained, and the annotations carry the safety profile. What is missing is the routing context against 'query_crosswalk' and the semantics of include_inactive, which for a simple list tool is a modest but real gap.
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% and the only parameter, include_inactive, is never mentioned in the description. Its self-descriptive name and false default mitigate somewhat, but the description does not compensate for the coverage gap by explaining what inactive packs mean or when to include them.
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 ('Lista') and resource ('crosswalks externos'), plus the attributes returned (procedencia, cobertura, vigencia). It is clear what the tool does, but it never distinguishes itself from the sibling 'query_crosswalk', leaving the boundary between listing and querying implicit.
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 obvious alternative 'query_crosswalk'. The agent must infer that this is an enumeration tool versus a lookup tool on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ddaBRead-onlyIdempotent
Lista las DdA persistidas y el recuento de sus estados.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world. The description adds that the result includes a per-status count, which is useful aggregate context beyond what annotations convey. No pagination, ordering, or volume caveats are mentioned.
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?
One compact, front-loaded sentence. No filler, no repetition of the tool name.
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?
Output schema exists, so return-value detail is not required. But for a list tool among many siblings, the absence of any usage guidance or differentiation leaves a real gap.
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?
Zero parameters, so baseline 4 applies. No parameter meaning needs to be conveyed.
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 clear verb ('Lista') and resource ('DdA persistidas') plus what is counted ('recuento de sus estados'), which is more than a tautology. However, it is in Spanish while sibling names are English (create_dda, get_dda, update_dda_measure_status) — mixing languages weakens discoverability. It doesn't explicitly differentiate from get_dda or create_dda.
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?
No indication of when to use this instead of get_dda, export_dda, or list_measures. With 18 siblings, some routing signal is essential; the description offers none.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_measuresBRead-onlyIdempotent
Lista medidas de seguridad con filtros opcionales.
category_code: código de categoría o grupo, p. ej. "mp.if" o "mp". Uno que no sea una categoría del Anexo II es un error: todas las categorías tienen medidas, así que una lista vacía sólo podía significar que el argumento no era una categoría. dimension: "confidencialidad", "integridad", "disponibilidad", "autenticidad" o "trazabilidad". level: "bajo", "medio" o "alto". Se acepta "basico" por compatibilidad.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | ||
| limit | No | ||
| cursor | No | ||
| compact | No | ||
| dimension | No | ||
| category_code | No | ||
| include_norm_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, idempotentHint=true and openWorldHint=false, which the description does not contradict. Beyond that, the description adds real behavioral value: it discloses that an invalid category_code is an error, that an empty result can only mean an invalid category (since every Annex II category has measures), and that level accepts 'basico' as a compatibility alias.
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 definition front-loads the one-line purpose before the parameter breakdown, and each parameter note earns its place with concrete values and examples. It is somewhat long for a listing tool, but the organization is logical and there is no 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 7 parameters, 0% schema coverage, and an output schema that covers return values, the description explains the three filtering dimensions in depth but omits the pagination and output-format controls. An agent calling with limit/cursor would have no documentation of how pagination behaves, which is a meaningful gap for a list tool with plausible large result sets.
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?
With 0% schema description coverage, the description must compensate, and it does well for three of seven parameters: category_code gets concrete examples ('mp.if' or 'mp') plus error semantics, dimension gets all five allowed values, and level gets its values plus the 'basico' alias. But limit, cursor, compact and include_norm_text are left unexplained; their names are partially self-evident but the pagination semantics (limit units, cursor mechanics) are not documented.
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 opening sentence 'Lista medidas de seguridad con filtros opcionales' states a specific verb (listar), a concrete resource (seguridad/security measures), and the filtering behavior, which lets an agent tell it apart from list_categories and get_measure. It doesn't explicitly contrast with search_measures, so it falls just short of full 5 differentiation, but the core purpose is unambiguous.
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 description gives no guidance on when to use this tool versus its siblings search_measures or get_measure, and states no exclusions. The filter parameter notes imply a use case (filtered listing), but nothing tells an agent why to choose list_measures over search_measures when a broad or fuzzy search is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_crosswalkCRead-onlyIdempotent
Consulta un crosswalk por medida ENS o referencia del otro marco.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| pack_id | Yes | ||
| ens_code | No | ||
| include_inactive | No | ||
| external_reference | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so safety is covered. Beyond that the description adds nothing: it does not explain pagination behavior implied by limit/cursor, what 'inactive' records mean for include_inactive, or how results are shaped.
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 padding, which is structurally clean. But the brevity here reads as under-specification rather than effective conciseness for a six-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 6 parameters, an output schema present, and safety already covered by annotations, the description still omits usage context, required-parameter emphasis, and pagination semantics. It is too thin for an agent to invoke this correctly on first attempt.
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 6 parameters, so the description must carry the load. It only loosely maps to two of them ('medida ENS' ~ ens_code, 'referencia del otro marco' ~ external_reference) and says nothing about the required pack_id, limit, cursor, or include_inactive.
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 and resource ('Consulta un crosswalk') plus the filter axes ('medida ENS', 'referencia del otro marco'), so an agent can tell it retrieves crosswalk mappings. However, it does not clarify what a 'crosswalk' is or how it differs from measure-lookup siblings like get_measure or search_measures, leaving scope 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives. The agent is not told when to prefer query_crosswalk over list_measures or search_measures, nor that pack_id is mandatory context for every call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
requisitos_articulosARead-onlyIdempotent
Comprobaciones de auditoría sobre el articulado del RD 311/2022.
Una auditoría verifica el articulado además del Anexo II, y esta es esa mitad: las preguntas documentales y de gobierno (Declaración de Aplicabilidad firmada, categorización, INES, perfiles...) por las que suele empezar el auditor.
evidence son los documentos que la guía propone que pida.
Fuente: CCN-STIC 808 §6.1, no el ENS Navegable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the read-only, non-mutating safety profile is covered — and the description is consistent with it (no contradiction). The description adds value by explaining the documentary/governance nature of the checks and citing the source (CCN-STIC 808 §6.1). However, it discloses nothing about response behavior, pagination, or filtering; the fact that an output schema exists lowers the burden, keeping this at a solid 3.
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 description is front-loaded with the core purpose in the first sentence, then builds context across three short paragraphs. Every sentence contributes something (scope, the audit-half distinction, evidence meaning, source attribution). It is slightly more verbose than strictly necessary for a zero-parameter tool, but nothing is wasted.
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 no-parameter, read-only tool with an output schema and safety annotations, the description covers the essential ground: what the tool checks, how it splits from the Anexo II audit, what `evidence` refers to, and the governing source standard. The main remaining gap is not explicitly tying this tool to its sibling requisitos_auditoria / evidencias_auditoria, but that is a minor omission for a passive, parameterless tool.
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 has 0 parameters and the schema coverage is trivially 100% (empty properties object), so there is nothing for the description to document. Per the rubric, 0 params warrants a baseline of 4. The description appropriately spends no time on parameter syntax.
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 resource ('articulado del RD 311/2022') and a specific kind of operation ('Comprobaciones de auditoría'). It distinguishes its scope from the Anexo II half of the audit, which separates it from related tools. However, it never explicitly names a sibling tool, so an agent must infer the differentiation from the 'esta es esa mitad' framing rather than being told which tool does the other half.
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 description gives solid contextual guidance: it explains that an audit verifies both the articles and Annex II, positions this tool as one half, and notes this is where the auditor typically starts ('por las que suele empezar el auditor'). It also clarifies the evidence concept. But it stops short of explicit when-to-use/when-not-to-use instructions or naming alternatives like requisitos_auditoria or evidencias_auditoria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
requisitos_auditoriaARead-onlyIdempotent
Preguntas del cuestionario de auditoría (CCN-STIC 808), en bruto.
code: una medida concreta, p. ej. "org.1". Omitido, devuelve el
cuestionario entero. Un código que no sea una medida del Anexo II
es un error, no una lista vacía: hay medidas cuyo cuestionario está
legítimamente vacío en un tramo, y las dos cosas no pueden
contestarse igual.
level: "basica", "media" o "alta" — las categorías oficiales del sistema.
tools. Filtra por la sección en que la guía imprime el
requisito ("Categoría Básica", "Media" y "Alta" respectivamente),
que NO es el temario de un sistema de esa categoría: los requisitos
son acumulativos y los de "Categoría Básica" se exigen a todas.
Para el temario real de un sistema usa alcance_auditoria.
Cada elemento trae essential: si uno esencial no se cumple, el auditor
considera la medida entera como no implantada. Ojo con code dentro de
una medida — es la etiqueta que imprime el sitio y se repite (hay cinco
"1.1" distintos en op.acc.5); lo que identifica un requisito es
position.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| level | No | ||
| limit | No | ||
| cursor | No | ||
| essential_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds substantial non-obvious behavioral details: invalid codes cause an error (not an empty list), the `essential` flag determines measure failure, and `code` within a measure is not unique (five '1.1' exist in op.acc.5) while `position` is the true identifier. This goes far beyond the annotations and prepares the agent for real edge cases.
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 description is well-structured with bolded parameter names and front-loaded purpose. It is longer than minimal but earns its length by explaining tricky semantics. A minor typo ('tools.' mid-sentence) and a slightly meandering level explanation cost it a perfect score, but it remains appropriately sized for the complexity.
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 has 5 parameters, 0% schema coverage, and an output schema. While the description covers `code` and `level` thoroughly, it omits `limit`, `cursor`, and `essential_only` entirely. It also doesn't describe the overall return format or pagination behavior. For a tool with this complexity, the description is not complete enough to ensure correct invocation without additional context.
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. It thoroughly explains `code` (measure example, error semantics) and `level` (official categories, section vs syllabus), but provides no explanation for `limit`, `cursor`, or `essential_only`. These three parameters remain undocumented, leaving a significant gap in the agent's ability to use them correctly.
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 clearly states the tool's purpose: 'Preguntas del cuestionario de auditoría (CCN-STIC 808), en bruto.' It specifies the verb (devuelve/returns), the resource (audit questionnaire), and the raw nature. It also distinguishes itself from sibling `alcance_auditoria` by explicitly pointing to it as the correct tool for the actual system syllabus, making the purpose unambiguous.
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 description provides explicit when-to-use guidance: it warns that `level` filters by the guide's section, not the system's syllabus, and says 'Para el temario real de un sistema usa `alcance_auditoria`.' This directly routes the agent to the correct sibling and clarifies the subtle distinction, covering both when to use this tool and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_measuresARead-onlyIdempotent
Busca medidas por texto: código, título, cuestionario, redacción del RD.
Mira el code, el title, la description (el cuestionario de la
CCN-STIC 808), el norm_text (lo que exige el RD 311/2022) y el text
de cada refuerzo. Ignora mayúsculas y tildes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| cursor | No | ||
| compact | No | ||
| include_norm_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to repeat that. It adds useful behavioral detail: it searches specific named fields and ignores case and accents. This goes beyond the annotations and helps the agent predict search behavior without over-explaining. A minor gap is the lack of any mention of result ordering or pagination, but given the annotation coverage, this is acceptable.
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 description is concise and front-loaded with the main purpose. It uses two short paragraphs, the first stating the action, the second detailing the fields and the case-insensitivity. There is no fluff, though slightly more structure (e.g., separating the parameter notes) would improve readability. Still, it is appropriately sized.
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 description explains the search scope and case handling, which covers the core behavior. However, it omits any explanation of the optional parameters (limit, cursor, compact, include_norm_text) and does not mention pagination behavior. Given that an output schema exists, return values are not needed, but the parameter semantics are an important gap. Overall, it is adequate but not fully complete.
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 schema description coverage is 0%, so the description must compensate by explaining parameters. However, it only implicitly covers `query` and never mentions `limit`, `cursor`, `compact`, or `include_norm_text`. The agent may not know what `compact` does or whether `include_norm_text` affects the search scope. This is a significant gap for a tool with five parameters.
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 ('Busca' = search) and resource ('medidas' = measures), and enumerates the specific fields searched (code, title, description, norm_text, text). This clearly distinguishes it from sibling tools like list_measures (which lists) and get_measure (which retrieves a single record). The purpose is unambiguous and actionable.
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 description does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions. The use case is implied by the verb 'search' and the field list, but there is no direct guidance on when to choose this over list_measures or get_measure. It is adequate but relies on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshot_statusBRead-onlyIdempotent
Devuelve el origen y la frescura de los datos servidos.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds that the tool reports data origin and freshness, which is meaningful context, but does not disclose anything about caching, snapshot identity, or timing behavior beyond that.
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 no filler or redundancy. It is front-loaded and easy to parse, though it could have included a routing hint without becoming bloated.
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?
An output schema exists, so return values need not be explained in the description. However, for a tool whose purpose depends on distinguishing it from many similarly named siblings, the description is thin and provides no operational context such as when the snapshot is generated or what freshness means for the caller.
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 no parameter documentation is needed. The schema and description are consistent, and the baseline for a no-param tool is a 4.
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 names a specific resource (data origin and freshness) but the verb is vague ('Devuelve') and it doesn't distinguish this tool from any of the 18 sibling tools. An agent could not confidently route to snapshot_status versus get_measure or list_data_packs based on this text alone.
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 when-not-to-use, and no named alternatives. The description merely states what is returned without indicating the conditions that should trigger calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dda_measure_statusB
Actualiza estado, responsable, evidencias, excepciones y fechas de una medida.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| owner | No | ||
| record_id | Yes | ||
| review_date | No | ||
| target_date | No | ||
| justification | No | ||
| exclusion_reason | No | ||
| evidence_references | No | ||
| compensatory_measures | No | ||
| implementation_status | Yes | ||
| surveillance_measures | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, non-idempotent mutation (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds a list of updateable fields, which is useful context beyond annotations, but it does not describe permissions, side effects, validation rules, or concurrency behavior. With annotations covering the safety profile, this is adequate but limited.
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 description is a single front-loaded sentence with no filler. It immediately states the action and the fields affected. Though terse, conciseness is not the source of its gaps.
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 11 parameters at 0% schema description coverage and a mutation operation, the description is not complete enough for confident invocation. Output schema and annotations reduce some burden, but the description leaves required identifiers, optional fields, and update semantics largely unexplained.
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% and there are 11 parameters, so the description must compensate. It names several update targets (estado, responsable, evidencias, excepciones, fechas), but omits key required identifiers such as record_id and code, and does not explain justification, surveillance_measures, compensatory_measures, or date formats/constraints. It adds some meaning but falls well short for an 11-parameter schema.
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 uses a specific verb ('Actualiza') and resource ('una medida'), and lists several updateable fields: status, owner, evidence, exceptions, and dates. It is clear what the tool does. It does not explicitly differentiate itself from sibling tools, but the purpose is still evident.
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 description only implies that this tool is used for updating a measure. It provides no when-to-use guidance, no exclusions, and no alternatives such as create_dda or get_measure. The agent must infer usage context entirely.
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.
10 tool updates
v0.1.2- Added
create_dda - Added
evaluate_system_profile - Added
explain_applicability - Added
export_dda - Added
get_dda - Changed
get_measure4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Result" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"get_measureOutput"New value: +"get_measureDictOutput"
- Added
list_data_packs - Added
list_dda - Added
query_crosswalk - Added
update_dda_measure_status
10 tool updates
v0.1.1- First observed
alcance_auditoria - First observed
declaracion_aplicabilidad - First observed
evidencias_auditoria - First observed
get_measure - First observed
list_categories - First observed
list_measures - First observed
requisitos_articulos - First observed
requisitos_auditoria - First observed
search_measures - First observed
snapshot_status
TDQS
Scored across 19 tools
Most tools target clearly distinct resources, and the descriptions carefully delineate siblings like declaracion_aplicabilidad (applicability/DdA), alcance_auditoria (audit syllabus), evaluate_system_profile (profile scoring), and explain_applicability (per-measure reasoning). There is still residual overlap among these four applicability/audit-oriented tools since some share identical arguments, which could invite misselection.
The English tools follow a fairly consistent verb_noun pattern (get_measure, list_measures, create_dda, update_dda_measure_status), but five tools use Spanish noun phrases (declaracion_aplicabilidad, alcance_auditoria, evidencias_auditoria, requisitos_articulos, requisitos_auditoria), breaking the pattern. The set remains readable but mixes two conventions.
At 19 tools the surface is somewhat heavy but each tool maps to a plausible ENS task (measure lookup, DdA lifecycle, audit requirements, crosswalks, data freshness). No obvious redundancy that inflates the count artificially, though a few audit/query tools sit close together.
DdA lifecycle is well covered (create, get, list, update status, export) plus measure retrieval, search, crosswalks, and multiple audit-requirement views. Minor gaps exist—no delete_dda and no measure-level editing—but agents can work around them.
Maintenance
Related MCP Connectors
Offline methodology engine for authorized penetration testing, CTF, and security research.
Offline US medical code lookup and crosswalk — ICD-10-CM/PCS, HCPCS Level II, RxNorm. Keyless.
Offline, keyless lookup of the US civil aircraft registry — decode N-numbers, search records.
Compliance & security scan for your app: secrets, exposed files, headers, privacy, AI-disclosure.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides instant access to authoritative security documentation from organizations like OWASP, NIST, and major cloud providers through natural language semantic search. It enables users to retrieve security best practices, frameworks, and vulnerability information directly from a locally cached knowledge base.41MIT
- AlicenseAqualityDmaintenanceProvides structured access to the full NIST cybersecurity catalog, including SP 800/1800 publications, security controls, CSF 2.0, and the NVD database. It enables AI assistants to search and retrieve cybersecurity standards, CVEs, and compliance guidance directly from a local SQLite index.201MIT
- AlicenseNot gradedqualityDmaintenanceProvides offline full-text search across 35,000+ Swiss laws from all cantons and federal level using SQLite FTS5 indexing. Enables querying laws, articles, and metadata through natural language.1MIT
- AlicenseAqualityFmaintenanceEnables querying Portuguese cybersecurity regulations, guidance, advisories, and frameworks from CNCS via MCP-compatible clients.6Apache 2.0