@sakupa/mcp 0.7.53 → 0.7.55

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/dist/bin.js CHANGED
@@ -402,7 +402,7 @@ function isFreeSiteAllowanceNetworkReference(value) {
402
402
  }
403
403
 
404
404
  // ../core/dist/domain/version.js
405
- var SAKUPA_MCP_VERSION = "0.7.53";
405
+ var SAKUPA_MCP_VERSION = "0.7.55";
406
406
 
407
407
  // ../core/dist/domain/errors.js
408
408
  var HTTP_STATUS = {
@@ -4820,7 +4820,7 @@ Once Stripe confirms payment and Sakupa synchronizes the subscription, the curre
4820
4820
  server.registerTool(
4821
4821
  "bind",
4822
4822
  {
4823
- description: `Bind a custom domain to this subscribed site \u2014 an OPTIONAL extra serving surface; the subscription-backed ${previewHostPattern} URL keeps working alongside it while the subscription is active. The binding unit is the APEX domain: binding example.com reserves routes for example.com and www.example.com, but ONLY www is required and judged for activation; the naked apex is optional because many DNS providers cannot point it. One apex TXT verification covers both, and one site binds at most ONE apex domain \u2014 a second domain needs a second subscribed site. Requires an ACTIVE subscription (subscribe). Ownership is proven ONLY by DNS control of the apex \u2014 payment never grants ownership, and bindings are ALWAYS challengeable: whoever proves CURRENT DNS control takes the domain, even from an existing binding (the displaced site keeps its subscription, content and subscription-backed Sakupa URL). Unverified requests expire after 72 hours. Call again with action "status" to check progress.`,
4823
+ description: `Bind a custom domain to this subscribed site \u2014 an OPTIONAL extra serving surface; the subscription-backed ${previewHostPattern} URL keeps working alongside it while the subscription is active. The binding unit is the APEX domain: binding example.com reserves routes for example.com and www.example.com, but ONLY www is required and judged for activation; the naked apex is optional because many DNS providers cannot point it. One apex TXT verification covers both. A site has one FINAL apex domain; starting a different apex begins a zero-downtime switch and the previous domain remains until the new www is live. The www CNAME must remain while bound. Requires an ACTIVE subscription (subscribe). Ownership is proven ONLY by DNS control of the apex \u2014 payment never grants ownership, and bindings are ALWAYS challengeable: whoever proves CURRENT DNS control takes the domain, even from an existing binding (the displaced site keeps its subscription, content and subscription-backed Sakupa URL). Unverified requests expire after 72 hours. Call again with action "status" to check progress.`,
4824
4824
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
4825
4825
  annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4826
4826
  inputSchema: {
@@ -4850,12 +4850,15 @@ Once Stripe confirms payment and Sakupa synchronizes the subscription, the curre
4850
4850
  provisioning: res2.bindingStatus === "provisioning"
4851
4851
  });
4852
4852
  const { apexResolves, allOk } = diag;
4853
+ const manualProviderRecheckRequired = res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns";
4854
+ const customerRecheckInstruction = `The customer cannot know whether the certificate is ready. Never use conditional readiness wording or ask the customer to decide the provider state. Tell the customer: "You do not need to judge readiness. After about one minute, reply: check domain status. I will check it once." The AI, not the customer, calls bind status exactly once. During this zero-downtime transition, the previously active domain may still serve. Once this binding becomes active, Sakupa retains only the last bound domain unit: ${apex2} and www.${apex2}.`;
4853
4855
  return text(
4854
4856
  res2.bindingStatus === "active" ? "domain_binding_active" : res2.bindingStatus === "provisioning" ? "domain_binding_provisioning" : "domain_verification_pending",
4855
4857
  `Domain binding status for ${apex2}: ${res2.status}
4856
4858
  ${res2.message}
4859
+ The serving CNAME www.${apex2} \u2192 ${res2.servingTarget} must remain for as long as this domain is bound.` + (manualProviderRecheckRequired ? `
4857
4860
 
4858
- ` + renderChecklistBlock(
4861
+ ${customerRecheckInstruction}` : "") + "\n\n" + renderChecklistBlock(
4859
4862
  diag,
4860
4863
  "Fix any [MISSING]/[FIX] lines above, then re-run bind status; if still failing after the attempts below, show the user this checklist."
4861
4864
  ),
@@ -4871,12 +4874,19 @@ ${res2.message}
4871
4874
  apexResolves,
4872
4875
  apexRequired: false,
4873
4876
  requiredServingHostname: `www.${apex2}`,
4877
+ requiredCnameMustRemainWhileBound: true,
4874
4878
  optionalApexHostname: apex2,
4875
4879
  automaticRetries: 0,
4876
4880
  manualRecheckOnly: true,
4877
4881
  backgroundRetry: false,
4878
- manualStatusCheckRequired: res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns",
4879
- suggestedRecheckAfterSeconds: res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns" ? 60 : void 0,
4882
+ manualStatusCheckRequired: manualProviderRecheckRequired,
4883
+ suggestedRecheckAfterSeconds: manualProviderRecheckRequired ? 60 : void 0,
4884
+ customerReadinessJudgmentRequired: false,
4885
+ customerReplyIntent: manualProviderRecheckRequired ? "check_domain_status" : void 0,
4886
+ customerInstruction: manualProviderRecheckRequired ? customerRecheckInstruction : void 0,
4887
+ transitionMayServePreviousDomain: manualProviderRecheckRequired,
4888
+ finalActiveBindingExclusive: true,
4889
+ postActivationRetainedHostnames: [apex2, `www.${apex2}`],
4880
4890
  customerLiveConfirmed: res2.bindingStatus === "active",
4881
4891
  message: res2.message
4882
4892
  },
@@ -4916,13 +4926,14 @@ STEP 1 of 2 \u2014 prove ownership. Add ONE record:
4916
4926
 
4917
4927
  Host is the SHORT form: most panels append the domain automatically (the saved record must NOT show ${apex} twice in one name). Ownership comes ONLY from DNS control; paying never grants it. The first verified request wins and this challenge expires after 72 hours.
4918
4928
 
4919
- When the user says the TXT is set, run bind "status". It verifies ownership and then hands back STEP 2 \u2014 a SINGLE www CNAME (there are NO certificate TXT records; HTTPS validates automatically over that CNAME). Each "status" checks the previous step and, unless something is misconfigured, advances to the next \u2014 so run it whenever the user reports a step done, NOT on a timer. Any later session can resume with action "status" alone; the verificationId is optional.`,
4929
+ When the user says the TXT is set, run bind "status". It verifies ownership and then hands back STEP 2 \u2014 a SINGLE www CNAME (there are NO certificate TXT records; HTTPS validates automatically over that CNAME). That CNAME must remain for as long as the domain stays bound to Sakupa. Each "status" checks the previous step and, unless something is misconfigured, advances to the next \u2014 so run it whenever the user reports a step done, NOT on a timer. Any later session can resume with action "status" alone; the verificationId is optional.`,
4920
4930
  {
4921
4931
  verificationId: res.verificationId,
4922
4932
  apexDomain: apex,
4923
4933
  includedHostnames: res.includedHostnames,
4924
4934
  apexRequired: false,
4925
4935
  requiredServingHostname: `www.${apex}`,
4936
+ requiredCnameMustRemainWhileBound: true,
4926
4937
  optionalApexHostname: apex,
4927
4938
  verificationRecord: res.verificationRecord,
4928
4939
  servingTarget: res.servingTarget,
@@ -5760,7 +5771,12 @@ var TOOL_MANUALS = {
5760
5771
  preconditions: "A subscribed site and DNS control.",
5761
5772
  parameterNames: ["action", "hostname", "verificationId"],
5762
5773
  parameters: "Action plus hostname or verificationId as returned by the prior step.",
5763
- warnings: ["www is mandatory; the apex is optional.", "Copy DNS values verbatim."],
5774
+ warnings: [
5775
+ "www is mandatory; the apex is optional.",
5776
+ "Copy DNS values verbatim.",
5777
+ "The www CNAME must remain for as long as the domain stays bound; only the ownership TXT is temporary.",
5778
+ "If the domain already belongs to this site, use bind status instead of starting a new challenge."
5779
+ ],
5764
5780
  nextStep: "Follow the returned DNS checklist and call bind status/check."
5765
5781
  },
5766
5782
  billing: {
package/dist/index.js CHANGED
@@ -147,7 +147,7 @@ function isFreeSiteAllowanceNetworkReference(value) {
147
147
  }
148
148
 
149
149
  // ../core/dist/domain/version.js
150
- var SAKUPA_MCP_VERSION = "0.7.53";
150
+ var SAKUPA_MCP_VERSION = "0.7.55";
151
151
 
152
152
  // ../core/dist/domain/errors.js
153
153
  var HTTP_STATUS = {
@@ -4936,7 +4936,7 @@ Once Stripe confirms payment and Sakupa synchronizes the subscription, the curre
4936
4936
  server.registerTool(
4937
4937
  "bind",
4938
4938
  {
4939
- description: `Bind a custom domain to this subscribed site \u2014 an OPTIONAL extra serving surface; the subscription-backed ${previewHostPattern} URL keeps working alongside it while the subscription is active. The binding unit is the APEX domain: binding example.com reserves routes for example.com and www.example.com, but ONLY www is required and judged for activation; the naked apex is optional because many DNS providers cannot point it. One apex TXT verification covers both, and one site binds at most ONE apex domain \u2014 a second domain needs a second subscribed site. Requires an ACTIVE subscription (subscribe). Ownership is proven ONLY by DNS control of the apex \u2014 payment never grants ownership, and bindings are ALWAYS challengeable: whoever proves CURRENT DNS control takes the domain, even from an existing binding (the displaced site keeps its subscription, content and subscription-backed Sakupa URL). Unverified requests expire after 72 hours. Call again with action "status" to check progress.`,
4939
+ description: `Bind a custom domain to this subscribed site \u2014 an OPTIONAL extra serving surface; the subscription-backed ${previewHostPattern} URL keeps working alongside it while the subscription is active. The binding unit is the APEX domain: binding example.com reserves routes for example.com and www.example.com, but ONLY www is required and judged for activation; the naked apex is optional because many DNS providers cannot point it. One apex TXT verification covers both. A site has one FINAL apex domain; starting a different apex begins a zero-downtime switch and the previous domain remains until the new www is live. The www CNAME must remain while bound. Requires an ACTIVE subscription (subscribe). Ownership is proven ONLY by DNS control of the apex \u2014 payment never grants ownership, and bindings are ALWAYS challengeable: whoever proves CURRENT DNS control takes the domain, even from an existing binding (the displaced site keeps its subscription, content and subscription-backed Sakupa URL). Unverified requests expire after 72 hours. Call again with action "status" to check progress.`,
4940
4940
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
4941
4941
  annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4942
4942
  inputSchema: {
@@ -4966,12 +4966,15 @@ Once Stripe confirms payment and Sakupa synchronizes the subscription, the curre
4966
4966
  provisioning: res2.bindingStatus === "provisioning"
4967
4967
  });
4968
4968
  const { apexResolves, allOk } = diag;
4969
+ const manualProviderRecheckRequired = res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns";
4970
+ const customerRecheckInstruction = `The customer cannot know whether the certificate is ready. Never use conditional readiness wording or ask the customer to decide the provider state. Tell the customer: "You do not need to judge readiness. After about one minute, reply: check domain status. I will check it once." The AI, not the customer, calls bind status exactly once. During this zero-downtime transition, the previously active domain may still serve. Once this binding becomes active, Sakupa retains only the last bound domain unit: ${apex2} and www.${apex2}.`;
4969
4971
  return text(
4970
4972
  res2.bindingStatus === "active" ? "domain_binding_active" : res2.bindingStatus === "provisioning" ? "domain_binding_provisioning" : "domain_verification_pending",
4971
4973
  `Domain binding status for ${apex2}: ${res2.status}
4972
4974
  ${res2.message}
4975
+ The serving CNAME www.${apex2} \u2192 ${res2.servingTarget} must remain for as long as this domain is bound.` + (manualProviderRecheckRequired ? `
4973
4976
 
4974
- ` + renderChecklistBlock(
4977
+ ${customerRecheckInstruction}` : "") + "\n\n" + renderChecklistBlock(
4975
4978
  diag,
4976
4979
  "Fix any [MISSING]/[FIX] lines above, then re-run bind status; if still failing after the attempts below, show the user this checklist."
4977
4980
  ),
@@ -4987,12 +4990,19 @@ ${res2.message}
4987
4990
  apexResolves,
4988
4991
  apexRequired: false,
4989
4992
  requiredServingHostname: `www.${apex2}`,
4993
+ requiredCnameMustRemainWhileBound: true,
4990
4994
  optionalApexHostname: apex2,
4991
4995
  automaticRetries: 0,
4992
4996
  manualRecheckOnly: true,
4993
4997
  backgroundRetry: false,
4994
- manualStatusCheckRequired: res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns",
4995
- suggestedRecheckAfterSeconds: res2.bindingStatus === "provisioning" && res2.provisioningPhase !== "waiting_dns" ? 60 : void 0,
4998
+ manualStatusCheckRequired: manualProviderRecheckRequired,
4999
+ suggestedRecheckAfterSeconds: manualProviderRecheckRequired ? 60 : void 0,
5000
+ customerReadinessJudgmentRequired: false,
5001
+ customerReplyIntent: manualProviderRecheckRequired ? "check_domain_status" : void 0,
5002
+ customerInstruction: manualProviderRecheckRequired ? customerRecheckInstruction : void 0,
5003
+ transitionMayServePreviousDomain: manualProviderRecheckRequired,
5004
+ finalActiveBindingExclusive: true,
5005
+ postActivationRetainedHostnames: [apex2, `www.${apex2}`],
4996
5006
  customerLiveConfirmed: res2.bindingStatus === "active",
4997
5007
  message: res2.message
4998
5008
  },
@@ -5032,13 +5042,14 @@ STEP 1 of 2 \u2014 prove ownership. Add ONE record:
5032
5042
 
5033
5043
  Host is the SHORT form: most panels append the domain automatically (the saved record must NOT show ${apex} twice in one name). Ownership comes ONLY from DNS control; paying never grants it. The first verified request wins and this challenge expires after 72 hours.
5034
5044
 
5035
- When the user says the TXT is set, run bind "status". It verifies ownership and then hands back STEP 2 \u2014 a SINGLE www CNAME (there are NO certificate TXT records; HTTPS validates automatically over that CNAME). Each "status" checks the previous step and, unless something is misconfigured, advances to the next \u2014 so run it whenever the user reports a step done, NOT on a timer. Any later session can resume with action "status" alone; the verificationId is optional.`,
5045
+ When the user says the TXT is set, run bind "status". It verifies ownership and then hands back STEP 2 \u2014 a SINGLE www CNAME (there are NO certificate TXT records; HTTPS validates automatically over that CNAME). That CNAME must remain for as long as the domain stays bound to Sakupa. Each "status" checks the previous step and, unless something is misconfigured, advances to the next \u2014 so run it whenever the user reports a step done, NOT on a timer. Any later session can resume with action "status" alone; the verificationId is optional.`,
5036
5046
  {
5037
5047
  verificationId: res.verificationId,
5038
5048
  apexDomain: apex,
5039
5049
  includedHostnames: res.includedHostnames,
5040
5050
  apexRequired: false,
5041
5051
  requiredServingHostname: `www.${apex}`,
5052
+ requiredCnameMustRemainWhileBound: true,
5042
5053
  optionalApexHostname: apex,
5043
5054
  verificationRecord: res.verificationRecord,
5044
5055
  servingTarget: res.servingTarget,
@@ -5879,7 +5890,12 @@ var TOOL_MANUALS = {
5879
5890
  preconditions: "A subscribed site and DNS control.",
5880
5891
  parameterNames: ["action", "hostname", "verificationId"],
5881
5892
  parameters: "Action plus hostname or verificationId as returned by the prior step.",
5882
- warnings: ["www is mandatory; the apex is optional.", "Copy DNS values verbatim."],
5893
+ warnings: [
5894
+ "www is mandatory; the apex is optional.",
5895
+ "Copy DNS values verbatim.",
5896
+ "The www CNAME must remain for as long as the domain stays bound; only the ownership TXT is temporary.",
5897
+ "If the domain already belongs to this site, use bind status instead of starting a new challenge."
5898
+ ],
5883
5899
  nextStep: "Follow the returned DNS checklist and call bind status/check."
5884
5900
  },
5885
5901
  billing: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sakupa/mcp",
3
- "version": "0.7.53",
3
+ "version": "0.7.55",
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",