@sakupa/mcp 0.7.4 → 0.7.5

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 +14 -14
  2. package/dist/index.js +14 -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.5";
132
132
 
133
133
  // ../core/dist/domain/errors.js
134
134
  var HTTP_STATUS = {
@@ -1299,7 +1299,7 @@ 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 safeSummary = 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
1303
  const result = structuredToolResult({
1304
1304
  schemaVersion: 1,
1305
1305
  outcome: "failed",
@@ -1846,13 +1846,13 @@ Full status:`, res);
1846
1846
  schemaVersion: 1,
1847
1847
  outcome: "waiting_user",
1848
1848
  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`,
1849
+ summary: `Short-lived Stripe customer portal link created for this site: ${res2.portalUrl}. Any change still happens only on the Stripe-hosted page.`,
1850
1850
  data: { scope: args.scope, portalUrl: res2.portalUrl },
1851
1851
  userAction: {
1852
1852
  type: "open_url",
1853
1853
  provider: "stripe",
1854
1854
  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"
1855
+ expectedOutcome: "The user manages payment methods, invoices, or cancels renewal on the Stripe-hosted page"
1856
1856
  },
1857
1857
  nextActions: [{ tool: "billing_status", allowed: true }]
1858
1858
  });
@@ -1862,7 +1862,7 @@ Full status:`, res);
1862
1862
  schemaVersion: 1,
1863
1863
  outcome: "waiting_user",
1864
1864
  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`,
1865
+ 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
1866
  data: {
1867
1867
  scope: args.scope,
1868
1868
  portalUrl: res.portalUrl,
@@ -1873,7 +1873,7 @@ Full status:`, res);
1873
1873
  type: "open_url",
1874
1874
  provider: "stripe",
1875
1875
  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"
1876
+ expectedOutcome: "The user verifies the billing email with Stripe, then reviews and cancels the subscription shown in the portal"
1877
1877
  },
1878
1878
  nextActions: []
1879
1879
  });
@@ -1937,7 +1937,7 @@ After the DNS record resolves, re-run recover_domain_site with verificationId: "
1937
1937
  schemaVersion: 1,
1938
1938
  outcome: res2.status === "expired" ? "expired" : res2.readyToComplete ? "completed" : "pending_provider",
1939
1939
  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}`,
1940
+ summary: `DNS recovery verification status: ${res2.status}`,
1941
1941
  data: { recovery: res2 },
1942
1942
  nextActions: [
1943
1943
  {
@@ -2100,7 +2100,7 @@ function registerBillingTools(server, ctx) {
2100
2100
  schemaVersion: 1,
2101
2101
  outcome: "completed",
2102
2102
  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`,
2103
+ summary: `Returned ${catalog.plans.length} monthly plans; the Stripe-hosted page is the final confirmation surface for payment and plan changes.`,
2104
2104
  data: { catalog },
2105
2105
  nextActions: [{ tool: "subscribe_site", allowed: true }]
2106
2106
  });
@@ -2133,13 +2133,13 @@ function registerBillingTools(server, ctx) {
2133
2133
  outcome: "waiting_user",
2134
2134
  resultCode: "stripe_plan_change_confirmation_required",
2135
2135
  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`,
2136
+ summary: `Stripe confirmation link created for ${result.currentPlan} -> ${result.targetPlan}; the subscription has NOT changed yet.`,
2137
2137
  data: { result },
2138
2138
  userAction: {
2139
2139
  type: "open_url",
2140
2140
  provider: "stripe",
2141
2141
  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"
2142
+ expectedOutcome: "After the user confirms on the Stripe-hosted page, the webhook updates the Sakupa subscription state"
2143
2143
  },
2144
2144
  nextActions: [{ tool: "billing_status", allowed: true }]
2145
2145
  });
@@ -2204,7 +2204,7 @@ function registerLifecycleTools(server, ctx) {
2204
2204
  outcome: "waiting_user",
2205
2205
  resultCode: "delete_site_confirmation_required",
2206
2206
  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",
2207
+ summary: "Deletion consequences returned, bound to the current site and billing state; after confirmation the content and the permanent URL are unrecoverable.",
2208
2208
  data: { preview },
2209
2209
  nextActions: [
2210
2210
  { tool: "delete_site", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2222,7 +2222,7 @@ function registerLifecycleTools(server, ctx) {
2222
2222
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2223
2223
  resultCode: "site_deleted",
2224
2224
  operationId: args.operationId,
2225
- summary: "\u7AD9\u70B9\u5DF2\u5220\u9664\uFF0C\u672C\u5730\u7BA1\u7406\u51ED\u8BC1\u6587\u4EF6\u5DF2\u79FB\u9664\u3002",
2225
+ summary: "Site deleted; the local management credential file was removed.",
2226
2226
  data: { result },
2227
2227
  nextActions: []
2228
2228
  });
@@ -2256,7 +2256,7 @@ function registerLifecycleTools(server, ctx) {
2256
2256
  outcome: "waiting_user",
2257
2257
  resultCode: "unbind_domain_confirmation_required",
2258
2258
  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",
2259
+ summary: "Exact binding snapshot returned; unbinding removes ONLY the custom domain \u2014 the subscription, content, and permanent URL stay unchanged.",
2260
2260
  data: { preview },
2261
2261
  nextActions: [
2262
2262
  { tool: "unbind_domain", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2275,7 +2275,7 @@ function registerLifecycleTools(server, ctx) {
2275
2275
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2276
2276
  resultCode: "domain_unbound",
2277
2277
  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",
2278
+ summary: "Custom domain unbound; the subscription, deployed content, and permanent Sakupa URL are unchanged.",
2279
2279
  data: { result },
2280
2280
  nextActions: [{ tool: "site_status", allowed: true }]
2281
2281
  });
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.5";
127
127
 
128
128
  // ../core/dist/domain/errors.js
129
129
  var HTTP_STATUS = {
@@ -1357,7 +1357,7 @@ 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 safeSummary = 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
1361
  const result = structuredToolResult({
1362
1362
  schemaVersion: 1,
1363
1363
  outcome: "failed",
@@ -1908,13 +1908,13 @@ Full status:`, res);
1908
1908
  schemaVersion: 1,
1909
1909
  outcome: "waiting_user",
1910
1910
  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`,
1911
+ summary: `Short-lived Stripe customer portal link created for this site: ${res2.portalUrl}. Any change still happens only on the Stripe-hosted page.`,
1912
1912
  data: { scope: args.scope, portalUrl: res2.portalUrl },
1913
1913
  userAction: {
1914
1914
  type: "open_url",
1915
1915
  provider: "stripe",
1916
1916
  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"
1917
+ expectedOutcome: "The user manages payment methods, invoices, or cancels renewal on the Stripe-hosted page"
1918
1918
  },
1919
1919
  nextActions: [{ tool: "billing_status", allowed: true }]
1920
1920
  });
@@ -1924,7 +1924,7 @@ Full status:`, res);
1924
1924
  schemaVersion: 1,
1925
1925
  outcome: "waiting_user",
1926
1926
  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`,
1927
+ 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
1928
  data: {
1929
1929
  scope: args.scope,
1930
1930
  portalUrl: res.portalUrl,
@@ -1935,7 +1935,7 @@ Full status:`, res);
1935
1935
  type: "open_url",
1936
1936
  provider: "stripe",
1937
1937
  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"
1938
+ expectedOutcome: "The user verifies the billing email with Stripe, then reviews and cancels the subscription shown in the portal"
1939
1939
  },
1940
1940
  nextActions: []
1941
1941
  });
@@ -1999,7 +1999,7 @@ After the DNS record resolves, re-run recover_domain_site with verificationId: "
1999
1999
  schemaVersion: 1,
2000
2000
  outcome: res2.status === "expired" ? "expired" : res2.readyToComplete ? "completed" : "pending_provider",
2001
2001
  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}`,
2002
+ summary: `DNS recovery verification status: ${res2.status}`,
2003
2003
  data: { recovery: res2 },
2004
2004
  nextActions: [
2005
2005
  {
@@ -2197,7 +2197,7 @@ function registerLifecycleTools(server, ctx) {
2197
2197
  outcome: "waiting_user",
2198
2198
  resultCode: "delete_site_confirmation_required",
2199
2199
  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",
2200
+ summary: "Deletion consequences returned, bound to the current site and billing state; after confirmation the content and the permanent URL are unrecoverable.",
2201
2201
  data: { preview },
2202
2202
  nextActions: [
2203
2203
  { tool: "delete_site", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2215,7 +2215,7 @@ function registerLifecycleTools(server, ctx) {
2215
2215
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2216
2216
  resultCode: "site_deleted",
2217
2217
  operationId: args.operationId,
2218
- summary: "\u7AD9\u70B9\u5DF2\u5220\u9664\uFF0C\u672C\u5730\u7BA1\u7406\u51ED\u8BC1\u6587\u4EF6\u5DF2\u79FB\u9664\u3002",
2218
+ summary: "Site deleted; the local management credential file was removed.",
2219
2219
  data: { result },
2220
2220
  nextActions: []
2221
2221
  });
@@ -2249,7 +2249,7 @@ function registerLifecycleTools(server, ctx) {
2249
2249
  outcome: "waiting_user",
2250
2250
  resultCode: "unbind_domain_confirmation_required",
2251
2251
  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",
2252
+ summary: "Exact binding snapshot returned; unbinding removes ONLY the custom domain \u2014 the subscription, content, and permanent URL stay unchanged.",
2253
2253
  data: { preview },
2254
2254
  nextActions: [
2255
2255
  { tool: "unbind_domain", allowed: true, reasonCode: "exact_confirmation_required" }
@@ -2268,7 +2268,7 @@ function registerLifecycleTools(server, ctx) {
2268
2268
  outcome: result.servingDeletionPending ? "pending_provider" : "completed",
2269
2269
  resultCode: "domain_unbound",
2270
2270
  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",
2271
+ summary: "Custom domain unbound; the subscription, deployed content, and permanent Sakupa URL are unchanged.",
2272
2272
  data: { result },
2273
2273
  nextActions: [{ tool: "site_status", allowed: true }]
2274
2274
  });
@@ -2301,7 +2301,7 @@ function registerBillingTools(server, ctx) {
2301
2301
  schemaVersion: 1,
2302
2302
  outcome: "completed",
2303
2303
  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`,
2304
+ summary: `Returned ${catalog.plans.length} monthly plans; the Stripe-hosted page is the final confirmation surface for payment and plan changes.`,
2305
2305
  data: { catalog },
2306
2306
  nextActions: [{ tool: "subscribe_site", allowed: true }]
2307
2307
  });
@@ -2334,13 +2334,13 @@ function registerBillingTools(server, ctx) {
2334
2334
  outcome: "waiting_user",
2335
2335
  resultCode: "stripe_plan_change_confirmation_required",
2336
2336
  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`,
2337
+ summary: `Stripe confirmation link created for ${result.currentPlan} -> ${result.targetPlan}; the subscription has NOT changed yet.`,
2338
2338
  data: { result },
2339
2339
  userAction: {
2340
2340
  type: "open_url",
2341
2341
  provider: "stripe",
2342
2342
  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"
2343
+ expectedOutcome: "After the user confirms on the Stripe-hosted page, the webhook updates the Sakupa subscription state"
2344
2344
  },
2345
2345
  nextActions: [{ tool: "billing_status", allowed: true }]
2346
2346
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sakupa/mcp",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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",