Documentazione Strata
Strata è una piattaforma di editing documentale potenziata dall'IA. Carica documenti Markdown o HTML per visualizzarli, commentarli e modificarli con un modello di documento basato su sezioni, progettato per la modifica granulare da parte dell'IA tramite MCP (Model Context Protocol).
Avvio rapido
Collega il tuo client IA al server MCP di Strata per leggere, modificare, cercare e gestire i documenti. La maggior parte dei client gestisce OAuth automaticamente: basta indicare l'URL del server.
Dettagli di connessione
- URL del server MCP
https://api.strata.space/mcp- Autenticazione
- OAuth 2.1 with Dynamic Client Registration
- Strumenti disponibili
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
Configurazione del client
Usi Claude Code? Il plugin Strata è la via più rapida: registra il server MCP e aggiunge le skill per gli Spaces con un solo comando.
Claude Desktop
Aggiungi al tuo claude_desktop_config.json:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}L'autenticazione OAuth è gestita automaticamente: al primo utilizzo ti verrà chiesto di accedere.
Claude Code
Aggiungi il server MCP di Strata dalla CLI:
claude mcp add strata https://api.strata.space/mcpL'autenticazione OAuth è gestita automaticamente tramite il browser.
Cursor
Aggiungi a ~/.cursor/mcp.json oppure a .cursor/mcp.json:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp"
}
}
}Cursor gestisce OAuth automaticamente quando il server risponde 401.
VS Code (Copilot)
Aggiungi a .vscode/mcp.json nel tuo progetto:
{
"servers": {
"strata": {
"type": "http",
"url": "https://api.strata.space/mcp"
}
}
}Richiede VS Code 1.101 o versioni successive. Usa "servers" (non "mcpServers") e il tipo "http". OAuth con PKCE e Dynamic Client Registration è gestito automaticamente.
Windsurf
Aggiungi a ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"strata": {
"serverUrl": "https://api.strata.space/mcp"
}
}
}Windsurf usa serverUrl al posto di url. OAuth è gestito automaticamente.
Cline
Apri il pannello MCP Servers in Cline e aggiungi alla configurazione:
{
"mcpServers": {
"strata": {
"url": "https://api.strata.space/mcp",
"type": "streamableHttp"
}
}
}Usa "streamableHttp" (in camelCase). Quando serve OAuth, Cline mostra un pulsante Authenticate.
Continue
Aggiungi a ~/.continue/config.yaml:
mcpServers:
- name: strata
command: npx
args:
- "-y"
- "mcp-remote"
- "https://api.strata.space/mcp"Continue non supporta ancora OAuth in modo nativo. Usa invece il bridge mcp-remote (vedi sotto).
Zed
Aggiungi al settings.json di Zed:
{
"context_servers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}Zed non supporta OAuth in modo nativo. Usa mcp-remote come bridge stdio che gestisce il flusso OAuth nel browser.
Claude.ai e ChatGPT
Questi prodotti di chat mostrano l'editor di Strata al loro interno come connettore personalizzato. Aggiungi l'URL del server MCP indicato sopra nelle impostazioni dei connettori dell'host.
Claude.ai
Impostazioni → Connettori → Aggiungi connettore personalizzato
Disponibile nei piani a pagamento. I connettori dell'organizzazione vengono aggiunti da un Proprietario.
ChatGPT
Impostazioni → Connettori → Crea
Richiede la modalità sviluppatore (Impostazioni → App e connettori → Avanzate). Piani Plus, Pro o Enterprise.
Soluzione universale di ripiego (mcp-remote)
Per qualsiasi client senza supporto OAuth nativo, usa mcp-remote come bridge stdio. Gestisce l'intero flusso OAuth e funziona con qualsiasi client MCP:
{
"mcpServers": {
"strata": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.strata.space/mcp"
]
}
}
}Lo stato di autenticazione viene salvato in ~/.mcp-auth/, quindi l'autenticazione avviene una sola volta per server.
Passaggi successivi
Consulta il riferimento agli strumenti MCP per la documentazione completa di tutti gli strumenti disponibili e dei relativi parametri.
Aspetto del blog
Usa una mappa blog: nel primo blocco di metadati YAML per progettare un articolo pubblicato. Il pannello dell’aspetto modifica lo stesso testo e conserva le altre chiavi e i commenti.
L’anteprima segue la bozza. La pubblicazione salva il design completo, inclusi i valori ereditati dal tema della pubblicazione; le modifiche successive alla bozza o al tema del profilo non cambiano quella versione. Le presentazioni usano impostazioni proprie. I metadati sono nascosti nelle pagine pubbliche e nelle descrizioni.
Chiavi sconosciute in blog:, YAML non valido, valori errati, riferimenti mancanti o duplicati e contrasto insufficiente impediscono la pubblicazione. Correggi tutti gli errori; le modifiche degli agenti restituiscono risultati blogValidation. Reimposta un valore per ereditare quello predefinito. L’indice è nascosto e la superficie di lettura è opaca per impostazione predefinita.
Il riepilogo ammette 160 caratteri; i tag fino a 10 elementi di 32 caratteri. I nomi delle serie ammettono 80 caratteri e richiedono un ordine intero positivo. I nomi esatti raggruppano gli articoli; ordini duplicati producono avvisi. noindex mantiene l’articolo nel profilo e nei feed, ma lo rimuove dalla mappa del sito e chiede ai motori di non indicizzarlo. cover indica un’immagine del documento; assegnale un nome con <!-- strata:name=cover --> immediatamente prima dell’immagine.
I colori richiedono valori #RRGGBB tra virgolette per le modalità chiara e scura. background colora la superficie di lettura e, senza sfondo decorativo, la pagina. Testo e collegamenti accent devono raggiungere un contrasto di 4.5:1 sulla superficie effettiva in entrambe le modalità. I caratteri provengono dall’elenco seguente. Una superficie traslucida usa l’88% di opacità ed è consentita solo su colori o sfumature con contrasto sufficiente lungo tutta la sfumatura.
Scegli un solo tipo di sfondo. Le sfumature accettano 2–5 colori; i motivi usano i nomi seguenti. Lo sfondo immagine indica un’immagine del documento. Lo sfondo HTML indica un blocco html e richiede un colore o un’immagine statica di riserva. Funziona dietro l’articolo nell’ambiente isolato esistente, non riceve clic o focus e si arresta quando la scheda è nascosta. Movimento o dati ridotti, dispositivi limitati, anteprime HTML disattivate o errori attivano la riserva. Stampa e PDF omettono lo sfondo. HTML o CSS diretto nella pagina e articoli interamente HTML non sono supportati.
I blocchi HTML con uses="frontmatter" leggono strata.data.get("frontmatter").values. Le chiavi risolte sono blog.typography, blog.palette, blog.readingWidth, blog.blockControls, blog.tableOfContents, blog.readingSurface, blog.accent, blog.background, blog.fonts.heading e blog.fonts.body. I colori seguono la modalità corrente. I caratteri non impostati vengono omessi. I blocchi pubblicati ricevono solo questi valori; gli altri metadati scalari sono disponibili soltanto nell’editor. Uno sfondo riceve solo questi valori e la modalità colore, mai altri dati del documento.
Campi e valori consentiti
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
Esempio completo di sfondo 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>
```Blocchi HTML interattivi
I blocchi di codice contrassegnati come html vengono resi come anteprime live e isolate nell'editor di Strata e nei PDF esportati: grafici, diagrammi, scene 3D e piccoli widget interattivi, scritti come normale codice delimitato.
Scrivi un blocco di codice delimitato con il tag di linguaggio html. Il suo markup, gli stili e gli script vengono eseguiti automaticamente in un'anteprima isolata; ogni modifica esegue di nuovo il rendering da uno stato pulito e i lettori possono passare dall'anteprima al sorgente e viceversa.
L'anteprima è completamente isolata: nessun cookie o storage, nessun accesso alla pagina circostante e nessun URL esterno. WebSocket, beacon e invii di form sono rimossi del tutto, e fetch raggiunge soltanto le risorse verificate in /sandbox/ elencate sotto, che è il modo in cui il motore di Doom carica i propri dati di gioco. Tutto ciò che viola questi vincoli fallisce all'interno della propria anteprima e in nessun altro punto.
I token di design di Strata sono precaricati: variabili CSS come var(--color-foreground), var(--color-muted-foreground), var(--color-primary) e var(--color-border) corrispondono al tema dell'app e l'anteprima segue automaticamente la modalità chiara o scura del lettore. I colori impostati da te vengono usati esattamente come li scrivi e non vengono mai adattati, quindi imposta sempre insieme sfondo e testo — un blocco che ne imposta solo uno dei due può risultare illeggibile nella modalità che non hai provato.
Un'anteprima parte da circa 360 pixel di altezza e poi segue il proprio contenuto: un contenuto più alto fa crescere il blocco, uno più corto lo fa rimpicciolire. Quell'altezza iniziale è anche il riferimento con cui vengono risolte le unità relative, quindi height: 100%, 100vh e window.innerHeight funzionano tutti — è proprio ciò che usano di solito le scene three.js e i grafici a tutta area.
Gli errori di script, i rifiuti di promise non gestiti e l'output di console.error/console.warn prodotti all'interno dell'anteprima vengono raccolti e mostrati sotto di essa, con i numeri di riga quando il browser li segnala. Un'anteprima non ha strumenti per sviluppatori propri, quindi è in questo pannello che un blocco spiega perché non è stato renderizzato.
Grafici dai dati del documento
Un blocco può leggere dati che si trovano già nello stesso documento, così un grafico resta allineato ai numeri che i suoi lettori vedono. Si possono nominare quattro tipi di sorgente. Un blocco di codice json, csv, tsv o yaml si nomina sulla propria riga di apertura, per esempio con name=sales. Una tabella si nomina con una riga di commento HTML collocata immediatamente sopra: <!-- strata:name=headcount -->. Il frontmatter del documento è sempre disponibile con il nome riservato frontmatter, solo per i campi scalari. Un'immagine del documento si nomina come una tabella, con una riga di commento HTML collocata immediatamente sopra: <!-- strata:name=hero -->. Nell'editor seleziona l'immagine e usa Nome per i dati. Questi quattro tipi sono gli unici dati a cui un blocco può collegarsi. Un nome inizia con una lettera, prosegue con lettere, cifre, trattini o trattini bassi, arriva al massimo a 64 caratteri e deve essere unico all'interno del documento.
Un blocco html dichiara ciò che consuma sulla propria riga di apertura, per esempio con uses="sales,headcount". Un blocco riceve soltanto le sorgenti che nomina e mai il resto del documento, non può raggiungere dati di un altro documento e non gli arriva nulla che il suo lettore non possa già vedere qui. Modificare il codice del blocco o la sua dichiarazione ricarica l'anteprima da uno stato pulito. Modificare solo i dati dietro un nome già dichiarato aggiorna l'anteprima in corso senza riavviarla. Un blocco dichiara al massimo otto nomi e ogni nome oltre l'ottavo arriva come unavailable con motivo oversize invece di essere scartato in silenzio.
Dentro l'anteprima i dati dichiarati vengono installati come strata.data prima che vengano eseguiti i tuoi script. strata.data.get(name) restituisce una sorgente e strata.data.names elenca i nomi dichiarati dal blocco, nell'ordine della dichiarazione. Una sorgente json, csv, tsv o yaml arriva non analizzata come { kind: 'text', format, text }, quindi è il blocco ad analizzarla con il parser che preferisce. Una tabella arriva come { kind: 'table', columns, rows } con ogni cella come testo semplice e senza conversioni numeriche o di data. Il frontmatter arriva come { kind: 'frontmatter', values }. Ogni valore consegnato è congelato in profondità. Quando una sorgente collegata cambia, Strata invia un nuovo snapshot e genera l'evento strata:data su window, il cui detail porta i nuovi dati. strata.data.get restituisce già quello snapshot nel momento in cui l'evento viene generato. L'anteprima non richiede mai dati da sé, quindi un blocco che ignora l'evento continua a funzionare con ciò che ha ricevuto all'inizio.
Un'immagine arriva come { kind: 'image', url, width, height, alt }, dove url è un URL di dati che porta i byte dell'immagine stessa, quindi un blocco può assegnarlo direttamente a un elemento img senza alcun accesso alla rete. Strata recupera quei byte con l'accesso del lettore e li incorpora prima che l'anteprima parta; l'anteprima non vede mai un collegamento da seguire e non richiede mai un'immagine per conto proprio. Le immagini hanno un budget separato: una singola immagine può consegnare fino a 3 MiB e tutte le immagini di un'anteprima fino a 12 MiB complessivi, scartando prima le più grandi se quel budget si esaurisce. Un'immagine i cui byte non sono stati recuperati arriva come unavailable con il motivo unreachable. Una presentazione può mostrare un'immagine nominata senza alcun codice: una riga di apertura di diapositiva scritta come layout=image uses="hero" la disegna a tutta pagina e legge la didascalia dal corpo della diapositiva.
Quale tipo scegliere dipende da chi altro deve leggere i numeri. Un blocco json o csv è compatto, si confronta bene tra una versione e l'altra e tiene una serie lunga fuori dal testo, ma arriva come testo grezzo ed è il blocco a doverlo analizzare; dividere una riga csv sulle virgole è l'errore classico, perché spezza qualsiasi campo tra virgolette che ne contenga una. Una tabella con nome rappresenta il compromesso opposto: i lettori vedono una tabella vera invece di un blocco di codice, e il blocco la riceve già suddivisa, con la prima riga come columns e ogni riga successiva in rows. Il frontmatter va bene per valori singoli, come un titolo o un obiettivo, non per una serie.
Un nome dichiarato che non può essere risolto arriva comunque, come { kind: 'unavailable', reason }, così un blocco può distinguere un insieme di dati vuoto da uno mancante. Il motivo è unknown quando nessuna sorgente del documento porta quel nome, duplicate quando due sorgenti rivendicano lo stesso nome, removed quando la sorgente è stata eliminata mentre l'anteprima era aperta, oversize quando la sorgente supera i limiti di consegna e unreachable quando non è stato possibile recuperare i byte di un'immagine. Viene scartata solo la sorgente interessata e le altre continuano ad arrivare, quindi controlla il tipo unavailable e mostra un messaggio invece di dare per scontato che i dati ci siano.
Librerie approvate
/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.
Nessun altro URL esterno di script o stile viene caricato nell'anteprima. Per bloccare una versione, inserisci -<version> prima di .min.js (le versioni precedenti restano disponibili).
Esempio
<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>Esempio: un grafico collegato a un blocco 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>
```Esempio: un grafico collegato a un blocco 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>
```Esempio: un grafico collegato a una tabella 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>
```Esempio: un'immagine collegata a un'immagine 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 dell'agente
La definizione di un agente è un documento Markdown nella cartella /Agents. Il frontmatter YAML dichiara l'identità dell'agente, l'elenco degli strumenti consentiti e la visibilità presso l'orchestratore; il corpo sotto il frontmatter è il prompt di sistema a cui l'orchestratore passa la richiesta dell'utente così com'è. Ogni campo viene convalidato lato server al salvataggio.
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
autoInvokable | boolean | Facoltativo | false | Quando è true, l'orchestratore della chat può scegliere autonomamente questo agente se la sua descrizione corrisponde alla richiesta dell'utente. Quando è false (valore predefinito), l'agente viene eseguito solo su invocazione esplicita (@mention, MCP invoke_agent o una fonte collegata). |
connectorAccounts | object | Facoltativo | — | Owner's personal account selected for each connector kind. |
description | string | Obbligatorio | — | Riassunto in una frase di quando usare questo agente. Compare nel catalogo di invocazione automatica dell'orchestratore e nel selettore @mention: sii specifico sul compito dell'agente. |
enabled | boolean | Facoltativo | true | Interruttore generale. Quando è false, l'agente resta nascosto in ogni punto di invocazione anche se il resto del frontmatter è valido. |
model | string | Facoltativo | — | Override facoltativo del modello su cui gira l'agente. Se omesso, si usa il modello predefinito della piattaforma. Deve corrispondere a una voce del registro dei modelli della piattaforma. |
name | string | Obbligatorio | — | Identificatore in kebab-case ([a-z0-9-]), univoco tra i tuoi agenti e senza conflitti con i nomi riservati agli agenti di piattaforma. Determina il token @mention nella chat e l'argomento agentName di MCP invoke_agent. |
pinnedResources | PinnedResourceSpec[] | Facoltativo | — | 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[] | Facoltativo | [] | Elenco degli strumenti di piattaforma che l'agente può richiamare (ad esempio read_document, search_space). Il pannello Strumenti disponibili nel banner dell'agente elenca tutti i nomi validi. Ometti il campo o lascialo vuoto per non concedere alcuno strumento. |
Esempio
---
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
Un modello di prompt è un documento Markdown nella cartella /Prompts. Il frontmatter YAML dichiara nome, descrizione, argomenti e visibilità presso l'orchestratore del prompt; il corpo sotto il frontmatter è il modello vero e proprio — i segnaposto {{argument}} vengono sostituiti al momento del rendering. I valori degli argomenti vengono raccolti dal pannello slash del compositore di chat o dalla richiesta MCP prompts/get.
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
arguments | PromptArgument[] | Facoltativo | [] | Elenco ordinato di voci `PromptArgument` a cui il corpo del prompt fa riferimento tramite i segnaposto `{{name}}`. L'ordine viene preservato durante la trasmissione, così il selettore slash mostra i campi nell'ordine scelto dall'autore. Massimo 16 voci. |
autoInvokable | boolean | Facoltativo | false | Quando è true, l'orchestratore della chat può scegliere autonomamente questo prompt se la descrizione corrisponde all'intento dell'utente. Quando è false (valore predefinito), il prompt viene eseguito solo se l'utente digita il suo token slash o se un client richiama MCP prompts/get. |
description | string | Obbligatorio | — | Riassunto in una frase di ciò che fa il prompt. Compare nel menu slash, in MCP prompts/list e, quando autoInvokable: true, nel catalogo strumenti dell'orchestratore. |
name | string | Obbligatorio | — | Titolo leggibile del prompt. La forma con slug diventa il token /prompt:<slug> mostrato nel menu slash del compositore di chat. |
PromptArgument
Ogni voce dell'array `arguments` qui sopra ha la struttura seguente:
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
description | string | Obbligatorio | — | 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 | Obbligatorio | — | 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 | Facoltativo | 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. |
Esempio
---
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 del modello
Un modello di documento è un documento Markdown all'interno di una cartella di modelli. Il frontmatter YAML dichiara il nome del modello, le variabili tipizzate e il contratto delle sezioni; il corpo sotto il frontmatter è il contenuto riutilizzabile — i segnaposto {{key}} vengono sostituiti quando si crea un documento dal modello, tramite la galleria, l'azione MCP createFromTemplate o lo strumento create_document_from_template di un agente.
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
description | string | Obbligatorio | — | 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 | Obbligatorio | — | Kebab-case identifier, unique among the templates in the same folder. Shown in the gallery alongside the document title. |
sections | TemplateSection[] | Facoltativo | [] | Section contract: what a conforming instance must contain. Maximum 64 entries. Empty when the template declares no section structure. |
variables | TemplateVariable[] | Facoltativo | [] | 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
Ogni voce dell'array `variables` qui sopra ha la struttura seguente:
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
key | string | Obbligatorio | — | 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 | Facoltativo | "text" | Input kind. Defaults to free text. |
label | string | Obbligatorio | — | Human-readable label shown on the fill-in form. 1-80 chars. |
required | boolean | Facoltativo | false | When true, instantiation fails unless a value is supplied. When false (default), an omitted variable substitutes the empty string into its placeholders. |
TemplateSection
Ogni voce dell'array `sections` qui sopra ha la struttura seguente:
| Campo | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
fill | unknown | Facoltativo | "required" | Fill discipline for the section. Defaults to required. |
guidance | string | Facoltativo | "" | Instructions for whoever (or whatever) fills the section in. Optional; shown alongside the section in fill-in surfaces. |
title | string | Obbligatorio | — | Section title. Matches a heading in the template body verbatim. |
Esempio
---
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…