Documentación de Strata
Strata es una plataforma de edición de documentos potenciada por IA. Sube documentos Markdown o HTML para verlos, comentarlos y editarlos con un modelo de documento basado en secciones diseñado para la edición granular por IA a través de MCP (Model Context Protocol).
Inicio rápido
Conecta tu cliente de IA al servidor MCP de Strata para leer, editar, buscar y gestionar documentos. La mayoría de los clientes manejan OAuth automáticamente — solo proporciona la URL del servidor.
Detalles de conexión
- URL del servidor MCP
https://api.strata.space/mcp- Autenticación
- OAuth 2.1 with Dynamic Client Registration
- Herramientas disponibles
app_get_section_content,browse_connector_resources,edit_document,export_presentation,find,get_agent_status,get_company_theme,get_document_graph,get_image,get_presence,get_publish_status,invoke_agent,invoke_connector_action,list_company_themes,list_connected_tools,manage_comments,manage_suggestions,publish_document,read_document,unpublish_document,validate_presentation
Configuración del cliente
¿Usas Claude Code? El plugin de Strata es el camino más rápido: registra el servidor MCP y añade las skills de Spaces en un solo comando.
Claude Desktop
Agrega lo siguiente a tu claude_desktop_config.json:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}La autenticación OAuth se maneja automáticamente — se te pedirá iniciar sesión en el primer uso.
Claude Code
Agrega el servidor MCP de Strata a través de la CLI:
claude mcp add strata https://api.strata.space/mcpLa autenticación OAuth se maneja automáticamente a través de tu navegador.
Cursor
Agrega a ~/.cursor/mcp.json o .cursor/mcp.json:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp"
}
}
}Cursor maneja OAuth automáticamente cuando el servidor responde con 401.
VS Code (Copilot)
Agrega a .vscode/mcp.json en tu proyecto:
{
"servers": {
"strata": {
"type": "http",
"url": "https://api.strata.space/mcp"
}
}
}Requiere VS Code 1.101+. Usa "servers" (no "mcpServers") y tipo "http". OAuth con PKCE y registro dinámico de clientes se maneja automáticamente.
Windsurf
Agrega a ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"strata": {
"serverUrl": "https://api.strata.space/mcp"
}
}
}Windsurf usa serverUrl en lugar de url. OAuth se maneja automáticamente.
Cline
Abre el panel de servidores MCP en Cline y agrega a la configuración:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp",
"type": "streamableHttp"
}
}
}Usa "streamableHttp" (camelCase). Cuando se requiere OAuth, Cline muestra un botón de Autenticar.
Continue
Agrega a ~/.continue/config.yaml:
mcpServers:
- name: strata
command: npx
args:
- "-y"
- "mcp-remote"
- "https://api.strata.space/mcp"Continue aún no soporta OAuth de forma nativa. Usa el puente mcp-remote en su lugar (ver abajo).
Zed
Agrega a tu settings.json de Zed:
{
"context_servers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}Zed no soporta OAuth de forma nativa. Usa mcp-remote como puente stdio que maneja el flujo de OAuth en tu navegador.
Claude.ai y ChatGPT
Estos productos de chat renderizan el editor de Strata directamente como conector personalizado. Pega la URL del servidor MCP de arriba en los ajustes de conectores del host.
Claude.ai
Ajustes → Conectores → Añadir conector personalizado
Disponible en planes de pago. Los conectores de organización los añade un Propietario.
ChatGPT
Ajustes → Conectores → Crear
Requiere el Modo para desarrolladores (Ajustes → Apps y conectores → Avanzado). Plus, Pro o Enterprise.
Alternativa universal (mcp-remote)
Para cualquier cliente sin soporte nativo de OAuth, usa mcp-remote como puente stdio. Maneja el flujo completo de OAuth y funciona con cualquier cliente MCP:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}El estado de autenticación se persiste en ~/.mcp-auth/ para que solo te autentiques una vez por servidor.
Próximos pasos
Consulta la Referencia de herramientas MCP para documentación completa de todas las herramientas disponibles y sus parámetros.
Diseño del blog
Utilice un mapa blog: en el primer bloque de metadatos YAML para diseñar una entrada publicada. El panel de apariencia modifica ese mismo texto y conserva las claves y los comentarios ajenos.
La vista previa sigue al borrador. Publicar guarda el diseño completo, incluidos los valores heredados de la publicación; los cambios posteriores del borrador o del tema del perfil no modifican esa versión. Las presentaciones usan sus propios ajustes. Los metadatos se ocultan en las páginas públicas y las descripciones.
Las claves desconocidas en blog:, el YAML mal formado, los valores inválidos, las referencias ausentes o duplicadas y el contraste insuficiente impiden publicar. Corrija todos los errores; las ediciones del agente devuelven resultados blogValidation. Restablezca un ajuste para heredar su valor predeterminado. Por defecto, el índice está oculto y la superficie de lectura es opaca.
El resumen admite 160 caracteres; las etiquetas, 10 entradas de 32 caracteres. El nombre de una serie admite 80 caracteres y requiere un orden entero positivo. Los nombres exactos agrupan entradas; los órdenes duplicados generan advertencias. noindex mantiene la entrada en el perfil y los feeds, pero la elimina del mapa del sitio y solicita que no se indexe. cover nombra una imagen del documento; asígnele un nombre con <!-- strata:name=cover --> justo antes de la imagen.
Los colores requieren valores #RRGGBB entre comillas para los modos claro y oscuro. background colorea la superficie de lectura y, sin fondo decorativo, la página. El texto y los enlaces accent deben alcanzar un contraste de 4.5:1 sobre la superficie real en ambos modos. Las fuentes se eligen de la lista siguiente. La superficie translúcida tiene un 88% de opacidad y solo se admite sobre colores o degradados cuyo contraste sea suficiente en todo el degradado.
Elija un solo tipo de fondo. Los degradados admiten entre 2 y 5 colores; los patrones usan los nombres siguientes. El fondo de imagen nombra una imagen del documento. El fondo HTML nombra un bloque html y requiere un color o una imagen de respaldo. Se ejecuta tras el artículo en el entorno aislado existente, no recibe clics ni foco y se detiene cuando se oculta la pestaña. El movimiento o los datos reducidos, los dispositivos limitados, las vistas HTML desactivadas y los fallos activan el respaldo. La impresión y el PDF omiten el fondo. No se admite HTML o CSS directo en la página ni entradas completamente HTML.
Los bloques HTML con uses="frontmatter" leen strata.data.get("frontmatter").values. Las claves resueltas son blog.typography, blog.palette, blog.readingWidth, blog.blockControls, blog.tableOfContents, blog.readingSurface, blog.accent, blog.background, blog.fonts.heading y blog.fonts.body. Los colores corresponden al modo actual. Se omiten las fuentes no configuradas. Los bloques publicados solo reciben estos valores de diseño; los demás metadatos escalares están disponibles únicamente en el editor. El fondo solo recibe estos valores y el modo de color, nunca otros datos del documento.
Campos y valores permitidos
blog.typographymodern | editorial | expressive | technicalblog.palettestrata | paperblog.readingWidthfocused | comfortable | wide | fullblog.blockControlsvisible | hiddenblog.tableOfContentsvisible | hiddenblog.accent{ light: "#RRGGBB", dark: "#RRGGBB" }blog.background{ light: "#RRGGBB", dark: "#RRGGBB" }blog.fonts.heading, blog.fonts.bodyManrope | Syne | Fira Code | Georgia | Times New Roman | Arial | Helvetica | Verdana | Trebuchet MS | Palatino | Courier New | IBM Plex Monoblog.summarystring (1…160)blog.coverimage.nameblog.tagsstring[] (0…10 × 1…32)blog.noindextrue | falseblog.series{ name: string (1…80), order: integer (≥1) }blog.wallpaper.color{ light: "#RRGGBB", dark: "#RRGGBB" }blog.wallpaper.gradient{ type: linear | radial, stops: [{ light: "#RRGGBB", dark: "#RRGGBB" }, …] } (2…5)blog.wallpaper.pattern{ name: dots | grid | lines | paper | topographic | stars, tint: { light: "#RRGGBB", dark: "#RRGGBB" } }blog.wallpaper.imageimage.nameblog.wallpaper.htmlcodeBlock.name (language: html)blog.wallpaper.fallback{ color: { light: "#RRGGBB", dark: "#RRGGBB" } } | { image: image.name }blog.readingSurfaceopaque | translucent
Ejemplo completo de fondo HTML
---
blog:
typography: editorial
palette: paper
readingWidth: comfortable
blockControls: hidden
tableOfContents: visible
accent: { light: "#8a3515", dark: "#ffb788" }
background: { light: "#fffdf8", dark: "#272119" }
fonts: { heading: Georgia, body: Georgia }
summary: "An astronomy journal about the night sky."
tags: [astronomy, observation]
noindex: false
series: { name: "Night notes", order: 1 }
readingSurface: opaque
wallpaper:
html: starfield
fallback:
color: { light: "#e7e0d4", dark: "#111827" }
---
# Night notes
Our first observing session began at twilight.
## The northern sky
The article stays on an opaque reading surface above the animation.
```html name=starfield uses="frontmatter"
<style>
html, body { margin: 0; width: 100%; height: 100%; overflow: hidden; }
canvas { display: block; width: 100%; height: 100%; }
</style>
<canvas id="sky"></canvas>
<script>
const canvas = document.getElementById('sky');
const ctx = canvas.getContext('2d');
let color = '#8a3515';
function readDesign() {
const source = strata.data.get('frontmatter');
if (source?.kind === 'frontmatter') color = source.values['blog.accent'];
}
readDesign();
window.addEventListener('strata:data', readDesign);
function paint(time) {
const width = canvas.clientWidth, height = canvas.clientHeight;
if (canvas.width !== width || canvas.height !== height) {
canvas.width = width;
canvas.height = height;
}
ctx.clearRect(0, 0, width, height);
ctx.fillStyle = color;
for (let i = 0; i < 90; i++) {
ctx.globalAlpha = 0.25 + 0.25 * Math.sin(time / 1800 + i);
ctx.beginPath();
ctx.arc((i * 137.508 % 100) / 100 * width,
(i * 71.37 % 100) / 100 * height, 1 + i % 2, 0, Math.PI * 2);
ctx.fill();
}
requestAnimationFrame(paint);
}
requestAnimationFrame(paint);
</script>
```Bloques HTML interactivos
Los bloques de código etiquetados como html se muestran como vistas previas en vivo y aisladas en el editor de Strata y en los PDF exportados — gráficos, diagramas, escenas 3D y pequeños widgets interactivos, escritos como código delimitado normal.
Escribe un bloque de código delimitado con la etiqueta de lenguaje html. Su marcado, estilos y scripts se ejecutan automáticamente en una vista previa aislada; cada edición vuelve a renderizar desde un estado limpio, y los lectores pueden alternar entre la vista previa y el código fuente.
La vista previa está completamente aislada: sin cookies ni almacenamiento, sin acceso a la página que la contiene y sin URL externas. WebSocket, beacons y envíos de formulario se eliminan por completo, y fetch solo alcanza los recursos verificados de /sandbox/ que se enumeran abajo, que es como el motor de Doom carga sus propios datos de juego. Todo lo que incumpla estas restricciones falla dentro de su propia vista previa y en ningún otro sitio.
Los tokens de diseño de Strata vienen precargados: variables CSS como var(--color-foreground), var(--color-muted-foreground), var(--color-primary) y var(--color-border) coinciden con el tema de la aplicación, y la vista previa sigue automáticamente el modo claro u oscuro del lector. Los colores que definas se usan exactamente como los escribes y nunca se ajustan, así que define juntos el fondo y el texto — un bloque que solo define uno de los dos puede acabar siendo ilegible en el modo que no hayas probado.
Una vista previa empieza con unos 360 píxeles de alto y luego se adapta a su contenido: un contenido más alto hace crecer el bloque y uno más corto lo encoge. Esa altura inicial es también la referencia con la que se resuelven las unidades relativas, así que height: 100%, 100vh y window.innerHeight funcionan todos — que es justo lo que suelen usar las escenas de three.js y los gráficos que ocupan todo el bloque.
Los errores de script, los rechazos de promesas no gestionados y la salida de console.error/console.warn producidos dentro de la vista previa se recopilan y se muestran debajo de ella, con los números de línea cuando el navegador los indica. Una vista previa no tiene herramientas de desarrollo propias, así que este panel es donde un bloque explica por qué no se ha renderizado.
Graficar datos del documento
Un bloque puede leer datos que ya viven en el mismo documento, de modo que un gráfico concuerda con las cifras que sus lectores ven. Se pueden nombrar cuatro tipos de fuente. Un bloque de código json, csv, tsv o yaml se nombra en su propia línea de apertura, por ejemplo con name=sales. Una tabla se nombra mediante una línea de comentario HTML colocada inmediatamente encima: <!-- strata:name=headcount -->. El frontmatter del documento siempre está disponible bajo el nombre reservado frontmatter, solo con campos escalares. Una imagen del documento se nombra igual que una tabla, con una línea de comentario HTML colocada inmediatamente encima: <!-- strata:name=hero -->. En el editor, selecciona la imagen y usa Nombre para datos. Esos cuatro tipos son los únicos datos a los que un bloque puede vincularse. Un nombre empieza por una letra, continúa con letras, dígitos, guiones o guiones bajos, ocupa como máximo 64 caracteres y debe ser único dentro del documento.
Un bloque html declara lo que consume en su propia línea de apertura, por ejemplo con uses="sales,headcount". El bloque recibe únicamente las fuentes que nombra y nunca el resto del documento, no puede alcanzar datos de otro documento y no le llega nada que su lector no pueda ver ya en este. Editar el código del bloque o su declaración recarga la vista previa desde un estado limpio. Editar solo los datos detrás de un nombre ya declarado actualiza la vista previa en marcha sin reiniciarla. Un bloque declara ocho nombres como máximo, y cualquier nombre a partir del noveno llega como unavailable con el motivo oversize en lugar de descartarse en silencio.
Dentro de la vista previa, los datos declarados se instalan como strata.data antes de que se ejecuten tus propios scripts. strata.data.get(name) devuelve una fuente y strata.data.names enumera los nombres declarados por el bloque, en el orden de la declaración. Una fuente json, csv, tsv o yaml llega sin analizar como { kind: 'text', format, text }, así que el bloque la analiza con el analizador que prefiera. Una tabla llega como { kind: 'table', columns, rows } con cada celda como texto plano y sin conversión numérica ni de fechas. El frontmatter llega como { kind: 'frontmatter', values }. Todos los valores entregados están congelados en profundidad. Cuando una fuente vinculada cambia, Strata envía una instantánea nueva y dispara el evento strata:data en window, cuyo detail lleva los datos nuevos. strata.data.get ya devuelve esa instantánea cuando el evento se dispara. La vista previa nunca pide datos por su cuenta, así que un bloque que ignore el evento sigue funcionando con lo que recibió al principio.
Una imagen llega como { kind: 'image', url, width, height, alt }, donde url es una URL de datos que lleva los bytes de la propia imagen, de modo que un bloque puede asignarla directamente a un elemento img sin ningún acceso a la red. Strata obtiene esos bytes con el acceso del propio lector y los incrusta antes de que arranque la vista previa; la vista previa nunca ve un enlace que pudiera seguir ni pide una imagen por su cuenta. Las imágenes tienen un presupuesto aparte: una imagen puede entregar hasta 3 MiB y todas las imágenes de una vista previa hasta 12 MiB en conjunto, descartando primero las más grandes si ese presupuesto se agota. Una imagen cuyos bytes no se pudieron obtener llega como unavailable con el motivo unreachable. Una presentación puede mostrar una imagen nombrada sin nada de código: una línea de apertura de diapositiva escrita como layout=image uses="hero" la dibuja a sangre y toma el pie de foto del cuerpo de la diapositiva.
Qué tipo elegir depende de quién más tiene que leer las cifras. Un bloque json o csv es compacto, se compara bien entre versiones y mantiene una serie larga fuera del texto, pero llega como texto en bruto y es el bloque quien se encarga de analizarlo; partir una línea csv por las comas es el error clásico, porque rompe cualquier campo entre comillas que contenga una. Una tabla con nombre ofrece la contrapartida contraria: los lectores ven una tabla de verdad en lugar de un bloque de código, y el bloque la recibe ya separada, con la primera fila como columns y cada fila siguiente en rows. El frontmatter encaja con valores sueltos, como un título o un objetivo, y no con una serie.
Un nombre declarado que no se puede resolver llega igualmente, como { kind: 'unavailable', reason }, para que el bloque distinga un conjunto de datos vacío de uno que falta. El motivo es unknown cuando ninguna fuente del documento lleva ese nombre, duplicate cuando dos fuentes reclaman el mismo nombre, removed cuando la fuente se eliminó con la vista previa abierta, oversize cuando la fuente supera los límites de entrega y unreachable cuando no se pudieron obtener los bytes de una imagen. Solo se descarta la fuente afectada y las demás siguen llegando, así que comprueba el tipo unavailable y muestra un mensaje en lugar de dar por hecho que los datos están ahí.
Bibliotecas aprobadas
/sandbox/libs/mermaid.min.js— <script src="/sandbox/libs/mermaid.min.js"></script> then mermaid.initialize({ startOnLoad: false }); mermaid.run()/sandbox/libs/d3.min.js— <script src="/sandbox/libs/d3.min.js"></script> — global `d3`/sandbox/libs/three.module.min.js— <script type="module">import * as THREE from '/sandbox/libs/three.module.min.js'</script>/sandbox/libs/doom.js— <script src="/sandbox/libs/doom.js"></script> is the whole block: it appends its own canvas and boots. Options go on the script tag: data-doom-warp="1,1", data-doom-skill="3", data-doom-manual (call Doom.start() yourself). To place the canvas, supply one with id="canvas". The reader clicks the preview once to give it keyboard focus; arrows move, Ctrl fires, Esc opens the menu. Music is off, sound effects work. First load pulls about 10 MB, then caches. Chocolate Doom compiled to WebAssembly (GPL-2.0-or-later, github.com/cloudflare/doom-wasm) with Freedoom game data (BSD-3-Clause, github.com/freedoom/freedoom). No commercial or shareware WAD is distributed.
Ninguna otra URL externa de script o de estilos se carga dentro de la vista previa. Para fijar una versión, inserta -<version> antes de .min.js (las versiones anteriores siguen disponibles).
Ejemplo
<div id="chart"></div>
<script src="/sandbox/libs/d3.min.js"></script>
<script>
const data = [4, 8, 15, 16, 23, 42];
d3.select('#chart')
.selectAll('div')
.data(data)
.join('div')
.style('height', '18px')
.style('margin', '2px 0')
.style('background', 'var(--color-primary, #2c7cb0)')
.style('width', (d) => d * 6 + 'px');
</script>Ejemplo: un gráfico vinculado a un bloque json
```json name=sales
[
{ "quarter": "Q1", "revenue": 42 },
{ "quarter": "Q2", "revenue": 58 },
{ "quarter": "Q3", "revenue": 71 }
]
```
```html uses="sales"
<div id="chart"></div>
<script src="/sandbox/libs/d3.min.js"></script>
<script>
function render() {
const source = strata.data.get('sales');
if (!source || source.kind !== 'text') return;
d3.select('#chart')
.selectAll('div')
.data(JSON.parse(source.text))
.join('div')
.style('height', '18px')
.style('margin', '2px 0')
.style('background', 'var(--color-primary, #2c7cb0)')
.style('width', (d) => d.revenue * 6 + 'px');
}
render();
window.addEventListener('strata:data', render);
</script>
```Ejemplo: un gráfico vinculado a un bloque csv
```csv name=signups
week,signups
"Jan 1, 2026",120
"Jan 8, 2026",148
"Jan 15, 2026",173
"Jan 22, 2026",162
```
```html uses="signups"
<div id="chart"></div>
<script src="/sandbox/libs/d3.min.js"></script>
<script>
function render() {
const chart = d3.select('#chart');
chart.selectAll('*').remove();
const source = strata.data.get('signups');
if (!source || source.kind !== 'text') {
chart.text('No signups data.');
return;
}
// A csv source arrives as raw text. text.split(',') would tear
// "Jan 1, 2026" in half; d3.csvParse honours the quotes.
const rows = d3.csvParse(source.text, (row) => ({
week: row.week,
signups: Number(row.signups),
}));
const scale = d3
.scaleLinear()
.domain([0, Math.max(1, d3.max(rows, (d) => d.signups) || 0)])
.range([0, 100]);
const line = chart.selectAll('div').data(rows).join('div');
line
.style('display', 'flex')
.style('align-items', 'center')
.style('gap', '8px')
.style('margin', '2px 0');
line
.append('span')
.style('flex', '0 0 7rem')
.style('color', 'var(--color-muted-foreground, #6b7280)')
.text((d) => d.week);
line
.append('span')
.style('height', '18px')
.style('background', 'var(--color-primary, #2c7cb0)')
.style('width', (d) => scale(d.signups) + '%');
line.append('span').text((d) => d.signups);
}
render();
// Edit a number in the csv block and this chart follows it.
window.addEventListener('strata:data', render);
</script>
```Ejemplo: un gráfico vinculado a una tabla del documento
<!-- strata:name=headcount -->
| Team | People |
| --- | --- |
| Growth | 12 |
| Platform | 27 |
| Support | 8 |
```html uses="headcount"
<div id="chart"></div>
<script>
function render() {
const chart = document.getElementById('chart');
chart.textContent = '';
const source = strata.data.get('headcount');
if (!source || source.kind !== 'table') {
chart.textContent = 'No headcount table.';
return;
}
// columns is the table's first row; rows is everything under it, and
// every cell is a string, so the numbers are yours to convert.
const team = source.columns.indexOf('Team');
const people = source.columns.indexOf('People');
const counts = source.rows.map((row) => Number(row[people]) || 0);
const widest = Math.max(1, ...counts);
source.rows.forEach((row, index) => {
const line = document.createElement('div');
line.style.display = 'flex';
line.style.alignItems = 'center';
line.style.gap = '8px';
line.style.margin = '2px 0';
const label = document.createElement('span');
label.style.flex = '0 0 7rem';
label.style.color = 'var(--color-muted-foreground, #6b7280)';
label.textContent = row[team];
const bar = document.createElement('span');
bar.style.height = '18px';
bar.style.width = (counts[index] / widest) * 100 + '%';
bar.style.background = 'var(--color-primary, #2c7cb0)';
const value = document.createElement('span');
value.textContent = row[people];
line.append(label, bar, value);
chart.append(line);
});
}
render();
// Type a new number into the table and this chart follows it.
window.addEventListener('strata:data', render);
</script>
```Ejemplo: una imagen vinculada a una imagen del documento
<!-- strata:name=hero -->

```html uses="hero"
<figure id="card" style="margin:0"></figure>
<script>
function render() {
const card = document.getElementById('card');
card.textContent = '';
const source = strata.data.get('hero');
if (!source || source.kind !== 'image') {
card.textContent = 'No hero image.';
return;
}
const image = document.createElement('img');
// url already carries the bytes, so this needs no network access.
image.src = source.url;
image.alt = source.alt;
image.style.width = '100%';
image.style.borderRadius = '12px';
const caption = document.createElement('figcaption');
caption.style.color = 'var(--color-muted-foreground, #6b7280)';
caption.textContent = source.width + '×' + source.height;
card.append(image, caption);
}
render();
// Swap the image in the document and this card follows it.
window.addEventListener('strata:data', render);
</script>
```Frontmatter del agente
Una definición de agente es un documento Markdown dentro de tu carpeta /Agents. El frontmatter YAML declara la identidad del agente, la lista de herramientas permitidas y la visibilidad ante el orquestador; el cuerpo debajo del frontmatter es el prompt de sistema que el orquestador entrega textualmente a la solicitud del usuario. Cada campo se valida en el servidor al guardar.
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
autoInvokable | boolean | Opcional | false | Cuando es true, el orquestador del chat puede elegir este agente por su cuenta si su descripción coincide con la solicitud del usuario. Cuando es false (predeterminado), el agente se invoca solo de forma explícita (@mention, MCP invoke_agent o una fuente conectada). |
connectorAccounts | object | Opcional | — | Owner's personal account selected for each connector kind. |
description | string | Obligatorio | — | Resumen en una frase de cuándo usar este agente. Aparece en el catálogo de invocación automática del orquestador y en el selector @mention — sé específico sobre la tarea del agente. |
enabled | boolean | Opcional | true | Interruptor maestro. Cuando es false, el agente queda oculto en toda superficie de invocación incluso si su frontmatter es válido por lo demás. |
model | string | Opcional | — | Reemplazo opcional del modelo en el que se ejecuta el agente. Si se omite, se usa el predeterminado de la plataforma. Debe resolverse contra el registro de modelos de la plataforma. |
name | string | Obligatorio | — | Identificador en kebab-case ([a-z0-9-]), único entre tus agentes y sin colisionar con un nombre de agente reservado por la plataforma. Determina el token @mention en el chat y el argumento agentName de MCP invoke_agent. |
pinnedResources | PinnedResourceSpec[] | Opcional | — | External resources pinned to this agent as standing knowledge. A compact manifest is injected into every run and the bodies are fetched live with the owner's connector grant. Omit or pass an empty list for no pinned knowledge. |
tools | string[] | Opcional | [] | Lista permitida de herramientas de plataforma que el agente puede invocar (p. ej. read_document, search_space). El panel "Herramientas disponibles" dentro del banner del agente enumera todos los nombres válidos. Déjala vacía o omítela para no conceder herramientas. |
Ejemplo
---
name: meeting-notes-summarizer
description: Summarizes meeting notes into a TL;DR with action items.
tools:
- read_document
- search_space
model: claude-sonnet-4-6
color: emerald
enabled: true
autoInvokable: false
---
You are a meeting-notes summarizer. Given the document body the
orchestrator hands you verbatim, produce a one-paragraph TL;DR and a
bulleted action-item list…
Frontmatter del prompt
Una plantilla de prompt es un documento Markdown dentro de tu carpeta /Prompts. El frontmatter YAML declara el nombre, la descripción, los argumentos y la visibilidad ante el orquestador; el cuerpo debajo del frontmatter es la plantilla del prompt — los marcadores {{argumento}} se sustituyen al renderizar. Los valores de los argumentos los recoge la hoja de slash del compositor de chat o la solicitud MCP prompts/get.
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
arguments | PromptArgument[] | Opcional | [] | Lista ordenada de entradas `PromptArgument` que el cuerpo del prompt referencia mediante marcadores `{{name}}`. El orden se conserva en la API para que el menú de barra inclinada muestre los campos en el orden elegido por el autor. Máximo 16 entradas. |
autoInvokable | boolean | Opcional | false | Cuando es true, el orquestador del chat puede elegir este prompt por su cuenta si la descripción coincide con la intención del usuario. Cuando es false (predeterminado), el prompt se ejecuta solo cuando el usuario teclea su token de slash o un cliente invoca MCP prompts/get. |
description | string | Obligatorio | — | Resumen en una frase de lo que hace el prompt. Aparece en el menú de slash, en MCP prompts/list y (cuando autoInvokable: true) en el catálogo de herramientas del orquestador. |
name | string | Obligatorio | — | Título legible del prompt. Su forma slugificada se convierte en el token /prompt:<slug> mostrado en el menú de slash del compositor de chat. |
PromptArgument
Cada entrada del array `arguments` anterior tiene la siguiente forma:
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
description | string | Obligatorio | — | Short human-readable description shown in the slash-picker argument sheet, the MCP `prompts/list` payload, and the `loadUserPrompt` catalog so the user (or the model) knows what to fill in. 1-200 chars. |
name | string | Obligatorio | — | Identifier matched verbatim against the body's `{{name}}` placeholders. Matching is case-sensitive — `{{Focus}}` and `{{focus}}` are distinct placeholders. Restricted to ASCII letters, digits, and underscores (1-48 chars) so the same identifier is valid in YAML and the placeholder grammar. |
required | boolean | Opcional | false | When true, the slash-picker argument sheet blocks submit until a value is supplied; the `loadUserPrompt` catalog also flags it so the model knows it must ask the user to clarify. When false (default), an omitted argument substitutes the empty string into its placeholders at render time. |
Ejemplo
---
name: Summarize document
description: Summarize the active document for a chosen audience.
autoInvokable: false
arguments:
- name: focus
description: What the assistant should focus on.
required: true
- name: audience
description: Target audience for the summary.
required: false
---
Summarize this document for {{audience}}, focusing on {{focus}}. Keep
the summary under 200 words and finish with a short action-items list.
Frontmatter de plantillas
Una plantilla de documento es un documento Markdown dentro de una carpeta de plantillas. El frontmatter YAML declara el nombre, las variables tipadas y el contrato de secciones; el cuerpo bajo el frontmatter es el contenido reutilizable — los marcadores {{key}} se sustituyen al crear un documento desde la plantilla, ya sea desde la galería, la acción MCP createFromTemplate o la herramienta de agente create_document_from_template.
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
description | string | Obligatorio | — | Sentence describing when to use this template. Surfaces in the gallery and in tool catalogs, so be specific about the document shape it produces. |
name | string | Obligatorio | — | Kebab-case identifier, unique among the templates in the same folder. Shown in the gallery alongside the document title. |
sections | TemplateSection[] | Opcional | [] | Section contract: what a conforming instance must contain. Maximum 64 entries. Empty when the template declares no section structure. |
variables | TemplateVariable[] | Opcional | [] | Typed placeholders substituted at instantiation. Order is preserved across the wire so fill-in forms render fields in the author's chosen order. Maximum 16 entries. Empty when the template takes no variables. |
TemplateVariable
Cada entrada del array `variables` anterior tiene esta forma:
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
key | string | Obligatorio | — | Identifier matched verbatim against the body's `{{key}}` placeholders. Matching is case-sensitive. Restricted to ASCII letters, digits, and underscores (1-64 chars) so the same identifier is valid in YAML and the placeholder grammar. |
kind | unknown | Opcional | "text" | Input kind. Defaults to free text. |
label | string | Obligatorio | — | Human-readable label shown on the fill-in form. 1-80 chars. |
required | boolean | Opcional | false | When true, instantiation fails unless a value is supplied. When false (default), an omitted variable substitutes the empty string into its placeholders. |
TemplateSection
Cada entrada del array `sections` anterior tiene esta forma:
| Campo | Tipo | Obligatorio | Valor predeterminado | Descripción |
|---|---|---|---|---|
fill | unknown | Opcional | "required" | Fill discipline for the section. Defaults to required. |
guidance | string | Opcional | "" | Instructions for whoever (or whatever) fills the section in. Optional; shown alongside the section in fill-in surfaces. |
title | string | Obligatorio | — | Section title. Matches a heading in the template body verbatim. |
Ejemplo
---
name: incident-postmortem
description: Standard postmortem with a verbatim escalation matrix.
variables:
- key: incident_id
label: Incident ID
kind: text
required: true
- key: occurred_on
label: Date of incident
kind: date
required: true
sections:
- title: Timeline
guidance: Chronological events from first alert to resolution.
fill: required
- title: Lessons learned
guidance: What we change going forward.
fill: optional
- title: Escalation matrix
fill: verbatim
---
## Timeline
Incident {{incident_id}} on {{occurred_on}}.
## Lessons learned
## Escalation matrix
Page the on-call lead, then the service owner…