Documentação do Strata
Strata é uma plataforma de edição de documentos com IA. Envie documentos Markdown ou HTML para visualização, comentários e edição com um modelo de documento baseado em seções projetado para edição granular por IA via MCP (Model Context Protocol).
Início Rápido
Conecte seu cliente de IA ao servidor MCP do Strata para ler, editar, pesquisar e gerenciar documentos. A maioria dos clientes lida com OAuth automaticamente — basta fornecer a URL do servidor.
Detalhes de Conexão
- URL do Servidor MCP
https://api.strata.space/mcp- Autenticação
- OAuth 2.1 with Dynamic Client Registration
- Ferramentas Disponíveis
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
Configuração do Cliente
Usando Claude Code? O plugin do Strata é o caminho mais rápido: registra o servidor MCP e adiciona as skills de Spaces em um único comando.
Claude Desktop
Adicione ao seu claude_desktop_config.json:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}A autenticação OAuth é tratada automaticamente — você será solicitado a entrar no primeiro uso.
Claude Code
Adicione o servidor MCP do Strata via CLI:
claude mcp add strata https://api.strata.space/mcpA autenticação OAuth é tratada automaticamente via seu navegador.
Cursor
Adicione ao ~/.cursor/mcp.json ou .cursor/mcp.json:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp"
}
}
}O Cursor lida com OAuth automaticamente quando o servidor retorna 401.
VS Code (Copilot)
Adicione ao .vscode/mcp.json no seu projeto:
{
"servers": {
"strata": {
"type": "http",
"url": "https://api.strata.space/mcp"
}
}
}Requer VS Code 1.101+. Usa "servers" (não "mcpServers") e tipo "http". OAuth com PKCE e Registro Dinâmico de Cliente é tratado automaticamente.
Windsurf
Adicione ao ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"strata": {
"serverUrl": "https://api.strata.space/mcp"
}
}
}Windsurf usa serverUrl em vez de url. OAuth é tratado automaticamente.
Cline
Abra o painel de Servidores MCP no Cline e adicione à configuração:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp",
"type": "streamableHttp"
}
}
}Usa "streamableHttp" (camelCase). Quando OAuth é necessário, o Cline mostra um botão Autenticar.
Continue
Adicione ao ~/.continue/config.yaml:
mcpServers:
- name: strata
command: npx
args:
- "-y"
- "mcp-remote"
- "https://api.strata.space/mcp"O Continue ainda não suporta OAuth nativamente. Use a ponte mcp-remote (veja abaixo).
Zed
Adicione ao settings.json do Zed:
{
"context_servers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}O Zed não suporta OAuth nativamente. Usa mcp-remote como ponte stdio que lida com o fluxo OAuth no seu navegador.
Claude.ai e ChatGPT
Esses produtos de chat renderizam o editor do Strata diretamente como conector personalizado. Cole a URL do servidor MCP acima nas configurações de conectores do host.
Claude.ai
Configurações → Conectores → Adicionar conector personalizado
Disponível em planos pagos. Conectores de organização são adicionados por um Proprietário.
ChatGPT
Configurações → Conectores → Criar
Requer o Modo Desenvolvedor (Configurações → Apps e Conectores → Avançado). Plus, Pro ou Enterprise.
Alternativa Universal (mcp-remote)
Para qualquer cliente sem suporte nativo a OAuth, use mcp-remote como ponte stdio. Ele lida com todo o fluxo OAuth e funciona com qualquer cliente MCP:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}O estado de autenticação é persistido em ~/.mcp-auth/ para que você só precise autenticar uma vez por servidor.
Próximos Passos
Veja a Referência de Ferramentas MCP para documentação completa de todas as ferramentas disponíveis e seus parâmetros.
Design do blog
Use um mapa blog: no primeiro bloco de metadados YAML para definir a aparência de um post publicado. O painel de aparência edita esse mesmo texto e preserva as outras chaves e comentários.
A prévia acompanha o rascunho. Publicar salva o design completo, incluindo os padrões herdados da publicação; alterações posteriores no rascunho ou no tema do perfil não modificam essa versão. Apresentações usam suas próprias configurações. Os metadados ficam ocultos nas páginas públicas e nas descrições.
Chaves desconhecidas em blog:, YAML malformado, valores inválidos, referências ausentes ou duplicadas e contraste insuficiente impedem a publicação. Corrija todos os erros; edições por agentes retornam resultados blogValidation. Redefina uma configuração para herdar seu padrão. Por padrão, o sumário fica oculto e a superfície de leitura é opaca.
O resumo aceita até 160 caracteres; as tags, até 10 itens com 32 caracteres cada. Nomes de séries aceitam 80 caracteres e exigem uma ordem inteira positiva. Nomes exatos agrupam os posts; ordens duplicadas geram avisos. noindex mantém o post no perfil e nos feeds, mas o remove do mapa do site e solicita que os buscadores não o indexem. cover nomeia uma imagem do documento; use <!-- strata:name=cover --> imediatamente antes da imagem.
As cores exigem valores #RRGGBB entre aspas para os modos claro e escuro. background colore a superfície de leitura e, sem papel de parede, a página. Texto e links accent devem atingir contraste de 4.5:1 na superfície real em ambos os modos. As fontes vêm da lista abaixo. Uma superfície translúcida usa 88% de opacidade e só é permitida sobre cores ou gradientes com contraste suficiente em toda a extensão.
Escolha um único tipo de papel de parede. Gradientes aceitam de 2 a 5 cores; padrões usam os nomes abaixo. O papel de parede de imagem nomeia uma imagem do documento. O de HTML nomeia um bloco html e exige uma cor ou imagem estática de reserva. Ele é executado atrás do artigo no ambiente isolado existente, não recebe cliques ou foco e para quando a aba fica oculta. Movimento ou dados reduzidos, dispositivos limitados, prévias HTML desativadas e falhas ativam a reserva. Impressão e PDF omitem o papel de parede. HTML ou CSS direto na página e posts totalmente em HTML não são aceitos.
Blocos HTML com uses="frontmatter" leem strata.data.get("frontmatter").values. As chaves resolvidas são blog.typography, blog.palette, blog.readingWidth, blog.blockControls, blog.tableOfContents, blog.readingSurface, blog.accent, blog.background, blog.fonts.heading e blog.fonts.body. As cores seguem o modo atual. Fontes não configuradas são omitidas. Blocos publicados recebem apenas esses valores; outros metadados escalares só ficam disponíveis no editor. Um papel de parede recebe apenas esses valores e o modo de cor, nunca outros dados do documento.
Campos e 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
Exemplo completo de papel de parede 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>
```Blocos HTML interativos
Blocos de código marcados como html são renderizados como pré-visualizações ao vivo e isoladas no editor do Strata e nos PDFs exportados — gráficos, diagramas, cenas 3D e pequenos widgets interativos, escritos como código delimitado comum.
Escreva um bloco de código delimitado com a tag de linguagem html. Sua marcação, estilos e scripts rodam automaticamente em uma pré-visualização isolada; cada edição renderiza de novo a partir de um estado limpo, e os leitores podem alternar entre a pré-visualização e o código-fonte.
A pré-visualização é totalmente isolada: sem cookies ou armazenamento, sem acesso à página ao redor e sem URLs externas. WebSocket, beacons e envios de formulário são removidos por completo, e o fetch alcança apenas os recursos verificados em /sandbox/ listados abaixo, que é como o motor do Doom carrega os próprios dados de jogo. Tudo que violar essas restrições falha dentro da própria pré-visualização e em nenhum outro lugar.
Os tokens de design do Strata vêm pré-carregados: variáveis CSS como var(--color-foreground), var(--color-muted-foreground), var(--color-primary) e var(--color-border) correspondem ao tema do aplicativo, e a pré-visualização segue automaticamente o modo claro ou escuro de quem está lendo. As cores que você mesmo define são usadas exatamente como você as escreve e nunca são ajustadas, então defina o fundo e o texto juntos — um bloco que define apenas um dos dois pode acabar ilegível no modo que você não testou.
Uma pré-visualização começa com cerca de 360 pixels de altura e depois acompanha o próprio conteúdo: conteúdo mais alto faz o bloco crescer, conteúdo mais curto o encolhe. Essa altura inicial também é a referência para as unidades relativas, então height: 100%, 100vh e window.innerHeight funcionam — que é justamente o que as cenas do three.js e os gráficos que ocupam todo o bloco costumam usar.
Erros de script, rejeições de promessa não tratadas e a saída de console.error/console.warn vinda de dentro da pré-visualização são coletados e exibidos abaixo dela, com números de linha quando o navegador os informa. Uma pré-visualização não tem ferramentas de desenvolvedor próprias, então é neste painel que um bloco explica por que não foi renderizado.
Gráficos com dados do documento
Um bloco pode ler dados que já vivem no mesmo documento, de modo que um gráfico continua alinhado aos números que seus leitores veem. Quatro tipos de fonte podem ser nomeados. Um bloco de código json, csv, tsv ou yaml é nomeado na própria linha de abertura, por exemplo com name=sales. Uma tabela é nomeada por uma linha de comentário HTML colocada imediatamente acima dela: <!-- strata:name=headcount -->. O frontmatter do documento está sempre disponível sob o nome reservado frontmatter, apenas com campos escalares. Uma imagem do documento é nomeada como uma tabela, por uma linha de comentário HTML colocada imediatamente acima dela: <!-- strata:name=hero -->. No editor, selecione a imagem e use Nome para dados. Esses quatro tipos são os únicos dados aos quais um bloco pode se vincular. Um nome começa com uma letra, continua com letras, dígitos, hifens ou sublinhados, tem no máximo 64 caracteres e precisa ser único dentro do documento.
Um bloco html declara o que consome na própria linha de abertura, por exemplo com uses="sales,headcount". O bloco recebe somente as fontes que nomeia e nunca o restante do documento, não alcança dados de outro documento e nada chega até ele que o leitor já não possa ver neste documento. Editar o código do bloco ou sua declaração recarrega a pré-visualização a partir de um estado limpo. Editar apenas os dados por trás de um nome já declarado atualiza a pré-visualização em execução no lugar. Um bloco declara no máximo oito nomes, e qualquer nome depois do oitavo chega como unavailable com o motivo oversize em vez de ser descartado em silêncio.
Dentro da pré-visualização, os dados declarados são instalados como strata.data antes que seus próprios scripts sejam executados. strata.data.get(name) devolve uma fonte e strata.data.names lista os nomes declarados pelo bloco, na ordem da declaração. Uma fonte json, csv, tsv ou yaml chega sem análise, como { kind: 'text', format, text }, então o próprio bloco a analisa com o parser que preferir. Uma tabela chega como { kind: 'table', columns, rows }, com cada célula em texto puro e sem conversão numérica ou de data. O frontmatter chega como { kind: 'frontmatter', values }. Todos os valores entregues estão profundamente congelados. Quando uma fonte vinculada muda, o Strata envia um novo instantâneo e dispara o evento strata:data em window, cujo detail carrega os dados novos. strata.data.get já devolve esse instantâneo no momento em que o evento é disparado. A pré-visualização nunca pede dados por conta própria, portanto um bloco que ignora o evento continua funcionando com o que recebeu no início.
Uma imagem chega como { kind: 'image', url, width, height, alt }, em que url é uma URL de dados que carrega os bytes da própria imagem, de modo que um bloco pode atribuí-la direto a um elemento img sem nenhum acesso à rede. O Strata busca esses bytes com o acesso do próprio leitor e os incorpora antes de a pré-visualização começar; a pré-visualização nunca vê um link que pudesse seguir nem pede uma imagem por conta própria. As imagens têm orçamento próprio: uma imagem pode entregar até 3 MiB e todas as imagens de uma pré-visualização até 12 MiB somadas, descartando primeiro as maiores se esse orçamento acabar. Uma imagem cujos bytes não puderam ser obtidos chega como unavailable com o motivo unreachable. Uma apresentação pode mostrar uma imagem nomeada sem nenhum código: uma linha de abertura de slide escrita como layout=image uses="hero" a desenha em tela cheia e lê a legenda do corpo do slide.
Qual tipo escolher depende de quem mais precisa ler os números. Um bloco json ou csv é compacto, compara bem entre versões e mantém uma série longa fora do texto, mas chega como texto puro e cabe ao bloco analisá-lo; dividir uma linha csv pelas vírgulas é o erro clássico, porque rompe qualquer campo entre aspas que contenha uma. Uma tabela nomeada faz a troca oposta: os leitores veem uma tabela de verdade em vez de um bloco de código, e o bloco a recebe já separada, com a primeira linha como columns e cada linha seguinte em rows. O frontmatter serve para valores isolados, como um título ou uma meta, e não para uma série.
Um nome declarado que não pode ser resolvido chega mesmo assim, como { kind: 'unavailable', reason }, para que o bloco distinga um conjunto de dados vazio de um ausente. O motivo é unknown quando nenhuma fonte do documento carrega aquele nome, duplicate quando duas fontes reivindicam o mesmo nome, removed quando a fonte foi excluída com a pré-visualização aberta, oversize quando a fonte ultrapassa os limites de entrega e unreachable quando não foi possível obter os bytes de uma imagem. Apenas a fonte afetada é descartada e as demais continuam chegando, então verifique o tipo unavailable e mostre uma mensagem em vez de supor que os dados estão lá.
Bibliotecas aprovadas
/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.
Nenhuma outra URL externa de script ou de estilo carrega dentro da pré-visualização. Para fixar uma versão, insira -<version> antes de .min.js (versões mais antigas continuam disponíveis).
Exemplo
<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>Exemplo: um gráfico vinculado a um bloco 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>
```Exemplo: um gráfico vinculado a um bloco 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>
```Exemplo: um gráfico vinculado a uma tabela do 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>
```Exemplo: uma imagem vinculada a uma imagem do 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 do agente
A definição de um agente é um documento Markdown na sua pasta /Agents. O frontmatter YAML declara a identidade do agente, a lista de ferramentas permitidas e a visibilidade ao orquestrador; o corpo abaixo do frontmatter é o prompt de sistema que o orquestrador entrega literalmente à solicitação do usuário. Cada campo é validado no servidor ao salvar.
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
autoInvokable | boolean | Opcional | false | Quando true, o orquestrador do chat pode escolher este agente por conta própria caso a descrição corresponda à solicitação do usuário. Quando false (padrão), o agente só roda em invocação explícita (@mention, MCP invoke_agent ou uma fonte conectada). |
connectorAccounts | object | Opcional | — | Owner's personal account selected for each connector kind. |
description | string | Obrigatório | — | Resumo em uma frase de quando usar este agente. Aparece no catálogo de invocação automática do orquestrador e no seletor @mention — seja específico sobre a função do agente. |
enabled | boolean | Opcional | true | Interruptor principal. Quando false, o agente fica oculto em todas as superfícies de invocação mesmo que o frontmatter esteja válido em todo o resto. |
model | string | Opcional | — | Substituição opcional do modelo em que o agente roda. Se omitido, usa o padrão da plataforma. Precisa ser resolvível pelo registro de modelos da plataforma. |
name | string | Obrigatório | — | Identificador em kebab-case ([a-z0-9-]), exclusivo entre os seus agentes e sem colidir com nomes reservados pela plataforma. Define o token @mention no chat e o 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 ferramentas da plataforma que o agente pode chamar (ex.: read_document, search_space). O painel "Ferramentas disponíveis" no banner do agente lista todos os nomes válidos. Deixe vazia ou omita para não conceder ferramentas. |
Exemplo
---
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 do prompt
Um modelo de prompt é um documento Markdown na sua pasta /Prompts. O frontmatter YAML declara nome, descrição, argumentos e visibilidade ao orquestrador; o corpo abaixo do frontmatter é o modelo do prompt — placeholders {{argument}} são substituídos no momento da renderização. Os valores dos argumentos são coletados pela folha de slash do compositor de chat ou pela requisição MCP prompts/get.
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
arguments | PromptArgument[] | Opcional | [] | Lista ordenada de entradas `PromptArgument` que o corpo do prompt referencia por meio de marcadores `{{name}}`. A ordem é preservada na API para que o seletor de barra exiba os campos na ordem escolhida pelo autor. Máximo de 16 entradas. |
autoInvokable | boolean | Opcional | false | Quando true, o orquestrador do chat pode escolher este prompt por conta própria caso a descrição corresponda à intenção do usuário. Quando false (padrão), o prompt só roda quando o usuário digita o token de slash ou um cliente invoca MCP prompts/get. |
description | string | Obrigatório | — | Resumo em uma frase do que o prompt faz. Aparece no menu de slash, em MCP prompts/list e (quando autoInvokable: true) no catálogo de ferramentas do orquestrador. |
name | string | Obrigatório | — | Título legível do prompt. A forma sluguificada vira o token /prompt:<slug> exibido no menu de slash do compositor de chat. |
PromptArgument
Cada entrada do array `arguments` acima tem o seguinte formato:
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
description | string | Obrigatório | — | 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 | Obrigatório | — | 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. |
Exemplo
---
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 modelos
Um modelo de documento é um documento Markdown dentro de uma pasta de modelos. O frontmatter YAML declara o nome, as variáveis tipadas e o contrato de seções; o corpo abaixo do frontmatter é o conteúdo reutilizável — os marcadores {{key}} são substituídos ao criar um documento a partir do modelo, pela galeria, pela ação MCP createFromTemplate ou pela ferramenta de agente create_document_from_template.
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
description | string | Obrigatório | — | 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 | Obrigatório | — | 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 do array `variables` acima tem o seguinte formato:
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
key | string | Obrigatório | — | 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 | Obrigatório | — | 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 do array `sections` acima tem o seguinte formato:
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
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 | Obrigatório | — | Section title. Matches a heading in the template body verbatim. |
Exemplo
---
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…