> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Extender Narya

> Agrega servidores de herramientas, árboles de herramientas de OpenAPI, scripts confinados, agentes, skills, comandos y hooks, o maneja Narya a través de su API local.

Narya tiene dos superficies públicas de extensión: la API del host sobre un socket Unix, y los scripts confinados. Alrededor de ellas están los recursos que declaras en archivos.

## Servidores de herramientas MCP

***

Declara un servidor como `[tool_servers.<name>]` en `config.toml`. Dale exactamente un transporte. `command` lanza un proceso y habla stdio. `url` habla HTTP streamable sobre https, o sobre http en loopback. Una declaración con ambos, o sin ninguno, se niega a cargar.

```toml theme={null}
[tool_servers.filesystem]
command = ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/repo"]
env = { PATH = "/usr/local/bin:/usr/bin:/bin", HOME = "/home/you" }
```

<Warning>
  `env` reemplaza el entorno del hijo. No se suma a él. El hijo no hereda nada, ni siquiera `PATH` y `HOME`. Declara ambos para cualquier servidor `npx` o `uvx`, o el hijo termina antes de servir una herramienta.
</Warning>

Las demás claves son `dir`, `headers`, `oauth`, `timeout_ms` y `enabled`. Cada servidor declarado se conecta al arrancar a menos que definas `enabled = false`.

Narya mantiene una sesión de larga vida por servidor y se reconecta con backoff. Cuando un servidor se desconecta, Narya retira sus herramientas del registro, así que el modelo nunca ve las herramientas de un servidor que se fue.

Define `oauth = true` para un servidor remoto que inicia sesión. Narya mantiene la conexión abierta, imprime la URL de autorización y escucha en `127.0.0.1:7666` el callback mientras el inicio de sesión está abierto. Un inicio de sesión que nadie responde cuesta ese único servidor y nada más. Una ejecución de un solo turno no puede completar un inicio de sesión, y lo dice.

<Warning>
  Un servidor de herramientas declarado se ejecuta bajo la regla `tool`, que el conjunto incluido permite. Las reglas de escritura y de secretos de Narya no se aplican a lo que el propio servidor lee o escribe. Acótalo con `ask tool <name>` o `deny tool <name>`.
</Warning>

## Árboles de herramientas de OpenAPI

***

Declara `[tool_trees.<name>]` para convertir un documento OpenAPI en un árbol de herramientas invocable. Las claves son `spec`, `base_url`, `headers`, `timeout_ms` y `enabled`. Una ruta `spec` relativa se resuelve contra tu home de Narya. Define `base_url` cuando el documento no declara un servidor propio. Narya deriva las herramientas una vez al arrancar. No se ejecuta ningún servidor, y ninguna sesión se reconecta.

## Scripts confinados

***

Narya ejecuta ECMAScript en un motor confinado. El motor no alcanza ningún sistema de archivos, ninguna red, ningún entorno ni ningún cargador de módulos. No tiene evaluación dinámica. La profundidad de llamadas se detiene en 4,096, y el código fuente se detiene en 256 KiB. Tres llamadores lo usan: la herramienta `run_program` del modelo, los workflows y el descubrimiento de herramientas.

## La API del host

***

El host sirve una API HTTP sobre un socket Unix, y cada cliente la maneja. [La API del host](/es/platform/narya/the-host-api) describe el transporte, el stream de eventos y los envelopes.

## Agentes, skills, comandos y hooks

***

Narya lee los formatos propios de Claude Code sin ningún cambio.

**Los agentes** son archivos markdown con frontmatter YAML. `name` es el único campo que un archivo debe llevar. Los demás son `description`, `prompt`, `tools`, `model`, `mode` y `hidden`. `tools` es una lista de permitidos y nunca una concesión: Narya intersecta la lista de un hijo con la de su padre, así que un agente hijo puede perder herramientas, nunca ganarlas.

Narya lee los agentes desde tu home de Narya, luego `~/.claude/agents`, luego los `.claude/agents` y `.narya/agents` de un repositorio en el que confías. Cuatro agentes vienen con el binario: `explore`, `general`, `plan` y `review`.

**Las skills** siguen el estándar Agent Skills: un directorio que contiene un `SKILL.md`. Narya lee la misma jerarquía, `~/.claude/skills` incluido, y la vuelve a leer en cada solicitud. Una skill que agregas a mitad de sesión llega al siguiente turno.

**Los comandos** vienen de tu home de Narya, de `~/.claude/commands`, y de los `.claude/commands` y `.narya/commands` de un repositorio en el que confías.

**Los hooks** vienen de la tabla `hooks` de `~/.claude/settings.json`, y del mismo archivo en un repositorio en el que confías. Narya los lee con las claves de stdin y los códigos de salida que esos scripts ya usan. Cuatro eventos tienen equivalencia: `PreToolUse`, `PostToolUse`, `UserPromptSubmit` y `SessionStart`. Cinco no tienen equivalente, así que Narya los omite y escribe una línea en el error estándar: `Stop`, `SubagentStop`, `Notification`, `PreCompact` y `SessionEnd`.

<Warning>
  Tres diferencias no tienen solución alternativa. Narya lee la salida de un hook solo para obtener un veredicto, así que `additionalContext` nunca llega al contexto del modelo. `systemMessage` no va a ninguna parte. Un hook leído desde `settings.json` siempre falla en modo permisivo: un hook que agota su timeout, sale con un código distinto de cero o imprime una salida que Narya no puede leer deja pasar la llamada, y este formato no tiene ningún campo para cambiar eso. Su `tool_response` llega como una cadena, no como un objeto.
</Warning>

## Los hooks propios de Narya

***

Declara `[[hooks]]` en `config.toml` con `point`, `command`, `timeout_ms`, `fail` y `match`. `fail` no tiene valor predeterminado, así que decláralo. `match` filtra un hook `before-tool-call` a un solo nombre de herramienta.

Cuatro puntos deciden, y un hook ahí puede detener lo que tiene delante:

`before-tool-call`, `before-model-request`, `after-tool-call`, `at-permission-ask`.

Ocho puntos observan, y un hook ahí se entera de lo que pasó sin cambiarlo:

`session-started`, `lane-started`, `lane-finished`, `delegation-created`, `child-asked`, `skill-invoked`, `permission-denied`, `session-compacted`.

El archivo propio de un repositorio no puede declarar `at-permission-ask`.

## Delegación

***

La delegación es una llamada a herramienta. Define sus límites en `[delegation]` en `config.toml`. La clave `max_depth` cuenta los niveles por debajo de tu conversación, y `0` desactiva la delegación. Define `max_concurrent` para acotar cuántas lanes ejecuta una conversación en cualquier instante.
