Skip to main content
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.
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.
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.
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>.

Á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 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.
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.

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.