@prontosite/mcp 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,13 @@
3
3
  Alle nennenswerten Änderungen am MCP-Server für ProntoSite. Der Server ist ein dünner Client um die
4
4
  ProntoSite Deploy-API; die eigentliche Logik lebt serverseitig.
5
5
 
6
+ ## 0.17.0 – 2026-11-05
7
+
8
+ - JS-Freigabe-Pflicht für Änderungen entfällt (Entscheidung 05.11.): Auf Websites mit JavaScript-Freigabe wirkt jede JS-Änderung sofort wie HTML/CSS,
9
+ auch Umbenennen. `jsReview` in Antworten und `site_status` entfällt, neu ist `jsExtern` bei neuer externer Adresse im Skript
10
+ („Externe Einbindung erkannt, Datenschutzerklärung prüfen").
11
+ - `site_js_review` zeigt nur noch den Verlauf (lesend, Betreuer-Token); Parameter `path`, `action`, `note` entfallen. Instructions 2e angepasst.
12
+
6
13
  ## 0.16.0 – 2026-11-03
7
14
 
8
15
  - Formular-Anfragen per MCP (Scope `anfragen` bzw. `anfragen:schreiben`, beim Verbinden ein eigener, nie vorausgewählter Punkt;
package/api.mjs CHANGED
@@ -600,12 +600,10 @@ export async function apiLock(cfg, { site, action = null, note = null } = {}, fe
600
600
  return asJsonOr409(await fetchImpl(url, { method: "POST", headers: { ...authHeaders(token, cfg), "content-type": "application/json" }, body: JSON.stringify({ action, note }) }));
601
601
  }
602
602
 
603
- /** GET/POST /api/js-review/<site> – JS-Prüfungen (nur Betreuer-Token): ohne action Liste + Diff, sonst approve|reject. */
604
- export async function apiJsReview(cfg, { site, path: rel = null, action = null, note = null } = {}, fetchImpl = fetch) {
603
+ /** GET /api/js-review/<site> – Verlauf der JS-Änderungen (nur lesen, nur Betreuer-Token). */
604
+ export async function apiJsReview(cfg, { site } = {}, fetchImpl = fetch) {
605
605
  const { token, slug } = resolveTarget(cfg, site);
606
- const url = `${baseUrl(cfg)}/js-review/${encodeURIComponent(slug)}`;
607
- if (!action) return asJson(await fetchImpl(url, { headers: authHeaders(token, cfg) }));
608
- return asJson(await fetchImpl(url, { method: "POST", headers: { ...authHeaders(token, cfg), "content-type": "application/json" }, body: JSON.stringify({ path: rel, action, note }) }));
606
+ return asJson(await fetchImpl(`${baseUrl(cfg)}/js-review/${encodeURIComponent(slug)}`, { headers: authHeaders(token, cfg) }));
609
607
  }
610
608
 
611
609
  /** GET /api/inbox/<site> – Formular-Anfragen: Liste (Filter), eine Anfrage (id) oder Statistik (stats). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prontosite/mcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "MCP-Server für ProntoSite – Website-Status, Export, Deploy und Veröffentlichen direkt aus einem KI-Assistenten (Claude Desktop). Dünner Client um die ProntoSite Deploy-API.",
5
5
  "type": "module",
6
6
  "bin": {
package/tools.mjs CHANGED
@@ -29,11 +29,11 @@ const instructionLines = mode => [
29
29
  "2a. Für Text-, Link- und Kontaktdaten-Änderungen (Telefonnummer, E-Mail, Adresse, Öffnungszeiten) IMMER site_edit_text mit "
30
30
  + "scope:\"all\" (bei Bedarf region:\"footer\"/\"header\") – EIN Aufruf für alle Seiten, inkl. tel:/mailto:-Links. NIE Seite für Seite per "
31
31
  + "site_file_put. Meldet die Antwort company, zusätzlich site_company_set für die Firmendaten (Impressum/Datenschutz/Kontakt).",
32
- "2e. Preise, Texte und Zahlen in Skriptdateien (.js, z. B. Preisrechner) ändert site_edit_text mit scope:\"all\" mit – ersetzt wird dort "
33
- + "nur in Texten/Zahlen/Kommentaren, nie im Code. Nur-Zahlen/Texte-Änderungen wirken sofort; alles andere prüft der Betreuer. Meldet eine "
34
- + "Antwort jsReview.status \"pending\" (bzw. site_status jsReview.pending), dem Nutzer sagen: Änderung gespeichert, sie wartet auf Freigabe "
35
- + "durch den Betreuer, der Betreuer ist benachrichtigt – bis dahin läuft auf der Website der bisherige Stand. Nicht erneut versuchen und "
36
- + "nicht umgehen (z. B. nicht ins HTML verlagern).",
32
+ "2e. Skriptdateien (.js): Preise, Texte und Zahlen darin (z. B. Preisrechner) ändert site_edit_text mit scope:\"all\" mit – ersetzt wird dort "
33
+ + "nur in Texten/Zahlen/Kommentaren, nie im Code; für Code-Änderungen site_file_get/site_file_put. Bei JavaScript-Freigabe der Website wirkt "
34
+ + "jede Änderung sofort wie HTML/CSS, es gibt keine Prüfung und keine Wartezeit. Meldet eine Antwort jsExtern (\"Externe Einbindung erkannt, "
35
+ + "Datenschutzerklärung prüfen\"), dem Nutzer das sagen und die genannten Adressen nennen: die Änderung ist gespeichert, die Datenschutzerklärung "
36
+ + "muss er selbst prüfen. Ohne JavaScript-Freigabe der Website kommt 403: dem Nutzer sagen, dass der Betreuer JavaScript für die Website einmalig freigeben muss.",
37
37
  "2c. Für Markup über alle Seiten (z. B. Footer-HTML) site_edit_html mit scope:\"all\" (ggf. region:\"footer\"), nie Seite für Seite per site_file_put. "
38
38
  + "Entwurfs-Limit je Website: 300 Änderungen je Stunde, davon 30 direkt hintereinander (Kunden und Betreuer gleich) – dieselbe Änderung auf vielen Seiten ist EIN Aufruf (site_edit_text scope:\"all\" bzw. site_edit_html). Bei 429 (rateLimited) NICHT aufgeben: retryAfter Sekunden warten, dann weitermachen; bisherige Änderungen bleiben gespeichert.",
39
39
  "2d. Badge „Made with ProntoSite\" NUR als dieses Snippet einbauen (Footer, letzte Zeile, bündig mit dem Copyright), nie manuell stylen: "
@@ -82,7 +82,7 @@ export const SERVER_INSTRUCTIONS = instructionsFor("remote");
82
82
  // Tool-Annotationen (MCP ToolAnnotations): ChatGPT & Co. fragen sonst bei JEDEM Aufruf nach. readOnly = ändert nichts;
83
83
  // destructive = live/kundenwirksam, ersetzt Bestand oder nimmt zurück (Bestätigung sinnvoll). Entwurfs-Änderungen sind
84
84
  // rückgängig machbar und daher nicht destruktiv. openWorld = wirkt nach außen (öffentliche Website/DNS).
85
- const READ_ONLY = new Set(["sites_list", "site_status", "site_forms_get", "media_search", "site_page_texts", "site_media_list", "site_preview_screenshot", "site_company_get",
85
+ const READ_ONLY = new Set(["site_js_review", "sites_list", "site_status", "site_forms_get", "media_search", "site_page_texts", "site_media_list", "site_preview_screenshot", "site_company_get",
86
86
  "site_domain_status", "site_embeds", "site_widgets", "site_files", "site_file_get", "site_inbox_list", "site_inbox_get", "site_inbox_stats"]);
87
87
  const DESTRUCTIVE = new Set(["site_publish", "site_deploy", "deploy_commit", "site_file_delete", "site_media_delete", "site_inbox_delete", "site_undo", "site_redo", "site_domain_connect"]);
88
88
  const OPEN_WORLD = new Set(["site_publish", "site_deploy", "deploy_commit", "site_domain_connect", "media_search", "media_import"]);
@@ -203,7 +203,7 @@ export function registerTools(server0, { z, cfg, mode = "local", remote = null }
203
203
  + "scope:\"all\" = alle Fundstellen auf allen Seiten sofort ersetzen (für Kontaktdaten im Kopf-/Fußbereich: plus region:\"footer\" bzw. "
204
204
  + "\"header\"); ohne scope ändert der Server bei mehr als einer Fundstelle NICHTS und liefert nur die Liste (oder pages:[…]). "
205
205
  + "Mit scope:\"all\" auch in Skriptdateien (.js, z. B. Preisrechner) – dort nur in Texten/Zahlen/Kommentaren (skripte = Fundstellen); "
206
- + "jsReview.status \"pending\" = wartet auf Freigabe durch den Betreuer (dem Nutzer sagen). "
206
+ + "jsExtern = neue externe Adresse im Skript (dem Nutzer sagen: Datenschutzerklärung prüfen). "
207
207
  + "Telefonnummern werden unabhängig von Schreibweise gefunden (Leerzeichen, „/“, „-“, Klammern, geschütztes Leerzeichen); ersetzt "
208
208
  + "wird wörtlich durch `replace`. Antwort: treffer = getrennt nach text/linktext/linkziel/attribut; linktextNichtGefunden = tel:-Ziel "
209
209
  + "geändert, sichtbarer Linktext aber nicht (dem Nutzer sagen). pages = je Seite gefunden/geändert. Rechtstexte und geschützte Bereiche bleiben unberührt (skipped); steht der Wert in "
@@ -628,19 +628,14 @@ export function registerTools(server0, { z, cfg, mode = "local", remote = null }
628
628
  }
629
629
  );
630
630
  }
631
- // JS-Prüfungen entscheiden (nur Betreuer-Token; der Server prüft die Rolle zusätzlich).
631
+ // JS-Verlauf lesen (nur Betreuer-Token; der Server prüft die Rolle zusätzlich).
632
632
  if (mode === "local" || remote?.isManager) {
633
633
  server.tool(
634
634
  "site_js_review",
635
- "NUR BETREUER-TOKEN: ausstehende Prüfungen von Skript-Änderungen (JS) einer Website. Ohne action: Liste mit Gründen und Zeilen-Diff "
636
- + "(freigegebener Stand → Entwurf; lesend). action='approve' gibt die Änderung frei (danach normaler Publish bzw. mit der nächsten "
637
- + "Veröffentlichung), action='reject' setzt die Datei auf den freigegebenen Stand zurück (note = Grund, sieht der Kunde). Nur freigeben, "
638
- + "was im Diff verstanden ist; im Zweifel ablehnen oder den Nutzer fragen.",
639
- { site: z.string().optional().describe(SITE_DESC),
640
- path: z.string().optional().describe("Datei (z. B. 'js/rechner.js') – für approve/reject Pflicht."),
641
- action: z.enum(["approve", "reject"]).optional().describe("Leer = nur ansehen."),
642
- note: z.string().optional().describe("Notiz/Grund (bei reject sinnvoll).") },
643
- async ({ site, path, action, note }) => { try { return asText(await apiJsReview(cfg, { site, path, action, note })); } catch (e) { return asError(e); } }
635
+ "LESEND, NUR BETREUER-TOKEN: Verlauf der Änderungen an Skriptdateien (JS) einer Website – Zeit, Datei, von wem, Art (werte | code | neu) "
636
+ + "und neu eingebundene externe Adressen (extern). Reine Information: Änderungen wirken sofort, es gibt nichts freizugeben.",
637
+ { site: z.string().optional().describe(SITE_DESC) },
638
+ async ({ site }) => { try { return asText(await apiJsReview(cfg, { site })); } catch (e) { return asError(e); } }
644
639
  );
645
640
  }
646
641
  server.tool(
@@ -701,9 +696,8 @@ export function registerTools(server0, { z, cfg, mode = "local", remote = null }
701
696
  // ---- Datei-API: kleine Änderungen am Entwurf direkt auf dem Server (Konzept §7) ----
702
697
  const FILE_SMALL = "STANDARDWEG: Änderungen direkt am Server-Entwurf (für reine Textänderungen am einfachsten site_edit_text); "
703
698
  + "Export + Deploy nur als Ausnahme für größere Umbauten oder auf ausdrücklichen Wunsch. "
704
- + "Skriptdateien (JavaScript) nur bei JavaScript-Freigabe der Website; Kunden-Änderungen daran prüft der Server: nur Zahlen/Texte/"
705
- + "Kommentare → wirkt sofort, sonst gespeichert, aber erst nach Freigabe durch den Betreuer live (Antwort jsReview.status \"pending\" – "
706
- + "dem Nutzer so sagen). Preise/Texte in Skripten besser mit site_edit_text scope:\"all\". ";
699
+ + "Skriptdateien (JavaScript) nur bei JavaScript-Freigabe der Website; dann wirkt jede Änderung sofort wie HTML/CSS. Neue externe Adresse im "
700
+ + "Skript → Antwort jsExtern (dem Nutzer sagen: Datenschutzerklärung prüfen). Preise/Texte in Skripten besser mit site_edit_text scope:\"all\". ";
707
701
  server.tool(
708
702
  "site_files",
709
703
  "LESEND: Listet die Dateien des Entwurfs einer Website (Pfad, Größe, Typ, ob bearbeitbar) und die aktuelle draftRev. "