@prontosite/mcp 0.13.6 → 0.13.7
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 +11 -0
- package/api.mjs +12 -0
- package/index.mjs +1 -1
- package/package.json +1 -1
- package/tools.mjs +26 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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.13.7 – 2026-10-20
|
|
7
|
+
|
|
8
|
+
- Neu: `site_forms_get` – Konto-Empfänger, je Formular Art (verwaltetes ProntoSite-Formular oder eigenes `<form>` aus dem
|
|
9
|
+
Import), Seiten, Felder, eigene Empfänger, Danke-Seite; Spam-Modus (wirksam, Kunde, Admin-Übersteuerung).
|
|
10
|
+
- Neu: `site_forms_set {recipients?, form?, spamMode?, thanksPage?}` – Empfänger (Konto oder je Formular, streng geprüft, kein
|
|
11
|
+
CRLF), Spam-Modus `streng|normal|basis`, Danke-Seite nur als interne Seite. Verlauf mit Akteur + Client (alt → neu).
|
|
12
|
+
- `site_status.forms`: Anzahl, Konto-Empfänger, Formulare mit eigenen Empfängern, wirksamer Spam-Modus.
|
|
13
|
+
- Instructions: „Formular-Empfänger, Spam-Stufe, Danke-Seite über site_forms_set, nie per HTML."
|
|
14
|
+
- Neue Empfänger-Adressen über KI-Clients werden erst nach Bestätigung durch die Adresse aktiv (`ausstehend`, 24 h); bisherige
|
|
15
|
+
Adressen bekommen einen Hinweis mit Zurücksetzen-Link.
|
|
16
|
+
|
|
6
17
|
## 0.13.6 – 2026-10-20
|
|
7
18
|
|
|
8
19
|
- Websites beim Namen nennen: `site` darf jetzt auch Firmenname, Domain oder Site-Titel sein (unscharf: Groß/Klein, Umlaute,
|
package/api.mjs
CHANGED
|
@@ -520,6 +520,18 @@ export async function apiImageSet(cfg, { site, page, nodeId = null, marker = nul
|
|
|
520
520
|
method: "POST", headers: { ...authHeaders(token, cfg), "content-type": "application/json" },
|
|
521
521
|
body: JSON.stringify({ page, mediaId, ...(nodeId ? { nodeId } : {}), ...(marker ? { marker } : {}), ...(alt != null ? { alt } : {}), ...(Number.isInteger(baseRev) ? { baseRev } : {}) }) }));
|
|
522
522
|
}
|
|
523
|
+
/** GET /api/forms/<site> – Formulare: Konto-Empfänger, Empfänger je Formular, Spam-Modus, Danke-Seiten, erkannte Formulare. */
|
|
524
|
+
export async function apiFormsGet(cfg, { site } = {}, fetchImpl = fetch) {
|
|
525
|
+
const { token, slug } = resolveTarget(cfg, site);
|
|
526
|
+
return asJson(await fetchImpl(`${baseUrl(cfg)}/forms/${encodeURIComponent(slug)}`, { headers: authHeaders(token, cfg) }));
|
|
527
|
+
}
|
|
528
|
+
/** POST /api/forms/<site> – Empfänger (Konto oder je Formular), Spam-Modus, Danke-Seite setzen. */
|
|
529
|
+
export async function apiFormsSet(cfg, { site, form = null, recipients, spamMode, thanksPage } = {}, fetchImpl = fetch) {
|
|
530
|
+
const { token, slug } = resolveTarget(cfg, site);
|
|
531
|
+
const body = { ...(form ? { form } : {}), ...(recipients !== undefined ? { recipients } : {}), ...(spamMode !== undefined ? { spamMode } : {}), ...(thanksPage !== undefined ? { thanksPage } : {}) };
|
|
532
|
+
return asJson(await fetchImpl(`${baseUrl(cfg)}/forms/${encodeURIComponent(slug)}`, {
|
|
533
|
+
method: "POST", headers: { ...authHeaders(token, cfg), "content-type": "application/json" }, body: JSON.stringify(body) }));
|
|
534
|
+
}
|
|
523
535
|
/** POST /api/undo|redo/<site> – letzte Änderung(en) des Entwurfs zurücknehmen bzw. wiederherstellen (derselbe Stack wie das Dashboard). */
|
|
524
536
|
export async function apiUndo(cfg, { site, steps = 1, baseRev = null, redo = false } = {}, fetchImpl = fetch) {
|
|
525
537
|
const { token, slug } = resolveTarget(cfg, site);
|
package/index.mjs
CHANGED
|
@@ -21,7 +21,7 @@ const cfg = loadConfig();
|
|
|
21
21
|
// es im MCP-Log/Terminal auffällt; die endgültige Auflösung (Betreuer-Token-Vorrang vs. Map) klärt sites_list.
|
|
22
22
|
for (const w of (cfg.warnings || [])) process.stderr.write("[prontosite-mcp] ⚠ " + w + "\n");
|
|
23
23
|
// instructions: Arbeitsweise (Weg B = Standard) – gleicher Text wie am Remote-Endpunkt.
|
|
24
|
-
const server = new McpServer({ name: "prontosite", version: "0.13.
|
|
24
|
+
const server = new McpServer({ name: "prontosite", version: "0.13.7" }, { instructions: instructionsFor("local") });
|
|
25
25
|
// Tool-Definitionen: gemeinsame Quelle mit dem Remote-Endpunkt (tools.mjs, Konzept KI-Anbindung §4.2).
|
|
26
26
|
registerTools(server, { z, cfg, mode: "local" });
|
|
27
27
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prontosite/mcp",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.7",
|
|
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, apiPageTexts, apiPageTextsSet, apiPageCopy, apiMediaUploadBegin, apiMediaUploadFile, apiMediaCommit, apiMediaList, apiImageSet, apiUndo, apiMediaDelete, apiMediaRestore, apiPreviewScreenshot, apiStatus, apiExport, apiExportFetch, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename, apiLock } from "./api.mjs";
|
|
12
|
+
import { apiEditText, apiPageTexts, apiPageTextsSet, apiPageCopy, apiMediaUploadBegin, apiMediaUploadFile, apiMediaCommit, apiMediaList, apiImageSet, apiUndo, apiMediaDelete, apiMediaRestore, apiFormsGet, apiFormsSet, apiPreviewScreenshot, apiStatus, apiExport, apiExportFetch, apiDeploy, apiPublish, sitesList, apiAccountCreate, apiCompanyGet, apiCompanySet, apiLegalOptions, apiDomainStatus, apiDomainConnect, apiEmbeds, apiEmbedConsent, apiWidgets, apiWidgetSet, apiFiles, apiFileGet, apiFilePut, apiFileDelete, apiFileRename, apiLock } 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.).
|
|
@@ -44,6 +44,7 @@ const instructionLines = mode => [
|
|
|
44
44
|
+ "site_preview_screenshot (1280 bzw. 390) prüfen, BEVOR du dem Nutzer antwortest.",
|
|
45
45
|
"5c. Bei „rückgängig“ site_undo (bzw. „doch wieder“ site_redo), nie Dateien manuell zurückbauen. Medien löschen nur mit site_media_delete "
|
|
46
46
|
+ "(Papierkorb, 30 Tage; zurückholen mit site_media_restore).",
|
|
47
|
+
"5d. Formular-Empfänger, Spam-Stufe und Danke-Seite über site_forms_set, nie per HTML (site_forms_get zeigt den Stand).",
|
|
47
48
|
"5. Jede Änderung lässt sich rückgängig machen; Rechtstexte (Impressum/Datenschutz) nicht umformulieren – sie kommen aus den Firmendaten.",
|
|
48
49
|
];
|
|
49
50
|
/** Server-Instructions je Modus ("local" = stdio-Paket mit Dateizugriff, "remote" = /mcp). */
|
|
@@ -53,7 +54,7 @@ export const SERVER_INSTRUCTIONS = instructionsFor("remote");
|
|
|
53
54
|
// Tool-Annotationen (MCP ToolAnnotations): ChatGPT & Co. fragen sonst bei JEDEM Aufruf nach. readOnly = ändert nichts;
|
|
54
55
|
// destructive = live/kundenwirksam, ersetzt Bestand oder nimmt zurück (Bestätigung sinnvoll). Entwurfs-Änderungen sind
|
|
55
56
|
// rückgängig machbar und daher nicht destruktiv. openWorld = wirkt nach außen (öffentliche Website/DNS).
|
|
56
|
-
const READ_ONLY = new Set(["sites_list", "site_status", "site_page_texts", "site_media_list", "site_preview_screenshot", "site_company_get",
|
|
57
|
+
const READ_ONLY = new Set(["sites_list", "site_status", "site_forms_get", "site_page_texts", "site_media_list", "site_preview_screenshot", "site_company_get",
|
|
57
58
|
"site_domain_status", "site_embeds", "site_widgets", "site_files", "site_file_get"]);
|
|
58
59
|
const DESTRUCTIVE = new Set(["site_publish", "site_deploy", "deploy_commit", "site_file_delete", "site_media_delete", "site_undo", "site_redo", "site_domain_connect"]);
|
|
59
60
|
const OPEN_WORLD = new Set(["site_publish", "site_deploy", "deploy_commit", "site_domain_connect"]);
|
|
@@ -247,6 +248,29 @@ export function registerTools(server0, { z, cfg, mode = "local", remote = null }
|
|
|
247
248
|
baseRev: z.number().int().optional().describe("Optional: draftRev (Konfliktschutz).") },
|
|
248
249
|
async (a) => { try { return asText(await apiImageSet(cfg, a)); } catch (e) { return asError(e); } }
|
|
249
250
|
);
|
|
251
|
+
server.tool(
|
|
252
|
+
"site_forms_get",
|
|
253
|
+
"LESEND: Formulare der Website – Konto-Empfänger (defaultRecipients), je Formular: Art (verwaltetes ProntoSite-Formular/Marker "
|
|
254
|
+
+ "oder eigenes <form> aus dem Import), Seiten, Felder, eigene Empfänger (null = Konto-Empfänger), Danke-Seite; Spam-Modus "
|
|
255
|
+
+ "(wirksam, Kunde, Admin-Übersteuerung) und die möglichen Danke-Seiten.",
|
|
256
|
+
{ site: z.string().optional().describe(SITE_DESC) },
|
|
257
|
+
async ({ site }) => { try { return asText(await apiFormsGet(cfg, { site })); } catch (e) { return asError(e); } }
|
|
258
|
+
);
|
|
259
|
+
server.tool(
|
|
260
|
+
"site_forms_set",
|
|
261
|
+
"SCHREIBEND: Formular-Einstellungen ändern – NIE per HTML. recipients: Empfänger-Adressen (ohne form = Konto-Empfänger für alle "
|
|
262
|
+
+ "Formulare ohne eigene; mit form = nur dieses Formular, [] = zurück auf Konto-Empfänger); spamMode: streng | normal | basis; "
|
|
263
|
+
+ "thanksPage: interne Seite für die Weiterleitung nach dem Absenden ('' = Meldung am Formular), nur mit form (außer es gibt genau "
|
|
264
|
+
+ "eins). NEUE Empfänger-Adressen werden erst aktiv, wenn sie den Bestätigungslink in der Mail an sie anklicken (24 h) – bis dahin "
|
|
265
|
+
+ "bleiben die bisherigen aktiv (Antwort: ausstehend). Die bisherigen Adressen bekommen einen Hinweis mit Zurücksetzen-Link. Vorher "
|
|
266
|
+
+ "beim Nutzer bestätigen, wohin Anfragen künftig gehen.",
|
|
267
|
+
{ site: z.string().optional().describe(SITE_DESC),
|
|
268
|
+
form: z.string().optional().describe("Formular-ID aus site_forms_get (für Empfänger/Danke-Seite je Formular)."),
|
|
269
|
+
recipients: z.array(z.string()).optional().describe("E-Mail-Adressen (max. 10)."),
|
|
270
|
+
spamMode: z.enum(["streng", "normal", "basis"]).optional(),
|
|
271
|
+
thanksPage: z.string().optional().describe("Interner Pfad einer Seite dieser Website, z. B. /danke/ (keine externen URLs).") },
|
|
272
|
+
async (a) => { try { return asText(await apiFormsSet(cfg, a)); } catch (e) { return asError(e); } }
|
|
273
|
+
);
|
|
250
274
|
server.tool(
|
|
251
275
|
"site_undo",
|
|
252
276
|
"SCHREIBEND (Entwurf): macht die letzte(n) Änderung(en) rückgängig – derselbe Verlauf wie der Rückgängig-Knopf im Dashboard (auch "
|