# auth.md — AIMIND

Cómo se autentica un agente ante los servicios de AIMIND (https://aimind.cl).

## Resumen

Hay **dos niveles**, y la diferencia es simple: leer es libre, hacer algo requiere permiso.

- **Leer no requiere autenticación.** La información pública de la empresa —qué hace, qué servicios
  y soluciones ofrece, en qué industrias trabaja, quién la compone y cómo contactarla— se consulta
  sin credenciales. Pedir permiso para leer lo que ya está publicado sería fricción sin proteger nada.
- **Escribir requiere OAuth 2.1 con PKCE.** Las dos operaciones que hacen algo —dejar una solicitud
  de conversación y consultar al asistente del sitio— dejan un registro que una persona real va a
  leer, o consumen un servicio con costo. Eso sí justifica que alguien autorice explícitamente.

## Audiencia

Agentes de inteligencia artificial, asistentes conversacionales y rastreadores que necesiten
responder consultas sobre AIMIND con datos verificados en vez de raspar HTML.

## Servicios y su método

| Servicio | URL | Autenticación |
|---|---|---|
| Servidor MCP de lectura | `https://aimind.cl/api/mcp` | Ninguna (público, solo lectura) |
| Servidor MCP con escritura | `https://aimind.cl/api/mcp-agente` | **OAuth 2.1 + PKCE** |
| Metadata del recurso protegido | `https://aimind.cl/.well-known/oauth-protected-resource` | Ninguna |
| Metadata del servidor de autorización | `https://aimind.cl/.well-known/oauth-authorization-server` | Ninguna |
| Tarjeta del servidor MCP | `https://aimind.cl/.well-known/mcp/server-card.json` | Ninguna |
| Catálogo de capacidades (ARD) | `https://aimind.cl/.well-known/ai-catalog.json` | Ninguna |
| Catálogo de API | `https://aimind.cl/.well-known/api-catalog` | Ninguna |
| Índice de Agent Skills | `https://aimind.cl/.well-known/agent-skills/index.json` | Ninguna |
| Resumen de la empresa | `https://aimind.cl/llms.txt` | Ninguna |
| La portada en Markdown | `/` con `Accept: text/markdown` | Ninguna |

## Registro y flujo de autorización

Para la parte protegida hay **registro dinámico de clientes** (RFC 7591): el agente se registra
solo, sin intervención humana previa. La persona entra después, en la pantalla de consentimiento.

```agent_auth
skill: oauth2.1-authorization-code-pkce
audience: agent
register_uri: https://aimind.cl/api/oauth?accion=register
claim_uri: https://aimind.cl/api/oauth?accion=register
identity_types_supported:
  - anonymous
anonymous:
  credential_types_supported:
    - oauth2_access_token
  registration_methods_supported:
    - dynamic_client_registration
registration_method: dynamic_client_registration
registration_request:
  method: POST
  content_type: application/json
  body:
    client_name: <nombre del agente>
    redirect_uris: [<https://... o http://localhost/...>]
  response: { client_id: <emitido>, scope: "aimind:contacto" }
authorization_uri: https://aimind.cl/api/oauth?accion=authorize
authorization_request:
  response_type: code
  required_params: [client_id, redirect_uri, code_challenge, code_challenge_method=S256]
  optional_params: [state, scope]
token_uri: https://aimind.cl/api/oauth?accion=token
token_request:
  method: POST
  grant_type: authorization_code
  required_params: [code, redirect_uri, code_verifier]
  response: { access_token: <Bearer>, token_type: Bearer, expires_in: 3600 }
methods:
  - dynamic_client_registration
  - authorization_code
  - pkce_s256
credential_types_supported:
  - oauth2_access_token
scopes:
  - aimind:contacto
protected_resources:
  - https://aimind.cl/api/mcp-agente
metadata_uri: https://aimind.cl/.well-known/oauth-authorization-server
resource_metadata_uri: https://aimind.cl/.well-known/oauth-protected-resource
documentation_uri: https://aimind.cl/auth.md
human_consent_required: true
token_lifetime_seconds: 3600
revocation_uri: null
claims_uri: null
contact: https://aimind.cl/#contacto
```

**Los pasos:**

1. **Registro** — `POST /api/oauth?accion=register` con `client_name` y `redirect_uris` (solo
   `https`, o `localhost` para desarrollo). Devuelve un `client_id`.
2. **Autorización** — el agente lleva a la persona a `/api/oauth?accion=authorize` con
   `response_type=code`, su `client_id`, `redirect_uri`, `state` y `code_challenge` (S256,
   **obligatorio**). Se muestra una pantalla donde una persona aprueba o rechaza: el agente no se
   autoriza a sí mismo.
3. **Token** — `POST /api/oauth?accion=token` con el código y el `code_verifier`. Devuelve un token
   Bearer que dura una hora.
4. **Uso** — `Authorization: Bearer <token>` contra `https://aimind.cl/api/mcp-agente`.

Sin token, ese endpoint responde `401` con la cabecera `WWW-Authenticate` apuntando al metadata del
recurso (RFC 9728), para que el agente descubra solo dónde autorizarse.

## Qué puede hacer un agente autorizado

| Herramienta | Qué hace |
|---|---|
| `solicitar_conversacion` | Deja una solicitud de conversación inicial a nombre de una persona. Llega al mismo buzón que el formulario del sitio. |
| `consultar_asistente` | Pregunta al asistente de aimind.cl sobre servicios, soluciones, industrias o equipo. |

Nada más. No accede a datos de clientes, no modifica el sitio y no puede leer correo.

Las solicitudes que entran por esta vía llegan **marcadas como originadas en un agente**. No se hace
pasar un agente por una persona llenando un formulario.

## Límites de uso

Sin cuota declarada. Se pide un uso razonable: el contenido cambia con poca frecuencia y admite
caché. El asistente tiene un límite por IP para frenar abuso obvio.

## Contacto

Para integraciones que requieran más que lectura pública: WhatsApp **+56 9 6422 0811** o el
formulario en https://aimind.cl/#contacto
