Kapitel 23 · Teil III · In der Praxis
WebMCP: ein Agent bei der Arbeit in der Sandbox
Was ein KI-Agent im Browser mit den 36 WebMCP-Werkzeugen der Sandbox tun kann – Seiten ansehen, jede Einstellung ändern, den Text bearbeiten, Bilder, Tabellen und Schriften hinzufügen, die Prüfungen ausführen, exportieren – und wie jedes Werkzeug aufgerufen wird, mit echten Argumenten und Antworten
Kurz gesagt
Diese Seite ist für alle, die einen KI-Helfer für sich an einem Buch in der Sandbox arbeiten lassen möchten. Solange die Sandbox geöffnet ist, gibt sie dem Helfer eine Reihe von Werkzeugen: um jede Seite anzusehen, die Gestaltung zu ändern, den Text zu bearbeiten, Bilder und Tabellen hinzuzufügen, Probleme zu finden und Dateien zu speichern. Sie bitten mit Ihren eigenen Worten, zum Beispiel „mach die Schrift etwas größer und prüf, ob das Buch noch auf 40 Seiten passt“, und der Helfer setzt die Werkzeuge ein und zeigt Ihnen die Seiten. Alles bleibt in Ihrem Browser. Die Seite erklärt, wie Sie einen Helfer verbinden, was er tun kann und wie jedes Werkzeug aufgerufen wird.
Ein Agent in Ihrem Browser arbeitet an dem Buch, das in der Sandbox geöffnet ist: Er sieht sich die Seiten an, ändert sie und sieht wieder hin.
Die Sandbox gibt einem Agenten eigene Werkzeuge über
WebMCP, einen Entwurf für einen
Webstandard, mit dem eine Seite dem KI-Modell, mit dem der Browser spricht,
Werkzeuge übergeben kann. Damit klickt sich der Agent nicht durch die
Oberfläche: Er liest das Buch, fordert ein Bild von Seite 12 an, setzt
bodyText.fontSize auf 10,5 pt, sieht, dass das Kapitel von 18 auf 19 Seiten
gewachsen ist, und nimmt die Änderung zurück. Er tut, was Sie mit dem Auge tun,
und er tut es mit Ihrem Buch, in Ihrem Browser.
Es gibt 36 Werkzeuge, deren Namen mit sandbox_ beginnen und die registriert
sind, solange die Sandbox auf dem Bildschirm ist, und 8 Werkzeuge der Website,
site_*, auf jeder Seite von postext.dev. Diese Seite ordnet sie nach dem, was
Sie einen Agenten tun lassen würden, und zeigt für jedes den Aufruf.
#Einen Agenten verbinden
#In einem Browser mit WebMCP
Die Werkzeuge werden bei document.modelContext registriert, wenn die Sandbox
geladen wird, und wieder zurückgenommen, wenn Sie sie verlassen. Ein Agent, dem
der Browser Seitenwerkzeuge übergibt, findet sie dort. Auf der Seite von
Postext muss nichts installiert oder eingerichtet werden.
WebMCP ist noch ein Entwurf. Chrome bietet es als Origin Trial an und hinter
dem Flag chrome://flags/#enable-webmcp-testing. Die Werkzeuge folgen der
Seite: Auf der Startseite oder in der Dokumentation hat der Agent die
Werkzeuge site_*; sobald die Sandbox auf dem Bildschirm ist, kommen die 36
Werkzeuge sandbox_* hinzu.
#In jedem anderen Browser: window.postextWebMcp
Die Seite legt dieselben Werkzeuge außerdem auf window.postextWebMcp ab, mit
oder ohne WebMCP. Jeder Agent, der Skripte in der Seite ausführen kann, kann
sie nutzen: ein Automatisierungswerkzeug wie Puppeteer oder Playwright, ein
MCP-Server, der den Browser steuert und Skripte auswertet (Chrome DevTools
MCP), eine Browsererweiterung oder Sie selbst in der Entwicklerkonsole:
// 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' }],
});Dasselbe aus einem Puppeteer-Skript, das eine Seite als Bild speichert:
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();Ein frisches Browserprofil hat seinen eigenen Speicher und beginnt daher mit den Beispielen, nicht mit Ihren Projekten. Um an Ihren eigenen Büchern zu arbeiten, verwenden Sie den Browser, in dem Sie sie angelegt haben.
#Wie jede Antwort aussieht
Ein Werkzeug antwortet mit einem JSON-Objekt: ok: true und dem, was
angefragt wurde, oder ok: false und einem error, der sagt, was falsch war
und was stattdessen anzufragen ist:
{
"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."
}Die Argumente werden gegen das Schema des Werkzeugs geprüft, bevor irgendetwas
läuft, sodass ein falsch geschriebener Parameter mit der Liste der richtigen
abgewiesen wird. Ein Werkzeug, das Bilder zurückgibt (sandbox_render_page),
antwortet in der Form von MCP, { content: [...] }: ein Textteil mit JSON,
das die Seiten beschreibt, dann ein Bildteil je Seite, base64-kodiert.
#Der Arbeitszyklus
Jedes Werkzeug, das das Buch ändert, wartet mit seiner Antwort, bis das Layout nachgezogen hat, und nennt die Seitenzahl jedes Kapitels. Der nächste Blick gilt also immer den neuen Seiten, und der Agent kann arbeiten wie ein Gestalter:
- Sehen, wo die Dinge stehen:
sandbox_get_stateliefert das Buch, seine Kapitel mit ihren Seiten, das Kapitel und die Seite auf dem Bildschirm und das geöffnete Bedienfeld. - Hinsehen:
sandbox_render_pagezeichnet eine Seite,sandbox_inspect_pagesbeschreibt sie als Daten,sandbox_get_warningslistet auf, was die Prüfungen gefunden haben. - Ändern:
sandbox_set_config,sandbox_edit_text,sandbox_save_resource… - Erneut hinsehen und die Änderung behalten oder zurücknehmen.
Eine Seite wird für das Werkzeug gesetzt und gezeichnet, gleich welcher Betrachter auf dem Bildschirm ist; der Agent kann sich also Kapitel 7 ansehen, während Sie Kapitel 2 lesen.
#Was Sie verlangen können und wie es geht
#Herausfinden, was geöffnet ist
// 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 kommt mit waitingFor, das den Grund nennt (ein Buch, das noch
lädt). question und notice erscheinen, wenn die Sandbox auf Sie wartet;
siehe Rückfragen und Hinweise.
Jedes Werkzeug, das ein chapter annimmt, akzeptiert seine Position im Buch
(ab 1), seinen Titel oder seine ID. Fehlt die Angabe, ist es das Kapitel auf
dem Bildschirm.
#Eine Seite ansehen
Ein Bild. „Zeig mir den Anfang von Kapitel 3“, „wie sieht die Doppelseite 24/25 aus?“:
// sandbox_render_page: a spread, 1200 px wide per page
{ "chapter": 3, "page": 24, "count": 2, "width": 1200 }page ist die Zahl, die auf der Seite gedruckt ist; position ist der Platz
der Seite unter den Seiten des Kapitels (ab 1), für Seiten ohne Pagina. Ohne
beides ist es die Seite auf dem Bildschirm. crop vergrößert einen Teil der
Seite, angegeben in Bruchteilen ihrer Breite und Höhe ab der linken oberen
Ecke, um Schrift und Abstände aus der Nähe zu beurteilen:
// 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 zeichnet den Softproof des Druckprofils mit den
Hilfslinien für Endformat, Anschnitt und Sicherheitszone; trimmed: true lässt
den Rand mit den Schneidemarken weg.
Dieselbe Seite als Daten. „Welche Zeilen auf dieser Seite sind zu locker?“, „ist die zweite Spalte voll?“:
// 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…" }
]
}Mit page oder position listet es jeden Block der Seite auf: seinen Typ,
seine Spalte, seinen Text, die Zahl seiner Zeilen, die Zeilen, die mit einem
Trennstrich enden, und die zu lockeren Blocksatzzeilen mit der Breite ihrer
Zwischenräume, seinen Rahmen auf der Seite, dazu, wie voll jede Spalte ist
(fill: 0.99).
Was an einem Punkt steht. Sieht der Agent etwas auf einem Bild, fragt er mit denselben Bruchteilen wie beim Ausschnitt, was es ist:
// sandbox_inspect_point
{ "chapter": 3, "page": 24, "x": 0.71, "y": 0.42 }Die Antwort nennt den Block, die Zeile und Spalte der Markdown-Quelle an dieser
Stelle (und das Wort), einen Link und die Seite, auf die er führt, die
Tabellenzelle oder Legende einer Ressource. Mit select: true tut sie
außerdem, was ein Klick tut: Das Bedienfeld Text öffnet sich mit der
Einfügemarke an dieser Stelle (word: true wählt das Wort aus, to wählt bis
zu einem zweiten Punkt aus).
#Die Gestaltung ändern
Jede Einstellung der Konfiguration lässt sich über ihren Pfad ändern. Ein Agent kennt den Pfad anfangs selten, also sucht er ihn:
// 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 liest eine Einstellung oder einen ganzen Abschnitt: set
ist, was das Buch speichert, effective, was sich mit den eingesetzten
Standardwerten ergibt; das zeigt zugleich jede Einstellung, die der Abschnitt
hat.
// sandbox_get_config
{ "path": "headings.levels[level=2]" }Pfade benennen einen Eintrag einer Liste über das, was ihn unterscheidet:
headings.levels[level=2].fontSize, header.elements[id=titleOdd].italic,
calloutStyles[id=note].title. Dann ändert sandbox_set_config in einem
Aufruf so viele Einstellungen, wie Sie möchten:
// 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 }
]
}Eine Länge ist "2.5cm", { "value": 2.5, "unit": "cm" } oder eine Zahl in
der Einheit der Einstellung; eine Farbe ist "#1f3a5f". Ein Wert null
entfernt die Einstellung, sodass der Wert der Gestaltung zurückkommt. Die
Antwort sagt, wie die Änderung zu beurteilen ist und wie sie sich zurücknehmen
lässt:
{
"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 ist der zuvor gespeicherte Wert (hier null: Das Buch hatte ihn nicht
gesetzt), sodass derselbe Aufruf mit from als Wert die Änderung rückgängig
macht. followed listet die Einstellungen auf, die von dieser abhängen und
mit ihr mitgegangen sind. Ein note erscheint, wenn die Engine etwas anderes
aufgelöst hat als verlangt (eine Grenze, eine Einstellung, die von einer
anderen abhängt), und ein Wert in falscher Form oder eine Konfiguration, die
die Engine nicht auflösen kann, wird abgewiesen, ohne dass sich etwas ändert.
Für größere Änderungen führt patch ein Objekt in die Konfiguration ein
(Objekte werden zusammengeführt, null entfernt, Listen werden als Ganzes
ersetzt), und replace setzt eine ganze Konfiguration an die Stelle der des
Buches, etwa einen Export als postext-config.json.
sandbox_reset_to_original mit part: "config" stellt die Gestaltung wieder
her, mit der das Buch begonnen hat.
Auch Schriften sind Einstellungen: sandbox_list_fonts mit
search: "Garamond" findet Familien im offenen Katalog, und wenn Sie den Namen in eine
Einstellung fontFamily schreiben, wird die Schrift geladen.
#Den Text bearbeiten
Der Text jedes Kapitels ist Markdown mit den Erweiterungen von Postext (siehe Dokumentformat). Der Agent liest ihn mit Zeilennummern, findet eine Passage und ersetzt genaue Passagen:
// 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 }
]
}Jedes find muss exakt mit der Quelle übereinstimmen und genau einmal
vorkommen, es sei denn, all ist gesetzt. Entweder greift jede Bearbeitung
oder keine: Eine Passage, die nicht vorhanden ist, wird mit dem Rat abgewiesen,
das Kapitel erneut zu lesen. Der ganze Aufruf ist ein Schritt für
sandbox_undo_text, das ihn zurücknimmt (redo: true stellt ihn wieder her).
sandbox_write_text ersetzt ein ganzes Kapitel, aus markdown oder aus einer
Datei .md.
Um Ihnen eine Stelle im Text zu zeigen, öffnet sandbox_select_text das
Bedienfeld Text mit dieser Passage ausgewählt (über text, line oder
offset), wie es ein Klick auf einen Befund im Bedienfeld Prüfungen tut.
#Die Kapitel ordnen
sandbox_manage_chapters fügt Kapitel hinzu, benennt sie um, verschiebt,
teilt, verbindet und zeigt sie:
// 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 löscht eines, was sich nicht rückgängig machen lässt.
#Bilder, Tabellen, Videos und Schriften hinzufügen
sandbox_save_resource fügt eine Ressource hinzu oder ändert eine, wie es das
Bedienfeld Ressourcen tut. Eine Datei kommt über url (eine https:-Adresse,
die die Seite abrufen kann, oder eine data:-URL) oder als 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" }Die Antwort liefert den gespeicherten Datensatz und die Zeile, die ihn
platziert, ::resource{id="prices"}, die der Agent dann mit
sandbox_edit_text in den Text schreibt. Bei einer bestehenden id ändert der
Aufruf nur, was er angibt: eine Legende, die Zellen einer Tabelle, die
Platzierung, den Sicherheitsbereich eines Bildes. newId benennt eine
Ressource um und standardmäßig auch jeden Verweis auf sie im Buch.
sandbox_list_resources listet sie auf und liefert mit einer id eine davon
vollständig (die Zellen einer Tabelle mit ihrer Formatierung, die Quelle eines
SVG).
In das Buch hochgeladene Schriften laufen über sandbox_save_font:
{ "action": "add", "family": "My Serif", "weight": 700, "style": "italic", "file": { "url": "https://example.org/MySerif-BoldItalic.woff2" } }#Das Buch prüfen
// sandbox_get_warnings: every chapter
{ "scope": "book" }Die Antwort ist das, was das Bedienfeld Prüfungen meldet, für jedes Kapitel oder das ganze Buch, gleich was auf dem Bildschirm ist: fehlende Schriften und Bilder, Auszeichnungen, die die Engine nicht lesen konnte, Gestaltungselemente, die nicht passen, Text, der für seinen Hintergrund zu blass ist, zu lockere Zeilen, Witwen, überlaufende Kästen und die Druckvorstufenprüfung. Jede Warnung hat ihre Kategorie, ihr Kapitel, ihre Zeile und Offsets, ihre Seite und die Einstellung oder Ressource, die sie nennt:
{
"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."
}
]
}Von einer Warnung aus kann der Agent zu ihrer Stelle gehen
(sandbox_select_text mit offset und toOffset oder sandbox_go_to_page),
sich die Seite ansehen und den Text oder die Einstellung ändern. category
grenzt die Liste ein; bei einem langen Buch setzt scope: "book" jedes Kapitel
und braucht eine Weile.
#Ihnen etwas zeigen
Was der Agent ändert, sehen Sie. Um Sie auf etwas hinzuweisen:
// 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 wählt außerdem den Betrachter (canvas, pdf, folio,
html, epub), das seitliche Bedienfeld, Kapitel oder ganzes Buch, den Zoom,
die Lesegröße der Schrift, die Druckvorschau und die Gruppe des Bedienfelds
Gestaltung. sandbox_go_to_page blättert über step, page, position, eine
Textpassage text, einen anchor oder einen Eintrag contents eines EPUB.
sandbox_run_viewer betätigt eine Schaltfläche der Werkzeugleiste:
regenerate erzeugt das PDF oder EPUB neu und wartet darauf, print öffnet
den Druckdialog, den Sie bestätigen, play_video spielt ein Video auf einer
Seite ab.
#Comicseiten
sandbox_inspect_comic liefert die Panels, Trennlinien und Sprechblasen einer
Comicseite mit ihren Positionen; sandbox_edit_comic nimmt die Änderungen vor,
die ein Mensch mit dem Zeiger vornimmt, und schreibt sie in die Quelle:
// 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 }Die Antwort warnt, wenn eine Sprechblase auf einem Gesicht landet oder aus ihrem Panel herausragt. Das Format beschreibt Comics.
#Bücher, Dateien und Word
-
Bücher öffnen und behalten.
sandbox_list_bookslistet die Beispiele und Ihre Projekte auf;sandbox_open_booköffnet eines ({ "kind": "sample", "id": "postext-guide", "language": "es" });sandbox_save_bookmitaction: "copy_current"behält das Buch auf dem Bildschirm als eigenes Projekt,new_blankbeginnt ein leeres. -
Exportieren.
sandbox_exportschreibtpdf,epub,postext,docx,markdownoderconfig. Standardmäßig lädt der Browser die Datei herunter; mitdeliver: "data"kommt ein PDF oder EPUB base64-kodiert an den Agenten zurück:{ "format": "pdf", "scope": "book", "deliver": "data" } -
Eine
.postext-Datei importieren mitsandbox_import_book(inspect: truesagt, welche Sprachen sie enthält, ohne sie zu importieren). -
Ein Word-Manuskript übernehmen mit
sandbox_import_word. Führen Sie es zuerst mitdryRun: trueaus: Es ändert nichts und antwortet mit dem Qualitätsbericht, jedem Word-Format mit dem, was daraus würde, und den Kapiteln und Ressourcen, die es anlegen würde. Korrigieren Sie dann die Zuordnung und führen Sie es richtig aus:{ "file": { "url": "https://example.org/manuscript.docx" }, "destination": "book", "mapping": { "paragraphs": { "Epigraph": { "kind": "quote" }, "Chapter Title": { "kind": "chapter" } } }, "saveTemplateAs": "My publisher" }sandbox_word_templateslistet die gespeicherten Zuordnungen auf, liest, speichert und löscht sie; auch der Word-Export verwendet sie.
#Rückfragen und Hinweise
Öffnet ein Link ein Buch, von dem Sie bereits eine eigene Fassung haben, fragt
die Sandbox, ob Ihre Kopie ersetzt werden soll, und sandbox_get_state meldet
das als question mit ready: false. sandbox_answer beantwortet die Frage:
replaceCopy: false behält Ihre Kopie, true ersetzt sie durch das
veröffentlichte Buch und löscht Ihre Kopie. dismissNotice: true schließt die
Meldung des Bedienfelds Bücher.
#Drei Sitzungen von Anfang bis Ende
„Mach die Schrift etwas größer, aber halte das Buch unter 220 Seiten.“
sandbox_get_state (212 Seiten) → sandbox_set_config mit
bodyText.fontSize auf "10.5pt" (219 Seiten) → sandbox_render_page auf
einer dichten Seite, um sie zu beurteilen → sandbox_get_warnings mit
category: "typesetting" für neue Witwen → falls etwas schiefgegangen ist,
erneut sandbox_set_config mit den Werten from der ersten Antwort.
„Behebe, was die Prüfungen in Kapitel 4 gefunden haben.“
sandbox_get_warnings mit chapter: 4 → für jede Warnung sandbox_read_text
rund um ihre line und sandbox_render_page ihrer page →
sandbox_edit_text oder sandbox_set_config → erneut sandbox_get_warnings,
bis die Liste leer zurückkommt.
„Mach aus dieser Word-Datei ein Buch und gib mir das PDF.“
sandbox_save_book mit action: "new_blank" → sandbox_import_word mit
dryRun: true → korrigiertes mapping, dann der echte Import mit
destination: "book" → sandbox_get_warnings mit scope: "book" →
sandbox_export mit format: "pdf" und scope: "book".
#Was Ihre Zustimmung verlangt
Sechs Werkzeuge tun etwas, das sich nicht zurücknehmen lässt, und sind als
folgenreich markiert (consequentialHint), damit der Browser Sie fragen kann,
bevor sie laufen: sandbox_remove_chapter, sandbox_delete_resource,
sandbox_delete_book, sandbox_reset_to_original, sandbox_import_word (es
kann das ganze Buch ersetzen) und sandbox_answer (es kann Ihre Kopie eines
Buches löschen). Bitten Sie den Agenten im Zweifel, zuerst eine Kopie als
.postext zu exportieren.
Werkzeuge, die nur lesen, sind mit readOnlyHint markiert, und solche, deren
Antwort Text enthält, den nicht die Seite geschrieben hat (der eigene Text des
Buches, eine abgerufene Datei), mit untrustedContentHint, damit der Browser
verhindern kann, dass dieser Text für Anweisungen gehalten wird.
#Grenzen
- Alles bleibt in Ihrem Browser. Die Werkzeuge erreichen nichts, was die
Sandbox selbst nicht erreicht: Ihre Bücher liegen im Speicher dieses
Browsers, und eine per
urlangegebene Datei wird von der Seite abgerufen, ihr Server muss das also erlauben (CORS). Einedata:-URL oderbase64funktioniert immer. - Lange Arbeiten brauchen Zeit. Ein Werkzeug wartet mit seiner Antwort auf
das Layout;
wait: falseantwortet sofort. Ein PDF oder EPUB eines langen Buches dauert Minuten. - Was
sandbox_undo_textzurücknimmt: die Textbearbeitungen der Werkzeuge (einen Aufruf nach dem anderen) und die Bearbeitungen in den Vorschauen. Nicht, was Sie im Manuskript-Editor tippen (das erledigt dessen eigenes Rückgängig), hinzugefügte oder verschobene Kapitel oder Änderungen an Gestaltung und Ressourcen: Dafür gibt es dasfromjeder Antwort. Die Liste geht verloren, wenn die Seite neu geladen wird. - Das Buch auf dem Bildschirm. Die Werkzeuge arbeiten mit dem geöffneten
Buch. Nur
sandbox_exporteiner.postext-Datei,sandbox_save_bookmitduplicateundsandbox_reset_to_originalmitsampleerreichen ein anderes Buch, ohne es zu öffnen.
#Die Werkzeuge der Website
Auf jeder Seite von postext.dev, die Sandbox eingeschlossen:
site_get_context: die Seite auf dem Bildschirm, ihre Sprache und ihr Farbschema, die Bereiche und jede Seite der Dokumentation.site_search: die Dokumentation und die Rezepte, nach Wörtern, Namen von Einstellungen (bodyText.avoidOrphans) oder Direktiven (::resource).site_read_page: eine Seite der Website als Markdown, ohne die Seite auf dem Bildschirm zu verlassen.site_open_page: eine Seite anzeigen, mit#heading, um bei einem Abschnitt zu landen.site_list_recipesundsite_open_recipe_in_sandbox: ein Rezept aus dem Rezeptbuch finden und es in der Sandbox als bearbeitbares Buch öffnen.site_lookup_term: ein Begriff aus dem Glossar (Witwe, Unterschneidung, Kinsoku …).site_set_preferences: Sprache und Farbschema der Website.
Ein Agent, der auf der Startseite beginnt, kann also das Rezeptbuch
durchsuchen, ein Rezept in der Sandbox öffnen und dort mit den Werkzeugen
sandbox_* weitermachen.
#Alle Werkzeuge
Gruppiert so, wie die Sandbox sie registriert. Die vollständige Beschreibung
und das Schema jedes Werkzeugs liefert postextWebMcp.listTools().
- Was geöffnet ist:
sandbox_get_state. - Die Seiten:
sandbox_render_page,sandbox_inspect_pages,sandbox_inspect_point. - Der Text:
sandbox_read_text,sandbox_write_text,sandbox_edit_text,sandbox_undo_text,sandbox_select_text,sandbox_search_text,sandbox_manage_chapters,sandbox_remove_chapter. - Die Gestaltung:
sandbox_get_config,sandbox_set_config,sandbox_find_setting,sandbox_reset_to_original. - Die Anzeige:
sandbox_set_view,sandbox_go_to_page,sandbox_run_viewer. - Ressourcen und Schriften:
sandbox_list_resources,sandbox_save_resource,sandbox_delete_resource,sandbox_list_fonts,sandbox_save_font. - Comics:
sandbox_inspect_comic,sandbox_edit_comic. - Bücher und Dateien:
sandbox_list_books,sandbox_open_book,sandbox_save_book,sandbox_delete_book,sandbox_import_book,sandbox_export. - Word:
sandbox_import_word,sandbox_word_templates. - Rückfragen:
sandbox_answer. - Die Prüfungen:
sandbox_get_warnings.
#Wenn Sie die Sandbox einbetten
<PostextSandbox> registriert die Werkzeuge, solange es eingebunden ist;
webmcp={false} lässt sie weg (siehe Props). Eine
Host-Seite kann über dasselbe Modul eigene Werkzeuge hinzufügen:
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 backSie werden bei WebMCP registriert, wo der Browser es anbietet, und immer auf
window.postextWebMcp, wobei ihre Argumente gegen inputSchema geprüft
werden.