@prontosite/mcp 0.17.0 → 0.18.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.18.0 – 2026-11-06
7
+
8
+ - Neu: `site_badge_set` (`aktiv`, `variant` = auto | light | dark | mono) blendet das Badge „Made with ProntoSite" für die ganze Website aus oder ein und
9
+ setzt die Variante, auf allen Tarifen. Normale Entwurfsänderung mit einem Rückgängig-Schritt, Auto-Publish-Regeln gelten. Ohne eingebautes Badge liefert die
10
+ Antwort `warnung` und `snippet`.
11
+ - `site_status`: neues Feld `badge` (`aktiv`, `variant`, `eingebaut`, `seiten`, `sichtbar`). Instructions 2d: Ausblenden nur über `site_badge_set`, nie per CSS oder HTML.
12
+
6
13
  ## 0.17.0 – 2026-11-05
7
14
 
8
15
  - JS-Freigabe-Pflicht für Änderungen entfällt (Entscheidung 05.11.): Auf Websites mit JavaScript-Freigabe wirkt jede JS-Änderung sofort wie HTML/CSS,
package/README.md CHANGED
@@ -101,6 +101,7 @@ sichern: `cp ~/.prontosite.json ~/.prontosite.json.bak`).
101
101
  | `site_embed_consent({ site?, host, page?, category, confirmed })` | Einbettung als `notwendig` (§ 25 Abs. 2 Nr. 2 TDDDG, Eigenverantwortung) oder wieder `gated` einstufen; `notwendig` nur mit `confirmed:true` (sonst 400 mit Verantwortungs-Text). Optional seiten-gebunden. Datenschutz/Cookie-Richtlinie passen sich beim nächsten Publish an. **Schreibend.** |
102
102
  | `site_widgets({ site? })` | Katalog der verwalteten Widgets: name, aktiv, optionen, schema (consent, a11y, notice/Pop-Ups, google-reviews, ps-impressum, ps-datenschutz). In jedem Plan verfügbar. **Lesend.** |
103
103
  | `site_widget_set({ site?, widget, aktiv?, optionen? })` | Widget aktivieren/deaktivieren und Optionen setzen – gleicher Schema-Sanitizer wie das Dashboard; Listen-Widgets (notice) via `optionen.items[]`. Greift beim nächsten Publish. Siehe [Widget-Katalog](https://prontosite.io/docs/widget-katalog). **Schreibend.** |
104
+ | `site_badge_set({ site?, aktiv?, variant? })` | Badge „Made with ProntoSite" für die ganze Website aus-/einblenden und Variante setzen (`auto` \| `light` \| `dark` \| `mono`), auf allen Tarifen. Stand steht in `site_status.badge`. |
104
105
 
105
106
  `site_deploy` und `site_publish` sind **schreibende** Aktionen (verändern die Live-Website). Die
106
107
  Tool-Beschreibungen weisen den Assistenten an, vorher rückzufragen. Jeder Aufruf wird serverseitig auditiert.
package/api.mjs CHANGED
@@ -303,6 +303,18 @@ export async function apiWidgetSet(cfg, { site, widget, aktiv, optionen } = {},
303
303
  return asJson(res);
304
304
  }
305
305
 
306
+ /** PUT /api/badge/<site> {aktiv?, variant?} – Badge ein-/ausblenden, Variante setzen (dieselbe Op wie das Dashboard). */
307
+ export async function apiBadgeSet(cfg, { site, aktiv, variant } = {}, fetchImpl = fetch) {
308
+ if (aktiv === undefined && variant === undefined) throw new Error("aktiv oder variant erwartet.");
309
+ const { token, slug } = resolveTarget(cfg, site);
310
+ const body = {};
311
+ if (aktiv !== undefined) body.aktiv = !!aktiv;
312
+ if (variant !== undefined) body.variant = variant;
313
+ const res = await fetchImpl(`${baseUrl(cfg)}/badge/${encodeURIComponent(slug)}`, {
314
+ method: "PUT", headers: { ...authHeaders(token, cfg), "content-type": "application/json" }, body: JSON.stringify(body) });
315
+ return asJson(res);
316
+ }
317
+
306
318
  /** GET/PUT /api/legal-options/<site> – Anzeige-Optionen der Rechtstext-Widgets. Ohne impressum/datenschutz
307
319
  * nur LESEN; sonst Teil-Update (nur echte Booleans wirken). */
308
320
  export async function apiLegalOptions(cfg, { site, impressum, datenschutz } = {}, fetchImpl = fetch) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prontosite/mcp",
3
- "version": "0.17.0",
3
+ "version": "0.18.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
@@ -9,7 +9,7 @@
9
9
  * site_domain_connect nur mit Betreuer-Token (Entscheidung 9a).
10
10
  * `z` wird vom Aufrufer übergeben (dieselbe zod-Instanz wie sein MCP-SDK).
11
11
  */
12
- import { apiEditText, apiEditHtml, apiPageTexts, apiPageTextsSet, apiPageCopy, apiMediaUploadBegin, apiMediaUploadFile, apiMediaCommit, apiMediaList, apiImageSet, apiUndo, apiMediaDelete, apiMediaRestore, apiFormsGet, apiFormsSet, apiMediaSearch, apiMediaImport, apiPreviewScreenshot, apiStatus, apiExport, apiExportFetch, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename, apiLock, apiJsReview, apiInboxGet, apiInboxPost } from "./api.mjs";
12
+ import { apiEditText, apiEditHtml, apiPageTexts, apiPageTextsSet, apiPageCopy, apiMediaUploadBegin, apiMediaUploadFile, apiMediaCommit, apiMediaList, apiImageSet, apiUndo, apiMediaDelete, apiMediaRestore, apiFormsGet, apiFormsSet, apiMediaSearch, apiMediaImport, apiPreviewScreenshot, apiStatus, apiExport, apiExportFetch, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiBadgeSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename, apiLock, apiJsReview, apiInboxGet, apiInboxPost } from "./api.mjs";
13
13
 
14
14
  /**
15
15
  * Arbeitsweise (MCP-`instructions` beim Initialize – lokal UND /mcp): Weg B ist der Standard (Nick 19.10.).
@@ -40,7 +40,8 @@ const instructionLines = mode => [
40
40
  + "<a data-ps=\"badge\" data-ps-variant=\"auto\" href=\"https://prontosite.io/?ref=badge&amp;site=<slug>\" rel=\"noopener noreferrer\">Made with ProntoSite</a> "
41
41
  + "(Variante auto | light für dunkle Footer | dark für helle Flächen | mono). Der Server ersetzt beim Ausliefern alles außer der Variante "
42
42
  + "(Schrift, Größe, Farbe, Icon). Ein vorhandenes Badge nie im HTML ändern, nachbauen oder entfernen (site_edit_text/site_edit_html/"
43
- + "site_file_put lehnen das ab; erlaubt ist nur das Wiederherstellen des Original-Markers).",
43
+ + "site_file_put lehnen das ab; erlaubt ist nur das Wiederherstellen des Original-Markers). Badge ausblenden nur über site_badge_set, nie per CSS oder HTML; "
44
+ + "dasselbe Tool ändert die Variante für die ganze Website. Stand: badge in site_status.",
44
45
  "2b. Für Übersetzungen und Textüberarbeitung: site_page_texts → Texte übersetzen/überarbeiten → site_page_texts_set, JE SEITE ein Aufruf "
45
46
  + "(neue Sprachfassung vorher mit site_page_copy, z. B. index.html → en/index.html). NIE HTML über site_file_put umschreiben. "
46
47
  + "Rechtstext-Seiten (Impressum/Datenschutz) sind ausgenommen.",
@@ -693,6 +694,20 @@ export function registerTools(server0, { z, cfg, mode = "local", remote = null }
693
694
  }
694
695
  );
695
696
 
697
+ server.tool(
698
+ "site_badge_set",
699
+ "SCHREIBEND (normale Entwurfsänderung, ein Rückgängig-Schritt, Auto-Publish-Regeln gelten): Badge „Made with ProntoSite\" für die ganze Website "
700
+ + "ein-/ausblenden und/oder die Variante setzen. Auf allen Tarifen möglich. DER einzige Weg zum Ausblenden: nie per CSS oder HTML. Beim Ausblenden bleibt "
701
+ + "der Marker im Quelltext, ausgeliefert wird ein verstecktes leeres Element; einen eigenen Trennstrich davor im Footer entfernt das nicht. "
702
+ + "Einbauen kann dieses Tool nicht: Meldet die Antwort eingebaut:false, das gelieferte snippet mit site_edit_html in die letzte Footer-Zeile setzen.",
703
+ { site: z.string().optional().describe(SITE_DESC),
704
+ aktiv: z.boolean().optional().describe("true = einblenden, false = ausblenden. Weglassen = unverändert."),
705
+ variant: z.enum(["auto", "light", "dark", "mono"]).optional().describe("Variante für alle Seiten (übersteuert data-ps-variant): auto = Textfarbe des Footers, light für dunkle Footer, dark für helle Flächen, mono = Icon einfarbig. Weglassen = unverändert.") },
706
+ async ({ site, aktiv, variant }) => {
707
+ try { return asText(await apiBadgeSet(cfg, { site, aktiv, variant })); } catch (e) { return asError(e); }
708
+ }
709
+ );
710
+
696
711
  // ---- Datei-API: kleine Änderungen am Entwurf direkt auf dem Server (Konzept §7) ----
697
712
  const FILE_SMALL = "STANDARDWEG: Änderungen direkt am Server-Entwurf (für reine Textänderungen am einfachsten site_edit_text); "
698
713
  + "Export + Deploy nur als Ausnahme für größere Umbauten oder auf ausdrücklichen Wunsch. "