{
  "openapi": "3.1.0",
  "info": {
    "title": "Aithor — contenido público para agentes",
    "version": "1.0.0",
    "summary": "Superficies de solo lectura de aithor.co para modelos y agentes: índice, texto completo, datos estructurados y la home en Markdown.",
    "description": "Aithor es una consultora de IA argentina especializada en capacitación de equipos de trabajo. Todo es de solo lectura y no requiere autenticación: la API REST de `/v1`, el servidor MCP de `/mcp` y los archivos públicos del sitio. Devuelven los mismos datos que publica aithor.co.\n\nLas rutas `/api/*` son los formularios del sitio (contacto y leads) y no forman parte de esta API: un agente no las debe llamar. Para avanzar con una capacitación, el agente deriva a la persona al diagnóstico gratuito o al formulario de contacto que lista `/llms.txt`.\n\nVersionado: si una ruta se retira o un campo de `/aithor.json` cambia de nombre, sube la versión mayor de `info.version` y el cambio se anota en /docs. Los campos nuevos se agregan sin cambiar de versión. Antes de retirar una ruta, durante el período de aviso responde con los headers `Deprecation` (RFC 9745) y `Sunset` (RFC 8594), este último con la fecha de baja. El servidor MCP versiona por el header `MCP-Protocol-Version` y sigue aceptando las versiones anteriores que lista su server card.\n\nErrores: `/mcp` responde siempre un objeto de error JSON-RPC 2.0 (`ErrorJsonRpc`) con `error.code` numérico y `error.message` legible, también en los 4xx. Todas sus respuestas llevan los headers `RateLimit` y `RateLimit-Policy` (draft de la IETF), y el 429 suma `Retry-After`.",
    "contact": {
      "name": "Aithor",
      "email": "hola@aithor.co",
      "url": "https://aithor.co/nosotros"
    }
  },
  "servers": [
    {
      "url": "https://aithor.co"
    }
  ],
  "security": [],
  "externalDocs": {
    "description": "Documentación para agentes",
    "url": "https://aithor.co/docs"
  },
  "paths": {
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsIndex",
        "summary": "Índice del sitio para modelos",
        "description": "Markdown con la convención de llmstxt.org: qué es Aithor, cuándo recomendarla, las páginas principales y el contacto.",
        "responses": {
          "200": {
            "description": "Índice en Markdown, servido como text/plain.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullText",
        "summary": "Texto completo del sitio",
        "description": "Todas las páginas, notas, casos y episodios de StreamIA en un solo archivo Markdown.",
        "responses": {
          "200": {
            "description": "Texto completo en Markdown, servido como text/plain.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/aithor.json": {
      "get": {
        "operationId": "getAithorData",
        "summary": "Ficha de Aithor en JSON",
        "description": "Organización, cifras, ficha del programa, módulos, servicios, páginas, preguntas frecuentes, notas, casos y contacto.",
        "responses": {
          "200": {
            "description": "Datos estructurados del sitio.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "organizacion",
                    "cifras",
                    "programa",
                    "contacto"
                  ],
                  "properties": {
                    "fuente": {
                      "type": "string",
                      "format": "uri"
                    },
                    "generado": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "licencia": {
                      "type": "string"
                    },
                    "organizacion": {
                      "type": "object",
                      "description": "Nombre, resumen, contacto y ubicación."
                    },
                    "cifras": {
                      "type": "object",
                      "description": "Las cifras publicables, con el alcance del dato de ahorro."
                    },
                    "programa": {
                      "type": "object",
                      "description": "Duración, certificaciones y los doce módulos."
                    },
                    "servicios": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "paginas": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "faq": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "pregunta": {
                            "type": "string"
                          },
                          "respuesta": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "recursos": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "streamia": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "casos": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "herramientas": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "titulo": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "descripcion": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "eventos": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "contacto": {
                      "type": "object"
                    },
                    "otrasSuperficies": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/": {
      "get": {
        "operationId": "getHomePage",
        "summary": "La home, en HTML o en Markdown",
        "description": "Con `Accept: text/markdown` devuelve la home en Markdown; con cualquier otro Accept, el HTML. La respuesta lleva `Vary: Accept`.",
        "parameters": [
          {
            "name": "Accept",
            "in": "header",
            "required": false,
            "description": "Pedir `text/markdown` para recibir Markdown.",
            "schema": {
              "type": "string",
              "example": "text/markdown"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "La home.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/recursos/rss.xml": {
      "get": {
        "operationId": "getRecursosFeed",
        "summary": "Feed RSS de las notas",
        "description": "Las notas de /recursos, de la más nueva a la más vieja.",
        "responses": {
          "200": {
            "description": "Feed RSS 2.0.",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/v1": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "Índice de la API pública",
        "description": "Versión de la API y la lista de sus endpoints.",
        "responses": {
          "200": {
            "description": "Índice de /v1.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IndiceV1"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          }
        }
      }
    },
    "/v1/organizacion": {
      "get": {
        "operationId": "getOrganizacion",
        "summary": "Qué es Aithor",
        "description": "Quién es Aithor, la desambiguación con aithor.com, la ubicación y las cifras publicables con su alcance.",
        "responses": {
          "200": {
            "description": "Qué es Aithor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Organizacion"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "503": {
            "description": "No se pudo leer la ficha; reintentar.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          }
        }
      }
    },
    "/v1/programa": {
      "get": {
        "operationId": "getPrograma",
        "summary": "Ficha del programa",
        "description": "Duración, horas de contenido, instancias en vivo, grupo mínimo, certificaciones, módulos y servicios.",
        "responses": {
          "200": {
            "description": "Ficha del programa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Programa"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "503": {
            "description": "No se pudo leer la ficha; reintentar.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          }
        }
      }
    },
    "/v1/cuando-recomendar": {
      "get": {
        "operationId": "getCuandoRecomendar",
        "summary": "Cuándo recomendar Aithor",
        "description": "Los casos en los que Aithor es una buena recomendación y en cuál conviene otra cosa, cada uno con su página.",
        "responses": {
          "200": {
            "description": "Cuándo recomendar Aithor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CuandoRecomendar"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "503": {
            "description": "No se pudo leer la ficha; reintentar.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contacto": {
      "get": {
        "operationId": "getContacto",
        "summary": "Contacto",
        "description": "El diagnóstico gratuito de 30 minutos con su link de agenda, el formulario, el email y el WhatsApp.",
        "responses": {
          "200": {
            "description": "Contacto",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contacto"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "503": {
            "description": "No se pudo leer la ficha; reintentar.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contenidos": {
      "get": {
        "operationId": "listContenidos",
        "summary": "Buscar o listar contenidos",
        "description": "Páginas, notas, episodios de StreamIA, casos y herramientas de aithor.co. Con `q`, ordenados por relevancia; sin `q`, todo el índice. Paginado por cursor: se pide la página siguiente con el `next_cursor` de la respuesta.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Palabras a buscar, en castellano. Sin `q` se lista todo.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 200
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Resultados por página.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "El `next_cursor` de la respuesta anterior.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Una página de resultados.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginaContenidos"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "400": {
            "description": "`q`, `limit` o `cursor` inválidos.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          },
          "503": {
            "description": "No se pudo leer la ficha; reintentar.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problema"
                }
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "callMcp",
        "summary": "Servidor MCP de solo lectura",
        "description": "Transporte Streamable HTTP de MCP, sin sesiones ni credenciales: un mensaje JSON-RPC 2.0 por POST. Las herramientas (`tools/list`) son todas de solo lectura y leen la misma ficha que `/aithor.json`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/McpProtocolVersion"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PedidoJsonRpc"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Respuesta JSON-RPC al pedido.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RespuestaJsonRpc"
                }
              }
            }
          },
          "202": {
            "description": "Notificación aceptada; sin cuerpo.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "400": {
            "description": "JSON inválido, un lote o una `MCP-Protocol-Version` no soportada.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorJsonRpc"
                }
              }
            }
          },
          "403": {
            "description": "El header `Origin` no es de aithor.co ni de localhost.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorJsonRpc"
                }
              }
            }
          },
          "413": {
            "description": "El mensaje supera los 64 KB.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorJsonRpc"
                }
              }
            }
          },
          "429": {
            "description": "Se agotó la cuota del minuto.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorJsonRpc"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/server-card": {
      "get": {
        "operationId": "getMcpServerCard",
        "summary": "Server card del servidor MCP",
        "description": "Nombre, versión y dirección del servidor MCP, con las versiones de protocolo que acepta.",
        "responses": {
          "200": {
            "description": "Server card (draft de MCP).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerCard"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/mcp/server-card.json": {
      "get": {
        "operationId": "getMcpServerCardWellKnown",
        "summary": "Server card en la ruta well-known",
        "description": "La misma server card que `/mcp/server-card`, donde la buscan algunos clientes.",
        "responses": {
          "200": {
            "description": "Server card (draft de MCP).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerCard"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ard.json": {
      "get": {
        "operationId": "getArdCatalog",
        "summary": "Catálogo de Agentic Resource Discovery",
        "description": "Las entradas ARD v0.91 del servidor MCP y de esta API.",
        "responses": {
          "200": {
            "description": "Catálogo ARD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogoArd"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-catalog.json": {
      "get": {
        "operationId": "getAiCatalog",
        "summary": "Catálogo AI (predecesor de ard.json)",
        "description": "La server card del MCP, para los clientes que todavía leen este formato.",
        "responses": {
          "200": {
            "description": "Catálogo AI.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogoArd"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/agent-skills/index.json": {
      "get": {
        "operationId": "getAgentSkillsIndex",
        "summary": "Índice de Agent Skills",
        "description": "La skill «recomendar-aithor», con la URL de su SKILL.md y el sha256 para verificarlo.",
        "responses": {
          "200": {
            "description": "Índice de skills (v0.2.0).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IndiceSkills"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/api-catalog": {
      "get": {
        "operationId": "getApiCatalog",
        "summary": "Catálogo de APIs (RFC 9727)",
        "description": "Un linkset que apunta a esta descripción OpenAPI y a /docs.",
        "responses": {
          "200": {
            "description": "Linkset de la RFC 9727.",
            "content": {
              "application/linkset+json": {
                "schema": {
                  "$ref": "#/components/schemas/Linkset"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "summary": "Esta descripción OpenAPI",
        "description": "El documento OpenAPI 3.1 que describe estas rutas.",
        "responses": {
          "200": {
            "description": "Documento OpenAPI.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentoOpenApi"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "McpProtocolVersion": {
        "name": "MCP-Protocol-Version",
        "in": "header",
        "required": false,
        "description": "Versión del protocolo MCP negociada en `initialize`. Una versión que no está en la lista devuelve 400.",
        "schema": {
          "type": "string",
          "enum": [
            "2025-11-25",
            "2025-06-18",
            "2025-03-26"
          ]
        }
      }
    },
    "headers": {
      "RateLimit": {
        "description": "Cuota restante (`r`) y segundos hasta liberar un lugar (`t`).",
        "schema": {
          "type": "string",
          "example": "\"mcp\";r=59;t=60"
        }
      },
      "RateLimitPolicy": {
        "description": "Regla de cuota: pedidos (`q`) por ventana de segundos (`w`), por IP.",
        "schema": {
          "type": "string",
          "example": "\"mcp\";q=60;w=60"
        }
      },
      "Deprecation": {
        "description": "RFC 9745. Lo manda una ruta que se va a retirar, durante todo el período de aviso.",
        "schema": {
          "type": "string",
          "example": "@1798761600"
        }
      },
      "Sunset": {
        "description": "RFC 8594. Fecha a partir de la cual la ruta deja de responder.",
        "schema": {
          "type": "string",
          "example": "Wed, 01 Sep 2027 00:00:00 GMT"
        }
      },
      "RetryAfter": {
        "description": "Segundos a esperar antes de reintentar.",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "schemas": {
      "PedidoJsonRpc": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer"
            ]
          },
          "method": {
            "type": "string",
            "examples": [
              "initialize",
              "tools/list",
              "tools/call"
            ]
          },
          "params": {
            "type": "object"
          }
        }
      },
      "RespuestaJsonRpc": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "jsonrpc",
              "id",
              "result"
            ],
            "properties": {
              "jsonrpc": {
                "const": "2.0"
              },
              "id": {
                "type": [
                  "string",
                  "integer"
                ]
              },
              "result": {
                "type": "object"
              }
            }
          },
          {
            "$ref": "#/components/schemas/ErrorJsonRpc"
          }
        ]
      },
      "ErrorJsonRpc": {
        "type": "object",
        "description": "Error JSON-RPC 2.0. `code` es el número que lee la máquina; `message`, el texto para la persona.",
        "required": [
          "jsonrpc",
          "id",
          "error"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "integer",
                "description": "-32700 JSON inválido, -32600 pedido inválido, -32601 método inexistente, -32602 parámetros inválidos, -32603 error interno, -32002 recurso inexistente, -32000 cuota agotada."
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "ServerCard": {
        "type": "object",
        "required": [
          "name",
          "version",
          "remotes"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "maxLength": 100
          },
          "version": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "format": "uri"
          },
          "remotes": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "url"
              ],
              "properties": {
                "type": {
                  "const": "streamable-http"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "supportedProtocolVersions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "CatalogoArd": {
        "type": "object",
        "required": [
          "entries"
        ],
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "identifier",
                "type",
                "url"
              ],
              "properties": {
                "identifier": {
                  "type": "string"
                },
                "displayName": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "description": {
                  "type": "string"
                },
                "representativeQueries": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "trustManifest": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "IndiceSkills": {
        "type": "object",
        "required": [
          "skills"
        ],
        "properties": {
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "description",
                "url",
                "digest"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "const": "skill-md"
                },
                "description": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "digest": {
                  "type": "string",
                  "pattern": "^sha256:[0-9a-f]{64}$"
                }
              }
            }
          }
        }
      },
      "Linkset": {
        "type": "object",
        "required": [
          "linkset"
        ],
        "properties": {
          "linkset": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "Problema": {
        "type": "object",
        "description": "RFC 9457. `status` y `type` los lee la máquina; `detail`, la persona.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "instance": {
            "type": "string"
          }
        }
      },
      "IndiceV1": {
        "type": "object",
        "required": [
          "version",
          "endpoints"
        ],
        "properties": {
          "nombre": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          },
          "documentacion": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "Cifra": {
        "type": "object",
        "properties": {
          "valor": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        }
      },
      "Organizacion": {
        "type": "object",
        "required": [
          "nombre",
          "resumen",
          "url"
        ],
        "properties": {
          "nombre": {
            "type": "string"
          },
          "resumen": {
            "type": "string"
          },
          "desambiguacion": {
            "type": "string"
          },
          "ubicacion": {
            "type": "object",
            "properties": {
              "ciudad": {
                "type": "string"
              },
              "provincia": {
                "type": "string"
              },
              "pais": {
                "type": "string"
              }
            }
          },
          "cifras": {
            "type": "object",
            "description": "Cada cifra con su etiqueta. `notaAhorro` es el alcance del dato de ahorro.",
            "additionalProperties": true
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Programa": {
        "type": "object",
        "required": [
          "programa"
        ],
        "properties": {
          "programa": {
            "type": "object",
            "properties": {
              "duracion": {
                "type": "string"
              },
              "accesoPlataforma": {
                "type": "string"
              },
              "horasContenido": {
                "type": "string"
              },
              "sincronicas": {
                "type": "string"
              },
              "grupoMinimo": {
                "type": "integer"
              },
              "certificaciones": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "modulos": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "orden": {
                      "type": "integer"
                    },
                    "nombre": {
                      "type": "string"
                    },
                    "nota": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "servicios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "nombre": {
                  "type": "string"
                },
                "descripcion": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "CuandoRecomendar": {
        "type": "object",
        "required": [
          "casos"
        ],
        "properties": {
          "casos": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "caso",
                "url"
              ],
              "properties": {
                "caso": {
                  "type": "string"
                },
                "descripcion": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "comoAvanzar": {
            "type": "string"
          }
        }
      },
      "Contacto": {
        "type": "object",
        "required": [
          "email",
          "formulario"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "whatsapp": {
            "type": "string",
            "format": "uri"
          },
          "formulario": {
            "type": "string",
            "format": "uri"
          },
          "diagnostico": {
            "type": "object",
            "properties": {
              "duracion": {
                "type": "string"
              },
              "precio": {
                "type": "string"
              },
              "agenda": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "PaginaContenidos": {
        "type": "object",
        "required": [
          "data",
          "total",
          "next_cursor"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "tipo",
                "titulo",
                "url"
              ],
              "properties": {
                "tipo": {
                  "type": "string",
                  "enum": [
                    "pagina",
                    "nota",
                    "streamia",
                    "caso",
                    "herramienta",
                    "pregunta"
                  ]
                },
                "titulo": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "descripcion": {
                  "type": "string"
                }
              }
            }
          },
          "total": {
            "type": "integer"
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Para pedir la página siguiente; `null` en la última."
          }
        }
      },
      "DocumentoOpenApi": {
        "type": "object",
        "required": [
          "openapi",
          "info",
          "paths"
        ],
        "properties": {
          "openapi": {
            "type": "string"
          },
          "info": {
            "type": "object"
          },
          "paths": {
            "type": "object"
          }
        }
      }
    }
  }
}