@prontosite/mcp 0.11.0 → 0.11.1
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 +10 -1
- package/README.md +2 -1
- package/api.mjs +8 -0
- package/index.mjs +20 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
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.11.
|
|
6
|
+
## 0.11.1 – 2026-10-18
|
|
7
|
+
|
|
8
|
+
- **Sanfte Sperre:** neue Tools `site_lock` (Notiz optional, `takeover` nur Betreuer) und `site_unlock`. Zeigt allen anderen
|
|
9
|
+
„In Bearbeitung durch … seit …“ (Dashboard + `site_status.lock`), blockiert niemanden; wer trotzdem speichert, bekommt
|
|
10
|
+
`lockWarning`. Läuft 2 Stunden nach der letzten Änderung ab.
|
|
11
|
+
- **Seiten per Datei-Tools** (Server-seitig): `site_file_put` mit einer NEUEN `.html`-Datei legt eine Seite an;
|
|
12
|
+
`site_file_delete` / `site_file_rename` können Seiten löschen/umbenennen (Startseite geschützt, Verweise auf die alte
|
|
13
|
+
Adresse werden gemeldet, nicht umgeschrieben).
|
|
14
|
+
|
|
15
|
+
## 0.11.0 – 2026-10-18 (veröffentlicht 18.10.2026)
|
|
7
16
|
|
|
8
17
|
- **Datei-API – kleine Änderungen am Entwurf ohne lokale Kopie:** neue Tools `site_files`, `site_file_get`,
|
|
9
18
|
`site_file_put`, `site_file_delete`, `site_file_rename` (Schreiben nur mit Betreuer-Token). Pflicht-`baseRev`
|
package/README.md
CHANGED
|
@@ -87,7 +87,8 @@ sichern: `cp ~/.prontosite.json ~/.prontosite.json.bak`).
|
|
|
87
87
|
| `site_files({ site? })` | Dateien des Entwurfs (Pfad, Größe, Typ, bearbeitbar) + `draftRev`. **Lesend.** |
|
|
88
88
|
| `site_file_get({ site?, path })` | Quelltext einer Datei (Text bzw. Base64, max. 5 MB) + `draftRev` + Hinweis auf Dashboard-Änderungen darüber (`overlay`). **Lesend.** |
|
|
89
89
|
| `site_file_put({ site?, path, content, baseRev, overlay? })` | Text-Datei im Entwurf ersetzen (nur Betreuer-Token). `baseRev` Pflicht; bei Konflikt `conflict:true` mit Liste statt Überschreiben. Nicht live – danach `site_publish`. **Schreibend.** |
|
|
90
|
-
| `site_file_delete({ site?, path, baseRev, confirmDestructive? })` / `site_file_rename({ site?, from, to, baseRev })` | Text-Datei im Entwurf entfernen bzw. umbenennen (
|
|
90
|
+
| `site_file_delete({ site?, path, baseRev, confirmDestructive? })` / `site_file_rename({ site?, from, to, baseRev })` | Text-Datei im Entwurf entfernen bzw. umbenennen; eine Seite löschen/umbenennen (Startseite geschützt, Verweise werden gemeldet). Eine neue `.html` per `site_file_put` legt eine neue Seite an. Undo-fähig, nur Betreuer-Token. **Schreibend.** |
|
|
91
|
+
| `site_lock({ site?, note?, takeover? })` / `site_unlock({ site? })` | Sanfte Sperre „In Bearbeitung durch …“ (2 h, verlängert sich bei jeder Änderung). Blockiert niemanden; `takeover` nur als Betreuer. |
|
|
91
92
|
| `site_export({ site?, which, outDir })` | ZIP (`published`\|`draft`\|`original`) lokal speichern. **Lesend.** |
|
|
92
93
|
| `site_deploy({ site?, zipPath, publish?, resetOverlay?, legal?, company?, siteOverride? })` | ZIP importieren, optional live; optional Firmendaten im selben Aufruf setzen. Beim lokalen Bauen Bausteine im HTML per `data-ps` markieren (`formular:kontakt`, `impressum`/`datenschutz`, `link-impressum`/`link-datenschutz`) → [Marker-Syntax](https://prontosite.io/docs/marker-shortcodes). **Schreibend.** |
|
|
93
94
|
| `site_publish({ site? })` | Aktuellen Stand erneut veröffentlichen. **Schreibend.** |
|
package/api.mjs
CHANGED
|
@@ -378,3 +378,11 @@ export async function apiFileRename(cfg, { site, from, to, baseRev } = {}, fetch
|
|
|
378
378
|
return asJsonOr409(await fetchImpl(`${baseUrl(cfg)}/file/${encodeURIComponent(slug)}/rename`, {
|
|
379
379
|
method: "POST", headers: { ...authHeaders(token), "content-type": "application/json" }, body: JSON.stringify({ from, to, baseRev }) }));
|
|
380
380
|
}
|
|
381
|
+
|
|
382
|
+
/** GET/POST /api/lock/<site> – sanfte Sperre („in Bearbeitung durch …"); blockiert niemanden. action: lock|unlock|takeover. */
|
|
383
|
+
export async function apiLock(cfg, { site, action = null, note = null } = {}, fetchImpl = fetch) {
|
|
384
|
+
const { token, slug } = resolveTarget(cfg, site);
|
|
385
|
+
const url = `${baseUrl(cfg)}/lock/${encodeURIComponent(slug)}`;
|
|
386
|
+
if (!action) return asJson(await fetchImpl(url, { headers: authHeaders(token) }));
|
|
387
|
+
return asJsonOr409(await fetchImpl(url, { method: "POST", headers: { ...authHeaders(token), "content-type": "application/json" }, body: JSON.stringify({ action, note }) }));
|
|
388
|
+
}
|
package/index.mjs
CHANGED
|
@@ -13,13 +13,13 @@ import { realpathSync } from "node:fs";
|
|
|
13
13
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
14
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
15
|
import { z } from "zod";
|
|
16
|
-
import { loadConfig, apiStatus, apiExport, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename } from "./api.mjs";
|
|
16
|
+
import { loadConfig, apiStatus, apiExport, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename, apiLock } from "./api.mjs";
|
|
17
17
|
|
|
18
18
|
const cfg = loadConfig();
|
|
19
19
|
// Deutliche Startwarnung bei ambiger Konfiguration (Top-Level-Token NEBEN sites-Map). Nach stderr, damit
|
|
20
20
|
// es im MCP-Log/Terminal auffällt; die endgültige Auflösung (Betreuer-Token-Vorrang vs. Map) klärt sites_list.
|
|
21
21
|
for (const w of (cfg.warnings || [])) process.stderr.write("[prontosite-mcp] ⚠ " + w + "\n");
|
|
22
|
-
const server = new McpServer({ name: "prontosite", version: "0.11.
|
|
22
|
+
const server = new McpServer({ name: "prontosite", version: "0.11.1" });
|
|
23
23
|
const asText = obj => ({ content: [{ type: "text", text: JSON.stringify(obj, null, 2) }] });
|
|
24
24
|
const asError = e => ({ isError: true, content: [{ type: "text", text: "Fehler: " + (e?.message || String(e)) }] });
|
|
25
25
|
const SITE_DESC = "Website-Slug (z. B. 'mas-monti'). Ohne Angabe die Standard-Site der Config. Bei Betreuer-"
|
|
@@ -333,6 +333,24 @@ server.tool(
|
|
|
333
333
|
async ({ site, from, to, baseRev }) => { try { return asText(await apiFileRename(cfg, { site, from, to, baseRev })); } catch (e) { return asError(e); } }
|
|
334
334
|
);
|
|
335
335
|
|
|
336
|
+
server.tool(
|
|
337
|
+
"site_lock",
|
|
338
|
+
"Setzt eine sanfte Sperre „in Bearbeitung durch <dich>“ (2 h, verlängert sich bei jeder deiner Änderungen). Blockiert "
|
|
339
|
+
+ "niemanden – andere sehen nur einen Hinweis und bekommen beim Speichern eine Warnung. Vor einer längeren Bearbeitungsserie "
|
|
340
|
+
+ "setzen. Ist schon jemand anderes in Bearbeitung, kommt conflict/409 mit dem Hinweis – takeover:true NUR als Betreuer und nur "
|
|
341
|
+
+ "nach Rückfrage beim Nutzer (die andere Person sieht die Übernahme).",
|
|
342
|
+
{ site: z.string().optional().describe(SITE_DESC),
|
|
343
|
+
note: z.string().optional().describe("Optionale Notiz, z. B. „Startseite überarbeiten“ (andere sehen sie im Hinweis)."),
|
|
344
|
+
takeover: z.boolean().default(false).describe("true = fremde Sperre übernehmen (nur Betreuer, nach Rückfrage).") },
|
|
345
|
+
async ({ site, note, takeover }) => { try { return asText(await apiLock(cfg, { site, note, action: takeover ? "takeover" : "lock" })); } catch (e) { return asError(e); } }
|
|
346
|
+
);
|
|
347
|
+
server.tool(
|
|
348
|
+
"site_unlock",
|
|
349
|
+
"Gibt deine sanfte Sperre („in Bearbeitung“) frei – am Ende der Bearbeitung aufrufen. Ohne Sperre ein No-op.",
|
|
350
|
+
{ site: z.string().optional().describe(SITE_DESC) },
|
|
351
|
+
async ({ site }) => { try { return asText(await apiLock(cfg, { site, action: "unlock" })); } catch (e) { return asError(e); } }
|
|
352
|
+
);
|
|
353
|
+
|
|
336
354
|
// Den stdio-Server NUR starten, wenn diese Datei direkt ausgeführt wird (als MCP-Server / bin).
|
|
337
355
|
// Beim bloßen Importieren (Smoke-Test / Tests) NICHT verbinden – sonst würde der Import auf stdin blockieren.
|
|
338
356
|
// So lädt der Import die Datei komplett (inkl. aller server.tool-Registrierungen → fängt Syntax-/Beschreibungs-
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prontosite/mcp",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.1",
|
|
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": {
|