@sakupa/mcp 0.7.4 → 0.7.6

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.
Files changed (3) hide show
  1. package/dist/bin.js +15 -14
  2. package/dist/index.js +15 -14
  3. package/package.json +1 -1
package/dist/bin.js CHANGED
@@ -128,7 +128,7 @@ var FORBIDDEN_PATH_SEGMENTS = [
128
128
  var ALLOWED_HIDDEN_PATHS = [".well-known/"];
129
129
 
130
130
  // ../core/dist/domain/version.js
131
- var SAKUPA_MCP_VERSION = "0.7.4";
131
+ var SAKUPA_MCP_VERSION = "0.7.6";
132
132
 
133
133
  // ../core/dist/domain/errors.js
134
134
  var HTTP_STATUS = {
@@ -1299,7 +1299,8 @@ function toolError(e) {
1299
1299
  ([key, value]) => safeDetailKeys.has(key) && (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
1300
1300
  )
1301
1301
  ) : void 0;
1302
- const safeSummary = errorCode === "not_found" ? "\u6240\u9700\u7684\u672C\u5730\u9879\u76EE\u7ED1\u5B9A\u6216\u8D44\u6E90\u4E0D\u53EF\u7528\uFF1B\u5982\u679C\u672C\u5730\u6CA1\u6709 .sakupa/site.json\uFF0C\u8BF7\u5148\u8FD0\u884C deploy_site first\u3002" : errorCode === "unauthorized" ? "\u5F53\u524D\u64CD\u4F5C\u672A\u901A\u8FC7\u7AD9\u70B9\u6743\u9650\u6821\u9A8C\u3002" : errorCode === "invalid_request" || errorCode === "validation_failed" ? "\u8BF7\u6C42\u53C2\u6570\u6216\u672C\u5730\u9879\u76EE\u68C0\u67E5\u672A\u901A\u8FC7\u3002" : errorCode === "state_conflict" ? "\u8D44\u6E90\u72B6\u6001\u5DF2\u7ECF\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u67E5\u8BE2\u72B6\u6001\u540E\u518D\u51B3\u5B9A\u4E0B\u4E00\u6B65\u3002" : errorCode === "confirmation_required" ? "\u8D44\u6E90\u6216\u8D26\u5355\u72B6\u6001\u5DF2\u53D8\u5316\uFF0C\u65E7\u786E\u8BA4\u5DF2\u5931\u6548\uFF1B\u8BF7\u91CD\u65B0\u9884\u89C8\u540E\u518D\u786E\u8BA4\u3002" : errorCode === "payment_required" ? "\u8BE5\u64CD\u4F5C\u9700\u8981\u6709\u6548\u8BA2\u9605\uFF1B\u8BF7\u5148\u67E5\u8BE2\u8D26\u5355\u72B6\u6001\u3002" : errorCode === "rate_limited" ? "\u8BF7\u6C42\u9891\u7387\u5DF2\u8FBE\u5230\u670D\u52A1\u7AEF\u4E0A\u9650\uFF0C\u8BF7\u6309\u8FD4\u56DE\u7684\u7B49\u5F85\u65F6\u95F4\u540E\u91CD\u8BD5\u3002" : retryable ? "\u5916\u90E8\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\u6216\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002" : "\u64CD\u4F5C\u5931\u8D25\uFF1B\u672A\u8FD4\u56DE\u670D\u52A1\u7AEF\u5185\u90E8\u8BE6\u60C5\u3002";
1302
+ const minimumVersion = rawDetails && typeof rawDetails["minimumVersion"] === "string" ? rawDetails["minimumVersion"] : void 0;
1303
+ const safeSummary = errorCode === "upgrade_required" ? `This Sakupa MCP client is v${MCP_VERSION}, older than the server's minimum supported version${minimumVersion !== void 0 ? ` (v${minimumVersion})` : ""}, so the server refused the call. To fix it: ask the user to fully restart their MCP client session \u2014 "npx -y @sakupa/mcp@latest" setups fetch the current version on restart (run "npx clear-npx-cache" first if the old version persists); global installs need "npm install -g @sakupa/mcp@latest". After the restart, retry this exact tool call.` : errorCode === "not_found" ? "The required local project binding or resource is unavailable; if this project has no .sakupa/site.json yet, run deploy_site first." : errorCode === "unauthorized" ? "The server rejected the site credential: the one in .sakupa/site.json no longer matches the server-side verifier. The site itself is intact on the server \u2014 only the local binding file is the problem. Repair the file (restore a backup or undo the local edit). Do NOT delete the .sakupa directory to work around this: the credential is unrecoverable by design, so abandoning it permanently orphans the existing site." : errorCode === "invalid_request" || errorCode === "validation_failed" ? "The request arguments or local project checks did not pass." : errorCode === "state_conflict" ? "The resource state has changed; re-query the current status before deciding the next step." : errorCode === "confirmation_required" ? "The site or billing state changed, so the previous confirmation is stale; run the preview again and confirm against the fresh snapshot." : errorCode === "payment_required" ? "This operation requires an active subscription; check billing_status first." : errorCode === "rate_limited" ? "The server rate limit was reached; retry after the returned wait time." : retryable ? "An upstream service is temporarily unavailable or busy; retry shortly." : "The operation failed; no server-internal details are exposed.";
1303
1304
  const result = structuredToolResult({
1304
1305
  schemaVersion: 1,
1305
1306
  outcome: "failed",
@@ -1846,13 +1847,13 @@ Full status:`, res);
1846
1847
  schemaVersion: 1,
1847
1848
  outcome: "waiting_user",
1848
1849
  resultCode: "site_billing_portal_ready",
1849
- summary: `\u5DF2\u521B\u5EFA\u6B64\u7AD9\u70B9\u7684 Stripe \u5BA2\u6237\u95E8\u6237\u77ED\u65F6\u94FE\u63A5\uFF1A${res2.portalUrl}\u3002\u4EFB\u4F55\u53D8\u66F4\u4ECD\u987B\u5728 Stripe \u9875\u9762\u5B8C\u6210\u3002`,
1850
+ summary: `Short-lived Stripe customer portal link created for this site: ${res2.portalUrl}. Any change still happens only on the Stripe-hosted page.`,
1850
1851
  data: { scope: args.scope, portalUrl: res2.portalUrl },
1851
1852
  userAction: {
1852
1853
  type: "open_url",
1853
1854
  provider: "stripe",
1854
1855
  url: res2.portalUrl,
1855
- expectedOutcome: "\u7528\u6237\u5728 Stripe \u6258\u7BA1\u9875\u9762\u7BA1\u7406\u4ED8\u6B3E\u65B9\u5F0F\u3001\u53D1\u7968\u6216\u53D6\u6D88\u7EED\u8BA2"
1856
+ expectedOutcome: "The user manages payment methods, invoices, or cancels renewal on the Stripe-hosted page"
1856
1857
  },
1857
1858
  nextActions: [{ tool: "billing_status", allowed: true }]
1858
1859
  });
@@ -1862,7 +1863,7 @@ Full status:`, res);
1862
1863
  schemaVersion: 1,
1863
1864
  outcome: "waiting_user",
1864
1865
  resultCode: "public_billing_recovery_portal_ready",
1865
- summary: `Stripe \u516C\u5171\u90AE\u7BB1 OTP \u767B\u5F55\u9875\uFF1A${res.portalUrl}\u3002\u5B83\u4F7F\u7528 one-time passcode\uFF0Cdoes not recover the Sakupa key\uFF0C\u4E5F\u4E0D\u6388\u4E88\u7AD9\u70B9\u6743\u9650\uFF1B\u540C\u90AE\u7BB1\u5B58\u5728\u591A\u4E2A Customer \u65F6\uFF0CStripe \u53EF\u80FD\u53EA\u6253\u5F00 most recently created \u7684\u53EF\u7528\u8BB0\u5F55\u3002`,
1866
+ summary: `Stripe public email-OTP login page: ${res.portalUrl}. It uses a one-time passcode, does not recover the Sakupa key, and grants no site authority; when one email has several Customers, Stripe may open only the most recently created usable record.`,
1866
1867
  data: {
1867
1868
  scope: args.scope,
1868
1869
  portalUrl: res.portalUrl,
@@ -1873,7 +1874,7 @@ Full status:`, res);
1873
1874
  type: "open_url",
1874
1875
  provider: "stripe",
1875
1876
  url: res.portalUrl,
1876
- expectedOutcome: "\u7528\u6237\u7531 Stripe \u9A8C\u8BC1\u8D26\u5355\u90AE\u7BB1\u540E\u67E5\u770B\u5E76\u53D6\u6D88\u95E8\u6237\u4E2D\u663E\u793A\u7684\u8BA2\u9605"
1877
+ expectedOutcome: "The user verifies the billing email with Stripe, then reviews and cancels the subscription shown in the portal"
1877
1878
  },
1878
1879
  nextActions: []
1879
1880
  });
@@ -1937,7 +1938,7 @@ After the DNS record resolves, re-run recover_domain_site with verificationId: "
1937
1938
  schemaVersion: 1,
1938
1939
  outcome: res2.status === "expired" ? "expired" : res2.readyToComplete ? "completed" : "pending_provider",
1939
1940
  resultCode: res2.status === "expired" ? "domain_recovery_expired" : res2.readyToComplete ? "domain_recovery_ready" : "domain_recovery_pending_dns",
1940
- summary: `DNS \u6062\u590D\u9A8C\u8BC1\u72B6\u6001\uFF1A${res2.status}`,
1941
+ summary: `DNS recovery verification status: ${res2.status}`,
1941
1942
  data: { recovery: res2 },
1942
1943
  nextActions: [
1943
1944
  {
@@ -2100,7 +2101,7 @@ function registerBillingTools(server, ctx) {
2100
2101
  schemaVersion: 1,
2101
2102
  outcome: "completed",
2102
2103
  resultCode: "billing_catalog_returned",
2103
- summary: `\u5DF2\u8FD4\u56DE ${catalog.plans.length} \u4E2A\u6708\u4ED8\u65B9\u6848\uFF1BStripe \u6258\u7BA1\u9875\u9762\u662F\u4ED8\u8D39\u4E0E\u6539\u6863\u7684\u6700\u7EC8\u786E\u8BA4\u5165\u53E3\u3002`,
2104
+ summary: `Returned ${catalog.plans.length} monthly plans; the Stripe-hosted page is the final confirmation surface for payment and plan changes.`,
2104
2105
  data: { catalog },
2105
2106
  nextActions: [{ tool: "subscribe_site", allowed: true }]
2106
2107
  });
@@ -2133,13 +2134,13 @@ function registerBillingTools(server, ctx) {
2133
2134
  outcome: "waiting_user",
2134
2135
  resultCode: "stripe_plan_change_confirmation_required",
2135
2136
  operationId: args.operationId,
2136
- summary: `\u5DF2\u751F\u6210\u4ECE ${result.currentPlan} \u5230 ${result.targetPlan} \u7684 Stripe \u786E\u8BA4\u94FE\u63A5\uFF1B\u8BA2\u9605\u5C1A\u672A\u53D8\u66F4\u3002`,
2137
+ summary: `Stripe confirmation link created for ${result.currentPlan} -> ${result.targetPlan}; the subscription has NOT changed yet.`,
2137
2138
  data: { result },
2138
2139
  userAction: {
2139
2140
  type: "open_url",
2140
2141
  provider: "stripe",
2141
2142
  url: result.portalUrl,
2142
- expectedOutcome: "\u7528\u6237\u5728 Stripe \u6258\u7BA1\u9875\u9762\u786E\u8BA4\u540E\uFF0C\u7531 webhook \u66F4\u65B0 Sakupa \u8BA2\u9605\u72B6\u6001"
2143
+ expectedOutcome: "After the user confirms on the Stripe-hosted page, the webhook updates the Sakupa subscription state"
2143
2144
  },
2144
2145
  nextActions: [{ tool: "billing_status", allowed: true }]
2145
2146
  });
@@ -2204,7 +2205,7 @@ function registerLifecycleTools(server, ctx) {
2204
2205
  outcome: "waiting_user",
2205
2206
  resultCode: "delete_site_confirmation_required",
2206
2207
  operationId: args.operationId,
2207
- summary: "\u5DF2\u8FD4\u56DE\u4E0E\u5F53\u524D\u7AD9\u70B9\u53CA\u8D26\u5355\u72B6\u6001\u7ED1\u5B9A\u7684\u5220\u9664\u540E\u679C\uFF1B\u786E\u8BA4\u540E\u5185\u5BB9\u548C\u6C38\u4E45\u5730\u5740\u4E0D\u53EF\u6062\u590D\u3002",
2208
+ summary: "Deletion consequences returned, bound to the current site and billing state; after confirmation the content and the permanent URL are unrecoverable.",
2208
2209
  data: { preview },
2209
2210
  nextActions: [
2210
2211
  { tool: "delete_site", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2222,7 +2223,7 @@ function registerLifecycleTools(server, ctx) {
2222
2223
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2223
2224
  resultCode: "site_deleted",
2224
2225
  operationId: args.operationId,
2225
- summary: "\u7AD9\u70B9\u5DF2\u5220\u9664\uFF0C\u672C\u5730\u7BA1\u7406\u51ED\u8BC1\u6587\u4EF6\u5DF2\u79FB\u9664\u3002",
2226
+ summary: "Site deleted; the local management credential file was removed.",
2226
2227
  data: { result },
2227
2228
  nextActions: []
2228
2229
  });
@@ -2256,7 +2257,7 @@ function registerLifecycleTools(server, ctx) {
2256
2257
  outcome: "waiting_user",
2257
2258
  resultCode: "unbind_domain_confirmation_required",
2258
2259
  operationId: args.operationId,
2259
- summary: "\u5DF2\u8FD4\u56DE\u7CBE\u786E\u7ED1\u5B9A\u5FEB\u7167\uFF1B\u89E3\u7ED1\u53EA\u79FB\u9664\u81EA\u5B9A\u4E49\u57DF\u540D\uFF0C\u8BA2\u9605\u3001\u5185\u5BB9\u548C\u6C38\u4E45\u5730\u5740\u4FDD\u6301\u4E0D\u53D8\u3002",
2260
+ summary: "Exact binding snapshot returned; unbinding removes ONLY the custom domain \u2014 the subscription, content, and permanent URL stay unchanged.",
2260
2261
  data: { preview },
2261
2262
  nextActions: [
2262
2263
  { tool: "unbind_domain", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2275,7 +2276,7 @@ function registerLifecycleTools(server, ctx) {
2275
2276
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2276
2277
  resultCode: "domain_unbound",
2277
2278
  operationId: args.operationId,
2278
- summary: "\u81EA\u5B9A\u4E49\u57DF\u540D\u5DF2\u89E3\u7ED1\uFF1B\u8BA2\u9605\u3001\u5DF2\u90E8\u7F72\u5185\u5BB9\u548C\u6C38\u4E45 Sakupa \u5730\u5740\u672A\u53D8\u3002",
2279
+ summary: "Custom domain unbound; the subscription, deployed content, and permanent Sakupa URL are unchanged.",
2279
2280
  data: { result },
2280
2281
  nextActions: [{ tool: "site_status", allowed: true }]
2281
2282
  });
package/dist/index.js CHANGED
@@ -123,7 +123,7 @@ var FORBIDDEN_PATH_SEGMENTS = [
123
123
  var ALLOWED_HIDDEN_PATHS = [".well-known/"];
124
124
 
125
125
  // ../core/dist/domain/version.js
126
- var SAKUPA_MCP_VERSION = "0.7.4";
126
+ var SAKUPA_MCP_VERSION = "0.7.6";
127
127
 
128
128
  // ../core/dist/domain/errors.js
129
129
  var HTTP_STATUS = {
@@ -1357,7 +1357,8 @@ function toolError(e) {
1357
1357
  ([key, value]) => safeDetailKeys.has(key) && (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
1358
1358
  )
1359
1359
  ) : void 0;
1360
- const safeSummary = errorCode === "not_found" ? "\u6240\u9700\u7684\u672C\u5730\u9879\u76EE\u7ED1\u5B9A\u6216\u8D44\u6E90\u4E0D\u53EF\u7528\uFF1B\u5982\u679C\u672C\u5730\u6CA1\u6709 .sakupa/site.json\uFF0C\u8BF7\u5148\u8FD0\u884C deploy_site first\u3002" : errorCode === "unauthorized" ? "\u5F53\u524D\u64CD\u4F5C\u672A\u901A\u8FC7\u7AD9\u70B9\u6743\u9650\u6821\u9A8C\u3002" : errorCode === "invalid_request" || errorCode === "validation_failed" ? "\u8BF7\u6C42\u53C2\u6570\u6216\u672C\u5730\u9879\u76EE\u68C0\u67E5\u672A\u901A\u8FC7\u3002" : errorCode === "state_conflict" ? "\u8D44\u6E90\u72B6\u6001\u5DF2\u7ECF\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u67E5\u8BE2\u72B6\u6001\u540E\u518D\u51B3\u5B9A\u4E0B\u4E00\u6B65\u3002" : errorCode === "confirmation_required" ? "\u8D44\u6E90\u6216\u8D26\u5355\u72B6\u6001\u5DF2\u53D8\u5316\uFF0C\u65E7\u786E\u8BA4\u5DF2\u5931\u6548\uFF1B\u8BF7\u91CD\u65B0\u9884\u89C8\u540E\u518D\u786E\u8BA4\u3002" : errorCode === "payment_required" ? "\u8BE5\u64CD\u4F5C\u9700\u8981\u6709\u6548\u8BA2\u9605\uFF1B\u8BF7\u5148\u67E5\u8BE2\u8D26\u5355\u72B6\u6001\u3002" : errorCode === "rate_limited" ? "\u8BF7\u6C42\u9891\u7387\u5DF2\u8FBE\u5230\u670D\u52A1\u7AEF\u4E0A\u9650\uFF0C\u8BF7\u6309\u8FD4\u56DE\u7684\u7B49\u5F85\u65F6\u95F4\u540E\u91CD\u8BD5\u3002" : retryable ? "\u5916\u90E8\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\u6216\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002" : "\u64CD\u4F5C\u5931\u8D25\uFF1B\u672A\u8FD4\u56DE\u670D\u52A1\u7AEF\u5185\u90E8\u8BE6\u60C5\u3002";
1360
+ const minimumVersion = rawDetails && typeof rawDetails["minimumVersion"] === "string" ? rawDetails["minimumVersion"] : void 0;
1361
+ const safeSummary = errorCode === "upgrade_required" ? `This Sakupa MCP client is v${MCP_VERSION}, older than the server's minimum supported version${minimumVersion !== void 0 ? ` (v${minimumVersion})` : ""}, so the server refused the call. To fix it: ask the user to fully restart their MCP client session \u2014 "npx -y @sakupa/mcp@latest" setups fetch the current version on restart (run "npx clear-npx-cache" first if the old version persists); global installs need "npm install -g @sakupa/mcp@latest". After the restart, retry this exact tool call.` : errorCode === "not_found" ? "The required local project binding or resource is unavailable; if this project has no .sakupa/site.json yet, run deploy_site first." : errorCode === "unauthorized" ? "The server rejected the site credential: the one in .sakupa/site.json no longer matches the server-side verifier. The site itself is intact on the server \u2014 only the local binding file is the problem. Repair the file (restore a backup or undo the local edit). Do NOT delete the .sakupa directory to work around this: the credential is unrecoverable by design, so abandoning it permanently orphans the existing site." : errorCode === "invalid_request" || errorCode === "validation_failed" ? "The request arguments or local project checks did not pass." : errorCode === "state_conflict" ? "The resource state has changed; re-query the current status before deciding the next step." : errorCode === "confirmation_required" ? "The site or billing state changed, so the previous confirmation is stale; run the preview again and confirm against the fresh snapshot." : errorCode === "payment_required" ? "This operation requires an active subscription; check billing_status first." : errorCode === "rate_limited" ? "The server rate limit was reached; retry after the returned wait time." : retryable ? "An upstream service is temporarily unavailable or busy; retry shortly." : "The operation failed; no server-internal details are exposed.";
1361
1362
  const result = structuredToolResult({
1362
1363
  schemaVersion: 1,
1363
1364
  outcome: "failed",
@@ -1908,13 +1909,13 @@ Full status:`, res);
1908
1909
  schemaVersion: 1,
1909
1910
  outcome: "waiting_user",
1910
1911
  resultCode: "site_billing_portal_ready",
1911
- summary: `\u5DF2\u521B\u5EFA\u6B64\u7AD9\u70B9\u7684 Stripe \u5BA2\u6237\u95E8\u6237\u77ED\u65F6\u94FE\u63A5\uFF1A${res2.portalUrl}\u3002\u4EFB\u4F55\u53D8\u66F4\u4ECD\u987B\u5728 Stripe \u9875\u9762\u5B8C\u6210\u3002`,
1912
+ summary: `Short-lived Stripe customer portal link created for this site: ${res2.portalUrl}. Any change still happens only on the Stripe-hosted page.`,
1912
1913
  data: { scope: args.scope, portalUrl: res2.portalUrl },
1913
1914
  userAction: {
1914
1915
  type: "open_url",
1915
1916
  provider: "stripe",
1916
1917
  url: res2.portalUrl,
1917
- expectedOutcome: "\u7528\u6237\u5728 Stripe \u6258\u7BA1\u9875\u9762\u7BA1\u7406\u4ED8\u6B3E\u65B9\u5F0F\u3001\u53D1\u7968\u6216\u53D6\u6D88\u7EED\u8BA2"
1918
+ expectedOutcome: "The user manages payment methods, invoices, or cancels renewal on the Stripe-hosted page"
1918
1919
  },
1919
1920
  nextActions: [{ tool: "billing_status", allowed: true }]
1920
1921
  });
@@ -1924,7 +1925,7 @@ Full status:`, res);
1924
1925
  schemaVersion: 1,
1925
1926
  outcome: "waiting_user",
1926
1927
  resultCode: "public_billing_recovery_portal_ready",
1927
- summary: `Stripe \u516C\u5171\u90AE\u7BB1 OTP \u767B\u5F55\u9875\uFF1A${res.portalUrl}\u3002\u5B83\u4F7F\u7528 one-time passcode\uFF0Cdoes not recover the Sakupa key\uFF0C\u4E5F\u4E0D\u6388\u4E88\u7AD9\u70B9\u6743\u9650\uFF1B\u540C\u90AE\u7BB1\u5B58\u5728\u591A\u4E2A Customer \u65F6\uFF0CStripe \u53EF\u80FD\u53EA\u6253\u5F00 most recently created \u7684\u53EF\u7528\u8BB0\u5F55\u3002`,
1928
+ summary: `Stripe public email-OTP login page: ${res.portalUrl}. It uses a one-time passcode, does not recover the Sakupa key, and grants no site authority; when one email has several Customers, Stripe may open only the most recently created usable record.`,
1928
1929
  data: {
1929
1930
  scope: args.scope,
1930
1931
  portalUrl: res.portalUrl,
@@ -1935,7 +1936,7 @@ Full status:`, res);
1935
1936
  type: "open_url",
1936
1937
  provider: "stripe",
1937
1938
  url: res.portalUrl,
1938
- expectedOutcome: "\u7528\u6237\u7531 Stripe \u9A8C\u8BC1\u8D26\u5355\u90AE\u7BB1\u540E\u67E5\u770B\u5E76\u53D6\u6D88\u95E8\u6237\u4E2D\u663E\u793A\u7684\u8BA2\u9605"
1939
+ expectedOutcome: "The user verifies the billing email with Stripe, then reviews and cancels the subscription shown in the portal"
1939
1940
  },
1940
1941
  nextActions: []
1941
1942
  });
@@ -1999,7 +2000,7 @@ After the DNS record resolves, re-run recover_domain_site with verificationId: "
1999
2000
  schemaVersion: 1,
2000
2001
  outcome: res2.status === "expired" ? "expired" : res2.readyToComplete ? "completed" : "pending_provider",
2001
2002
  resultCode: res2.status === "expired" ? "domain_recovery_expired" : res2.readyToComplete ? "domain_recovery_ready" : "domain_recovery_pending_dns",
2002
- summary: `DNS \u6062\u590D\u9A8C\u8BC1\u72B6\u6001\uFF1A${res2.status}`,
2003
+ summary: `DNS recovery verification status: ${res2.status}`,
2003
2004
  data: { recovery: res2 },
2004
2005
  nextActions: [
2005
2006
  {
@@ -2197,7 +2198,7 @@ function registerLifecycleTools(server, ctx) {
2197
2198
  outcome: "waiting_user",
2198
2199
  resultCode: "delete_site_confirmation_required",
2199
2200
  operationId: args.operationId,
2200
- summary: "\u5DF2\u8FD4\u56DE\u4E0E\u5F53\u524D\u7AD9\u70B9\u53CA\u8D26\u5355\u72B6\u6001\u7ED1\u5B9A\u7684\u5220\u9664\u540E\u679C\uFF1B\u786E\u8BA4\u540E\u5185\u5BB9\u548C\u6C38\u4E45\u5730\u5740\u4E0D\u53EF\u6062\u590D\u3002",
2201
+ summary: "Deletion consequences returned, bound to the current site and billing state; after confirmation the content and the permanent URL are unrecoverable.",
2201
2202
  data: { preview },
2202
2203
  nextActions: [
2203
2204
  { tool: "delete_site", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2215,7 +2216,7 @@ function registerLifecycleTools(server, ctx) {
2215
2216
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2216
2217
  resultCode: "site_deleted",
2217
2218
  operationId: args.operationId,
2218
- summary: "\u7AD9\u70B9\u5DF2\u5220\u9664\uFF0C\u672C\u5730\u7BA1\u7406\u51ED\u8BC1\u6587\u4EF6\u5DF2\u79FB\u9664\u3002",
2219
+ summary: "Site deleted; the local management credential file was removed.",
2219
2220
  data: { result },
2220
2221
  nextActions: []
2221
2222
  });
@@ -2249,7 +2250,7 @@ function registerLifecycleTools(server, ctx) {
2249
2250
  outcome: "waiting_user",
2250
2251
  resultCode: "unbind_domain_confirmation_required",
2251
2252
  operationId: args.operationId,
2252
- summary: "\u5DF2\u8FD4\u56DE\u7CBE\u786E\u7ED1\u5B9A\u5FEB\u7167\uFF1B\u89E3\u7ED1\u53EA\u79FB\u9664\u81EA\u5B9A\u4E49\u57DF\u540D\uFF0C\u8BA2\u9605\u3001\u5185\u5BB9\u548C\u6C38\u4E45\u5730\u5740\u4FDD\u6301\u4E0D\u53D8\u3002",
2253
+ summary: "Exact binding snapshot returned; unbinding removes ONLY the custom domain \u2014 the subscription, content, and permanent URL stay unchanged.",
2253
2254
  data: { preview },
2254
2255
  nextActions: [
2255
2256
  { tool: "unbind_domain", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2268,7 +2269,7 @@ function registerLifecycleTools(server, ctx) {
2268
2269
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2269
2270
  resultCode: "domain_unbound",
2270
2271
  operationId: args.operationId,
2271
- summary: "\u81EA\u5B9A\u4E49\u57DF\u540D\u5DF2\u89E3\u7ED1\uFF1B\u8BA2\u9605\u3001\u5DF2\u90E8\u7F72\u5185\u5BB9\u548C\u6C38\u4E45 Sakupa \u5730\u5740\u672A\u53D8\u3002",
2272
+ summary: "Custom domain unbound; the subscription, deployed content, and permanent Sakupa URL are unchanged.",
2272
2273
  data: { result },
2273
2274
  nextActions: [{ tool: "site_status", allowed: true }]
2274
2275
  });
@@ -2301,7 +2302,7 @@ function registerBillingTools(server, ctx) {
2301
2302
  schemaVersion: 1,
2302
2303
  outcome: "completed",
2303
2304
  resultCode: "billing_catalog_returned",
2304
- summary: `\u5DF2\u8FD4\u56DE ${catalog.plans.length} \u4E2A\u6708\u4ED8\u65B9\u6848\uFF1BStripe \u6258\u7BA1\u9875\u9762\u662F\u4ED8\u8D39\u4E0E\u6539\u6863\u7684\u6700\u7EC8\u786E\u8BA4\u5165\u53E3\u3002`,
2305
+ summary: `Returned ${catalog.plans.length} monthly plans; the Stripe-hosted page is the final confirmation surface for payment and plan changes.`,
2305
2306
  data: { catalog },
2306
2307
  nextActions: [{ tool: "subscribe_site", allowed: true }]
2307
2308
  });
@@ -2334,13 +2335,13 @@ function registerBillingTools(server, ctx) {
2334
2335
  outcome: "waiting_user",
2335
2336
  resultCode: "stripe_plan_change_confirmation_required",
2336
2337
  operationId: args.operationId,
2337
- summary: `\u5DF2\u751F\u6210\u4ECE ${result.currentPlan} \u5230 ${result.targetPlan} \u7684 Stripe \u786E\u8BA4\u94FE\u63A5\uFF1B\u8BA2\u9605\u5C1A\u672A\u53D8\u66F4\u3002`,
2338
+ summary: `Stripe confirmation link created for ${result.currentPlan} -> ${result.targetPlan}; the subscription has NOT changed yet.`,
2338
2339
  data: { result },
2339
2340
  userAction: {
2340
2341
  type: "open_url",
2341
2342
  provider: "stripe",
2342
2343
  url: result.portalUrl,
2343
- expectedOutcome: "\u7528\u6237\u5728 Stripe \u6258\u7BA1\u9875\u9762\u786E\u8BA4\u540E\uFF0C\u7531 webhook \u66F4\u65B0 Sakupa \u8BA2\u9605\u72B6\u6001"
2344
+ expectedOutcome: "After the user confirms on the Stripe-hosted page, the webhook updates the Sakupa subscription state"
2344
2345
  },
2345
2346
  nextActions: [{ tool: "billing_status", allowed: true }]
2346
2347
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sakupa/mcp",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "description": "Sakupa MCP server: publish AI-made static sites from your AI tool. AI-made pages, live in seconds.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",