Capitolo 23 · Parte III · In pratica
WebMCP: un agente al lavoro nella Sandbox
Che cosa può fare con la Sandbox un agente di IA nel browser tramite i suoi 36 strumenti WebMCP (guardare le pagine, cambiare qualunque impostazione, modificare il testo, aggiungere immagini, tabelle e font, eseguire le verifiche, esportare) e come chiamare ciascuno, con argomenti e risposte reali
In breve
Questa pagina è per chi vuole che un assistente di intelligenza artificiale lavori al posto suo su un libro nella Sandbox. Mentre la Sandbox è aperta, dà all’assistente una serie di strumenti: per guardare qualunque pagina, cambiare la grafica, modificare il testo, aggiungere immagini e tabelle, trovare problemi e salvare file. Chiedi con parole tue, per esempio «ingrandisci un po’ il testo e controlla che il libro stia ancora in 40 pagine», e l’assistente usa gli strumenti e ti mostra le pagine. Tutto resta nel tuo browser. La pagina spiega come collegare un assistente, che cosa può fare e come si chiama ogni strumento.
Un agente nel tuo browser lavora sul libro aperto nella Sandbox: guarda le pagine, le cambia e le guarda di nuovo.
La Sandbox dà a un agente strumenti propri tramite
WebMCP, una bozza di standard web
che permette a una pagina di passare strumenti al modello di IA con cui parla il browser. Con questi
l’agente non fa clic nell’interfaccia: legge il libro, chiede un’immagine
della pagina 12, imposta bodyText.fontSize a 10,5 pt, vede che il capitolo
è passato da 18 a 19 pagine e lo rimette com’era. Fa quello che tu fai a occhio, e
lo fa con il tuo libro, nel tuo browser.
Ci sono 36 strumenti il cui nome comincia con sandbox_, registrati mentre la
Sandbox è sullo schermo, e 8 strumenti del sito, site_*, su ogni pagina di
postext.dev. Questa pagina li ordina secondo ciò che chiederesti a un agente, e
per ciascuno riporta la chiamata.
#Collegare un agente
#In un browser con WebMCP
Gli strumenti vengono registrati con document.modelContext quando la Sandbox si monta
e ritirati quando la lasci. Un agente a cui il browser passa gli strumenti della pagina
li trova lì. Dal lato di Postext non c’è nulla da installare o configurare.
WebMCP è ancora una bozza. Chrome lo offre come origin trial e dietro il
flag chrome://flags/#enable-webmcp-testing. Gli strumenti seguono la pagina: nella
home page o nella documentazione l’agente ha gli strumenti site_*; quando la
Sandbox è sullo schermo, compaiono anche i 36 strumenti sandbox_*.
#In qualunque altro browser: window.postextWebMcp
La pagina mette gli stessi strumenti anche su window.postextWebMcp, con o senza
WebMCP. Qualunque agente che possa eseguire script nella pagina può usarli: uno
strumento di automazione come Puppeteer o Playwright, un server MCP che pilota il
browser e valuta script (Chrome DevTools MCP), un’estensione del browser, oppure
tu, nella console per sviluppatori:
// What is on this page
postextWebMcp.listTools().map((t) => t.name);
// Run one tool: the name, then an object with its arguments
await postextWebMcp.executeTool('sandbox_get_state', {});
await postextWebMcp.executeTool('sandbox_set_config', {
changes: [{ path: 'bodyText.fontSize', value: '10.5pt' }],
});Lo stesso da uno script Puppeteer, che salva una pagina come immagine:
import fs from 'node:fs';
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://postext.dev/en/sandbox');
await page.waitForFunction(() => window.postextWebMcp?.listTools().some((t) => t.name === 'sandbox_get_state'));
await page.waitForFunction(async () => (await window.postextWebMcp.executeTool('sandbox_get_state', {})).ready);
const result = await page.evaluate(() =>
window.postextWebMcp.executeTool('sandbox_render_page', { chapter: 1, position: 1, width: 1200, format: 'png' }),
);
const picture = result.content.find((part) => part.type === 'image');
fs.writeFileSync('page-1.png', Buffer.from(picture.data, 'base64'));
await browser.close();Un profilo di browser nuovo ha un proprio spazio di archiviazione, quindi parte dagli esempi, non dai tuoi progetti. Per lavorare sui tuoi libri, usa il browser in cui li hai creati.
#Com’è fatta ogni risposta
Uno strumento risponde con un oggetto JSON. ok: true e ciò che è stato chiesto, oppure ok: false e un error che dice che cosa non andava e che cosa chiedere invece:
{
"ok": false,
"error": "bodyText.fontSize is a length: give { \"value\": 11, \"unit\": \"pt\" }, a number (in pt) or a text such as \"11pt\". The units: cm, mm, in, pt, px, em, rem."
}Gli argomenti vengono controllati sullo schema dello strumento prima che parta qualunque cosa, quindi
un parametro scritto male viene rifiutato con l’elenco di quelli giusti. Uno strumento che
restituisce immagini (sandbox_render_page) risponde nella forma MCP, { content: [...] }: una parte di testo con un JSON che descrive le pagine, poi una parte
immagine per pagina, codificata in base64.
#Il ciclo di lavoro
Ogni strumento che modifica il libro aspetta che l’impaginazione si aggiorni prima di rispondere, e dice quante pagine è venuto ogni capitolo. Così lo sguardo successivo è sempre sulle pagine nuove, e l’agente può lavorare come fa un grafico:
- Vedere a che punto si è:
sandbox_get_statedà il libro, i suoi capitoli con le loro pagine, il capitolo e la pagina sullo schermo e il pannello aperto. - Guardare:
sandbox_render_pagedipinge una pagina,sandbox_inspect_pagesla descrive come dati,sandbox_get_warningselenca ciò che hanno trovato le verifiche. - Cambiare:
sandbox_set_config,sandbox_edit_text,sandbox_save_resource… - Guardare di nuovo, e tenere la modifica o annullarla.
Una pagina viene impaginata e dipinta per lo strumento qualunque sia il visualizzatore sullo schermo, così l’agente può guardare il capitolo 7 mentre tu leggi il capitolo 2.
#Che cosa puoi chiedere, e come si fa
#Scoprire che cosa è aperto
// sandbox_get_state
{}{
"ok": true,
"ready": true,
"book": { "kind": "sample", "id": "postext-guide", "name": "Postext guide" },
"pages": 3,
"chapters": [
{ "chapter": 1, "id": "a", "title": "Opening", "onScreen": true, "words": 1007, "pages": 2 },
{ "chapter": 2, "id": "b", "title": "Second", "words": 101, "pages": 1 }
],
"view": { "viewer": "canvas", "panel": "none", "scope": "chapter", "chapter": 1 },
"resources": 0,
"warnings": 0
}ready: false arriva con waitingFor, che dice perché (un libro ancora in caricamento).
question e notice compaiono quando la Sandbox aspetta una tua risposta; vedi
Domande e notifiche.
Ogni strumento che accetta un chapter accetta la sua posizione nel libro (da 1),
il suo titolo o il suo id. Se lo ometti, è il capitolo sullo schermo.
#Guardare una pagina
Un’immagine. «Mostrami l’apertura del capitolo 3», «com’è la doppia pagina 24-25?»:
// sandbox_render_page: a spread, 1200 px wide per page
{ "chapter": 3, "page": 24, "count": 2, "width": 1200 }page è il numero stampato sulla pagina; position è il posto della pagina
tra le pagine del capitolo (da 1), per le pagine senza numero. Senza
nessuno dei due, è la pagina sullo schermo. crop ingrandisce una parte della pagina, in
frazioni della sua larghezza e altezza a partire dall’angolo in alto a sinistra, per giudicare da vicino caratteri e
spaziature:
// sandbox_render_page: the bottom right quarter, magnified
{ "chapter": 3, "page": 24, "crop": { "x": 0.5, "y": 0.5, "width": 0.5, "height": 0.5 }, "width": 1600 }printPreview: true dipinge la prova a video del profilo di stampa con le guide del rifilo,
dell’abbondanza e della zona sicura; trimmed: true toglie il margine con i
segni di taglio.
La stessa pagina come dati. «Quali righe di questa pagina sono troppo spaziate?», «la seconda colonna è piena?»:
// sandbox_inspect_pages: without a page, one line per page of the chapter
{ "chapter": 1 }{
"chapter": 1, "title": "Opening", "chapterPages": 2, "converged": true,
"pages": [
{ "position": 1, "label": "1", "role": "opener", "blank": false, "lines": 45, "figures": 0, "starts": "Opening" },
{ "position": 2, "label": "2", "role": "body", "blank": false, "lines": 37, "figures": 0, "starts": "decades. Print typography spent five centuries…" }
]
}Con page o position elenca ogni blocco della pagina: il tipo, la colonna,
il testo, il numero di righe, le righe che finiscono con un trattino e le righe giustificate
troppo spaziate con la larghezza dei loro spazi, il suo riquadro sulla pagina, più quanto è piena ogni
colonna (fill: 0.99).
Che cosa c’è in un punto. Quando l’agente vede qualcosa in un’immagine, chiede che cosa sia con le stesse frazioni che ha usato per il ritaglio:
// sandbox_inspect_point
{ "chapter": 3, "page": 24, "x": 0.71, "y": 0.42 }La risposta dà il blocco, la riga e la colonna del sorgente Markdown in quel punto
(e la parola), un link e la pagina a cui porta, la cella di tabella o la didascalia di
una risorsa. Con select: true fa anche ciò che fa un clic: il
pannello Testo si apre con il cursore in quel punto (word: true seleziona la
parola, to seleziona fino a un secondo punto).
#Cambiare la grafica
Qualunque impostazione della configurazione si può cambiare tramite il suo percorso. Un agente raramente conosce il percorso all’inizio, quindi lo cerca:
// sandbox_find_setting
{ "query": "orphans" }{
"ok": true,
"paths": [
{ "path": "bodyText.avoidOrphans", "effective": true },
{ "path": "bodyText.avoidOrphansInLists", "effective": true }
],
"sections": [{ "section": "Body text", "group": "Typography", "settingsGroup": "text", "configKeys": ["bodyText"] }]
}sandbox_get_config legge un’impostazione o un’intera sezione: set è ciò che il libro
memorizza, effective ciò che risulta una volta riempiti i valori predefiniti, il che mostra anche
ogni impostazione della sezione.
// sandbox_get_config
{ "path": "headings.levels[level=2]" }I percorsi indicano un elemento di un elenco tramite ciò che lo distingue:
headings.levels[level=2].fontSize, header.elements[id=titleOdd].italic,
calloutStyles[id=note].title. Poi sandbox_set_config cambia tutte le
impostazioni che vuoi in una sola chiamata:
// sandbox_set_config
{
"changes": [
{ "path": "bodyText.fontSize", "value": "10.5pt" },
{ "path": "page.margins.top", "value": { "value": 2.5, "unit": "cm" } },
{ "path": "headings.levels[level=2].color", "value": "#1f3a5f" },
{ "path": "bodyText.avoidOrphans", "value": true }
]
}Una lunghezza è "2.5cm", { "value": 2.5, "unit": "cm" } o un numero nell’unità
dell’impostazione; un colore è "#1f3a5f". Un valore null rimuove l’impostazione, così
torna il valore della grafica. La risposta dice come giudicare la modifica e come
annullarla:
{
"ok": true,
"changed": [
{
"path": "bodyText.fontSize",
"from": null,
"to": { "value": 10.5, "unit": "pt" },
"effective": { "from": { "value": 10, "unit": "pt" }, "to": { "value": 10.5, "unit": "pt" } }
}
],
"followed": [
{ "path": "captionStyle.fontSize.value", "from": 10, "to": 10.5 },
{ "path": "tableStyle.bodyFontSize.value", "from": 10, "to": 10.5 }
],
"pagesBefore": 212,
"pagesAfter": 219,
"chapters": [{ "chapter": 1, "title": "Opening", "pages": 19, "pagesBefore": 18 }]
}from è il valore memorizzato prima (qui null: il libro non lo impostava), quindi
la stessa chiamata con from come valore annulla la modifica. followed elenca le
impostazioni che dipendono da questa e si sono mosse con lei. Compare una note quando il
motore ha risolto qualcosa di diverso da ciò che era stato chiesto (un limite, un’impostazione che
dipende da un’altra), e un valore della forma sbagliata, o una configurazione che il
motore non riesce a risolvere, viene rifiutato senza cambiare nulla.
Per modifiche più ampie, patch fonde un oggetto nella configurazione (gli oggetti
si fondono, null rimuove, gli elenchi si sostituiscono interi) e replace mette un’intera
configurazione al posto di quella del libro, per esempio un’esportazione postext-config.json.
sandbox_reset_to_original con part: "config" rimette la grafica da cui il
libro era partito.
Anche i font sono impostazioni: sandbox_list_fonts con search: "Garamond" trova
famiglie nel catalogo aperto, e scrivere il nome in un’impostazione fontFamily
la carica.
#Modificare il testo
Il testo di ogni capitolo è Markdown con le estensioni di Postext (vedi Formato del documento). L’agente lo legge con i numeri di riga, trova un passo e sostituisce passi esatti:
// sandbox_read_text: lines 40 to 80 of chapter 2
{ "chapter": 2, "fromLine": 40, "toLine": 80 }// sandbox_search_text: where a passage occurs, and on which page
{ "query": "baseline grid", "pages": true }// sandbox_edit_text
{
"chapter": 2,
"edits": [
{ "find": "The last words of the opening.", "replace": "The closing words of the opening." },
{ "find": "colour", "replace": "color", "all": true }
]
}Ogni find deve corrispondere esattamente al sorgente e comparire una sola volta, a meno che non sia
impostato all. O si applicano tutte le modifiche o nessuna: un passo che non c’è viene
rifiutato con il consiglio di rileggere il capitolo. L’intera chiamata è un solo passo
per sandbox_undo_text, che la annulla (redo: true la ripristina).
sandbox_write_text sostituisce un capitolo intero, da markdown o da un file .md.
Per mostrarti un punto del testo, sandbox_select_text apre il pannello Testo
con quel passo selezionato (per text, line o offset), come fa un clic su
un risultato del pannello Verifiche.
#Organizzare i capitoli
sandbox_manage_chapters aggiunge, rinomina, sposta, divide, unisce e mostra
i capitoli:
// add a chapter in third place
{ "action": "add", "title": "Epilogue", "markdown": "# Epilogue\n\nThe end.\n", "position": 3 }
// split a chapter where a passage starts
{ "action": "split", "chapter": "Opening", "before": "## Second part" }
// one chapter per level-1 heading
{ "action": "split_at_headings", "chapter": 1 }sandbox_remove_chapter ne elimina uno, e l’operazione non si può annullare.
#Aggiungere immagini, tabelle, video e font
sandbox_save_resource aggiunge una risorsa o ne modifica una, come fa il pannello
Risorse. Un file arriva tramite url (un indirizzo https: che la pagina può scaricare, o un
URL data:) oppure come base64:
// a picture with its caption and alternative text
{
"id": "harbour",
"image": { "url": "https://example.org/harbour.jpg" },
"caption": "The harbour at dawn",
"altText": "Fishing boats moored at a stone quay, mist over the water",
"placement": { "position": "top", "span": "page" }
}// a table from rows of text; the first row is the header
{
"id": "prices",
"caption": "Prices in 1850",
"table": { "rows": [["Item", "Price"], ["Bread", "2 d"], ["Ink", "6 d"]], "columnWidths": [2, 1] }
}// a YouTube video: its poster, frame size and title are fetched
{ "id": "interview", "video": { "url": "https://www.youtube.com/watch?v=…" }, "caption": "The author at work" }La risposta dà il record memorizzato e la riga che lo colloca,
::resource{id="prices"}, che l’agente poi scrive nel testo con
sandbox_edit_text. Su un id esistente la chiamata cambia solo ciò che fornisce:
una didascalia, le celle di una tabella, la collocazione, la zona sicura di un’immagine. newId
rinomina una risorsa e, per impostazione predefinita, ogni riferimento a essa nel libro.
sandbox_list_resources le elenca e, con un id, ne dà una per intero (le celle di una
tabella con la loro formattazione, il sorgente di un SVG).
I font caricati nel libro passano da sandbox_save_font:
{ "action": "add", "family": "My Serif", "weight": 700, "style": "italic", "file": { "url": "https://example.org/MySerif-BoldItalic.woff2" } }#Verificare il libro
// sandbox_get_warnings: every chapter
{ "scope": "book" }La risposta è ciò che dice il pannello Verifiche, per qualunque capitolo o per il libro intero, qualunque cosa ci sia sullo schermo: font e immagini mancanti, markup che il motore non è riuscito a leggere, elementi grafici che non ci stanno, testo troppo tenue per il suo sfondo, righe troppo spaziate, vedove, riquadri che traboccano e il preflight di stampa. Ogni avviso ha la sua categoria, il capitolo, la riga e gli offset, la pagina, e l’impostazione o la risorsa che nomina:
{
"ok": true,
"scope": "book",
"total": 3,
"byCategory": { "typesetting": 2, "design": 1 },
"warnings": [
{
"kind": "headerFooterMetadataMissing",
"category": "design",
"title": "Placeholder metadata missing",
"detail": "header · {title} — The metadata referenced by this placeholder is not set — it will render empty."
}
]
}Da un avviso l’agente può andare al suo punto (sandbox_select_text con
offset e toOffset, oppure sandbox_go_to_page), guardare la pagina e
cambiare il testo o l’impostazione. category restringe l’elenco; in un libro lungo
scope: "book" impagina ogni capitolo e richiede un po’ di tempo.
#Mostrare al lettore
Ciò che l’agente cambia, tu lo vedi. Per indicarti qualcosa:
// sandbox_set_view: the Canvas with facing pages and loose lines highlighted
{ "viewer": "canvas", "pages": "spread", "fit": "height", "guides": { "looseLines": true, "baselineGrid": true } }// sandbox_go_to_page: where a figure is set
{ "anchor": "harbour" }sandbox_set_view sceglie anche il visualizzatore (canvas, pdf, folio, html,
epub), il pannello laterale, capitolo o libro intero, lo zoom, il corpo del testo
per il lettore, l’anteprima di stampa e il gruppo del pannello Grafica. sandbox_go_to_page sfoglia
le pagine per step, page, position, un passo di text, un anchor o una
voce dei contents di un EPUB. sandbox_run_viewer preme un pulsante della barra degli strumenti:
regenerate scrive di nuovo il PDF o l’EPUB e lo aspetta, print apre la
finestra di stampa perché tu la confermi, play_video riproduce un video su una pagina.
#Pagine di fumetti
sandbox_inspect_comic dà le vignette, le linee di suddivisione e le nuvolette di una pagina
di fumetto con le loro posizioni; sandbox_edit_comic fa le modifiche che una persona fa
con il puntatore, scritte nel sorgente:
// move a balloon's centre to a point of its panel's picture, in percent
{ "comic": 1, "action": "move_balloon", "balloon": 2, "at": { "x": 30, "y": 18 } }
// move the first split line to 45 % of its cell
{ "comic": 1, "action": "move_splitter", "splitter": 1, "start": 45 }La risposta avvisa quando una nuvoletta finisce su un volto o esce dalla sua vignetta. Vedi Fumetti per il formato.
#Libri, file e Word
-
Aprire e conservare libri.
sandbox_list_bookselenca gli esempi e i tuoi progetti;sandbox_open_bookne apre uno ({ "kind": "sample", "id": "postext-guide", "language": "es" });sandbox_save_bookconaction: "copy_current"conserva il libro sullo schermo come tuo progetto,new_blankne comincia uno vuoto. -
Esportare.
sandbox_exportscrivepdf,epub,postext,docx,markdownoconfig. Per impostazione predefinita il browser scarica il file; condeliver: "data"un PDF o un EPUB torna all’agente codificato in base64:{ "format": "pdf", "scope": "book", "deliver": "data" } -
Importare un file
.postextconsandbox_import_book(inspect: truedice quali lingue contiene senza importarlo). -
Portare dentro un manoscritto Word con
sandbox_import_word. Eseguilo prima condryRun: true: non cambia nulla e risponde con il rapporto di qualità, ogni stile di Word con ciò che diventerebbe, e i capitoli e le risorse che creerebbe. Poi correggi la mappatura ed eseguilo davvero:{ "file": { "url": "https://example.org/manuscript.docx" }, "destination": "book", "mapping": { "paragraphs": { "Epigraph": { "kind": "quote" }, "Chapter Title": { "kind": "chapter" } } }, "saveTemplateAs": "My publisher" }sandbox_word_templateselenca, legge, salva ed elimina le mappature salvate, che usa anche l’esportazione in Word.
#Domande e notifiche
Quando un link apre un libro di cui hai già una tua versione, la Sandbox
chiede se sostituire la tua copia, e sandbox_get_state lo segnala come
question con ready: false. sandbox_answer risponde: replaceCopy: false tiene la tua, true la sostituisce con il libro pubblicato ed elimina
la tua copia. dismissNotice: true chiude il messaggio del pannello Libri.
#Tre sessioni dall’inizio alla fine
«Ingrandisci un po’ il testo, ma tieni il libro sotto le 220 pagine.»
sandbox_get_state (212 pagine) → sandbox_set_config con
bodyText.fontSize a "10.5pt" (219 pagine) → sandbox_render_page su una
pagina fitta per giudicarla → sandbox_get_warnings con category: "typesetting" per le nuove vedove → se qualcosa è andato storto, di nuovo sandbox_set_config
con i valori from della prima risposta.
«Correggi ciò che le verifiche hanno trovato nel capitolo 4.» sandbox_get_warnings con
chapter: 4 → per ogni avviso, sandbox_read_text intorno alla sua line e
sandbox_render_page della sua page → sandbox_edit_text o
sandbox_set_config → di nuovo sandbox_get_warnings finché non torna vuoto.
«Crea un libro da questo file Word e dammi il PDF.» sandbox_save_book
con action: "new_blank" → sandbox_import_word con dryRun: true →
mapping corretta, poi l’importazione vera con destination: "book" →
sandbox_get_warnings con scope: "book" → sandbox_export con format: "pdf" e scope: "book".
#Che cosa richiede il tuo consenso
Sei strumenti fanno cose che non si possono annullare, e sono marcati come rilevanti
(consequentialHint), così il browser può chiederti conferma prima che vengano eseguiti:
sandbox_remove_chapter, sandbox_delete_resource, sandbox_delete_book,
sandbox_reset_to_original, sandbox_import_word (può sostituire l’intero
libro) e sandbox_answer (può eliminare la tua copia di un libro). Nel dubbio, chiedi all’agente
di esportare prima una copia .postext.
Gli strumenti che si limitano a leggere sono marcati readOnlyHint, e quelli la cui risposta contiene
testo non scritto dalla pagina (il testo stesso del libro, un file scaricato) sono marcati
untrustedContentHint, così il browser può evitare che quel testo venga preso per
istruzioni.
#Limiti
- Tutto resta nel tuo browser. Gli strumenti non raggiungono nulla che la Sandbox
stessa non raggiunga: i tuoi libri sono nello spazio di archiviazione di questo browser, e un file dato
tramite
urlviene scaricato dalla pagina, quindi il suo server deve consentirlo (CORS). Un URLdata:obase64funziona sempre. - Il lavoro lungo richiede tempo. Uno strumento aspetta l’impaginazione prima di rispondere;
wait: falserisponde subito. Un PDF o un EPUB di un libro lungo richiede minuti. - Che cosa annulla
sandbox_undo_text: le modifiche al testo fatte dagli strumenti (una chiamata alla volta) e le modifiche fatte sulle anteprime. Non ciò che scrivi nell’editor del pannello Testo (lo annulla il suo stesso annulla), i capitoli aggiunti o spostati, né le modifiche alla grafica e alle risorse: per queste, ilfromdi ogni risposta. L’elenco si perde quando la pagina viene ricaricata. - Il libro sullo schermo. Gli strumenti lavorano sul libro aperto. Solo
sandbox_exportdi un file.postext,sandbox_save_bookconduplicateesandbox_reset_to_originalconsampleraggiungono un altro libro senza aprirlo.
#Gli strumenti del sito
Su ogni pagina di postext.dev, Sandbox compresa:
site_get_context: la pagina sullo schermo, la sua lingua e il tema, le sezioni e ogni pagina della documentazione.site_search: la documentazione e il Ricettario, per parole, nomi di impostazioni (bodyText.avoidOrphans) o direttive (::resource).site_read_page: una pagina del sito come Markdown, senza lasciare la pagina sullo schermo.site_open_page: mostra una pagina, con#headingper arrivare a una sezione.site_list_recipesesite_open_recipe_in_sandbox: trovano una ricetta del Ricettario e la aprono nella Sandbox come libro modificabile.site_lookup_term: un termine del glossario (vedova, crenatura, kinsoku…).site_set_preferences: la lingua e il tema del sito.
Un agente che parte dalla home page può quindi cercare nel Ricettario, aprire
una ricetta nella Sandbox e proseguire lì con gli strumenti sandbox_*.
#Tutti gli strumenti
Raggruppati come li registra la Sandbox. La descrizione completa e lo schema di
ciascuno arrivano con postextWebMcp.listTools().
- Che cosa è aperto:
sandbox_get_state. - Le pagine:
sandbox_render_page,sandbox_inspect_pages,sandbox_inspect_point. - Il testo:
sandbox_read_text,sandbox_write_text,sandbox_edit_text,sandbox_undo_text,sandbox_select_text,sandbox_search_text,sandbox_manage_chapters,sandbox_remove_chapter. - La grafica:
sandbox_get_config,sandbox_set_config,sandbox_find_setting,sandbox_reset_to_original. - Come viene mostrato:
sandbox_set_view,sandbox_go_to_page,sandbox_run_viewer. - Risorse e font:
sandbox_list_resources,sandbox_save_resource,sandbox_delete_resource,sandbox_list_fonts,sandbox_save_font. - Fumetti:
sandbox_inspect_comic,sandbox_edit_comic. - Libri e file:
sandbox_list_books,sandbox_open_book,sandbox_save_book,sandbox_delete_book,sandbox_import_book,sandbox_export. - Word:
sandbox_import_word,sandbox_word_templates. - Domande:
sandbox_answer. - Le verifiche:
sandbox_get_warnings.
#Quando incorpori la Sandbox
<PostextSandbox> registra gli strumenti mentre è montato; webmcp={false}
li esclude (vedi Props). Una pagina host può aggiungere
strumenti propri tramite lo stesso modulo:
import { registerWebMcpTools } from 'postext-sandbox/webmcp';
const controller = new AbortController();
registerWebMcpTools([
{
name: 'shop_list_titles',
description: 'The titles of this shop, with the id of the Postext project of each one.',
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
annotations: { readOnlyHint: true },
execute: async () => ({ titles: await fetchTitles() }),
},
], controller.signal);
// controller.abort() takes them backVengono registrati con WebMCP dove il browser lo offre e sempre su
window.postextWebMcp, con gli argomenti controllati su inputSchema.