@shipstatic/mcp 1.0.0-beta.3 → 1.0.0-beta.4

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/index.d.ts CHANGED
@@ -1,21 +1,25 @@
1
1
  /**
2
2
  * The library entry — importing this file has NO side effects.
3
3
  *
4
- * That is the whole point of it: `bin.ts` is the executable, and this is what
5
- * a consumer imports. Today there is exactly one such consumer, the hosted
6
- * Streamable-HTTP transport in the platform's private `cloudflare/mcp`, which
7
- * takes the vocabulary below rather than re-authoring the strings an agent
8
- * reads. "One product, two transports" is only true if one of them can import
9
- * the other.
4
+ * `bin.ts` is the executable; this is what a consumer imports. Today there is
5
+ * one such consumer, the hosted Streamable-HTTP transport in the platform's
6
+ * private `cloudflare/mcp`, and both transports are converging on the same
7
+ * product: the complete toolset for authenticated callers, the anonymous
8
+ * deploy for everyone else. "One product, two transports" is only true if one
9
+ * of them can import the other.
10
10
  *
11
- * **The surface is curated, not swept.** Every export here is a deliberate
12
- * public commitment under semver; the modules behind it hold plenty that is
13
- * not (`toErrorResult`, `safeStringify`, the INSTRUCTIONS template, every tool
14
- * registration). `export *` would publish implementation detail and make the
15
- * next refactor a breaking change. `tests/index.test.ts` fences both
16
- * directions nothing missing, nothing extra.
11
+ * **The surface is exactly what a SECOND TRANSPORT needs nothing more.**
12
+ * That is the rule, and it is stricter than "curated". `createServer` and the
13
+ * configured `call` are deliberately NOT here: they are stdio's own
14
+ * composition, they have no consumer outside `bin.ts`, and `createServer` in
15
+ * particular builds a tool whose input is a filesystem PATH — a footgun to
16
+ * offer a Worker. Exporting them would make this package's API "stdio's
17
+ * internals, plus some shared bits" instead of a contract.
18
+ *
19
+ * `tests/index.test.ts` fences both directions — nothing missing, nothing
20
+ * extra — because adding an export is the quiet failure: everything published
21
+ * becomes a breaking change to remove.
17
22
  */
18
- export { type CallFn, type CallOptions, call, createCall, type ErrorHints } from './call.js';
19
- export { createServer } from './server.js';
23
+ export { type CallFn, type CallOptions, createCall, type ErrorHints } from './call.js';
20
24
  export { registerAccountTools } from './tools.js';
21
- export { ANNOTATIONS, PARAM_DESCRIPTIONS } from './vocabulary.js';
25
+ export { ANNOTATIONS, INSTRUCTION_BLOCKS, PARAM_DESCRIPTIONS } from './vocabulary.js';
package/dist/index.js CHANGED
@@ -1,21 +1,25 @@
1
1
  /**
2
2
  * The library entry — importing this file has NO side effects.
3
3
  *
4
- * That is the whole point of it: `bin.ts` is the executable, and this is what
5
- * a consumer imports. Today there is exactly one such consumer, the hosted
6
- * Streamable-HTTP transport in the platform's private `cloudflare/mcp`, which
7
- * takes the vocabulary below rather than re-authoring the strings an agent
8
- * reads. "One product, two transports" is only true if one of them can import
9
- * the other.
4
+ * `bin.ts` is the executable; this is what a consumer imports. Today there is
5
+ * one such consumer, the hosted Streamable-HTTP transport in the platform's
6
+ * private `cloudflare/mcp`, and both transports are converging on the same
7
+ * product: the complete toolset for authenticated callers, the anonymous
8
+ * deploy for everyone else. "One product, two transports" is only true if one
9
+ * of them can import the other.
10
10
  *
11
- * **The surface is curated, not swept.** Every export here is a deliberate
12
- * public commitment under semver; the modules behind it hold plenty that is
13
- * not (`toErrorResult`, `safeStringify`, the INSTRUCTIONS template, every tool
14
- * registration). `export *` would publish implementation detail and make the
15
- * next refactor a breaking change. `tests/index.test.ts` fences both
16
- * directions nothing missing, nothing extra.
11
+ * **The surface is exactly what a SECOND TRANSPORT needs nothing more.**
12
+ * That is the rule, and it is stricter than "curated". `createServer` and the
13
+ * configured `call` are deliberately NOT here: they are stdio's own
14
+ * composition, they have no consumer outside `bin.ts`, and `createServer` in
15
+ * particular builds a tool whose input is a filesystem PATH — a footgun to
16
+ * offer a Worker. Exporting them would make this package's API "stdio's
17
+ * internals, plus some shared bits" instead of a contract.
18
+ *
19
+ * `tests/index.test.ts` fences both directions — nothing missing, nothing
20
+ * extra — because adding an export is the quiet failure: everything published
21
+ * becomes a breaking change to remove.
17
22
  */
18
- export { call, createCall } from './call.js';
19
- export { createServer } from './server.js';
23
+ export { createCall } from './call.js';
20
24
  export { registerAccountTools } from './tools.js';
21
- export { ANNOTATIONS, PARAM_DESCRIPTIONS } from './vocabulary.js';
25
+ export { ANNOTATIONS, INSTRUCTION_BLOCKS, PARAM_DESCRIPTIONS } from './vocabulary.js';
package/dist/server.js CHANGED
@@ -3,24 +3,29 @@ import { IDEMPOTENCY_KEY_CONSTRAINTS } from '@shipstatic/ship';
3
3
  import { z } from 'zod';
4
4
  import { call } from './call.js';
5
5
  import { registerAccountTools } from './tools.js';
6
- import { ANNOTATIONS, PARAM_DESCRIPTIONS } from './vocabulary.js';
6
+ import { ANNOTATIONS, INSTRUCTION_BLOCKS, PARAM_DESCRIPTIONS } from './vocabulary.js';
7
7
  // Destructured so the fifteen registrations below read as they always have.
8
8
  // The definitions live in `vocabulary.ts` because the hosted transport speaks
9
9
  // the same ones — that file records what is shared, what is not, and why.
10
10
  const { CREATE } = ANNOTATIONS;
11
- const INSTRUCTIONS = `ShipStatic deploys static websites instantly. Free, no account required.
11
+ const B = INSTRUCTION_BLOCKS;
12
+ // Composed from the shared blocks plus the two sentences that are genuinely
13
+ // stdio's: how files arrive (a filesystem path) and how a caller
14
+ // authenticates (`SHIP_TOKEN`). The hosted transport composes the same blocks
15
+ // around its own two.
16
+ const INSTRUCTIONS = `${B.opening}
12
17
 
13
- To deploy: call deployments_upload with the build output directory path. The site is live immediately. To make the site private, pass \`password\` — visitors must unlock before viewing, including on any custom domains pointing at it.
18
+ To deploy: call deployments_upload with the build output directory path. ${B.liveAndPassword}
14
19
 
15
- Without SHIP_TOKEN, deployments are public and expire in 3 days. The response includes a claim URL — always show the deployment URL and the claim URL to the user so they can keep the site permanently.
20
+ Without SHIP_TOKEN, deployments are public and expire in 3 days. ${B.claim}
16
21
 
17
22
  With SHIP_TOKEN configured, deployments go to the user's account and never expire. Listing, managing, and domain operations also require SHIP_TOKEN.
18
23
 
19
- Concepts:
20
- - Deployment: an immutable set of files with an instant URL (e.g. happy-cat-abc1234.shipstatic.com). No setup needed.
21
- - Domain: a custom domain (e.g. www.example.com) pointing to a deployment. Optional. Subdomains only — not apex domains.
24
+ ${B.conceptsHeader}
25
+ ${B.deploymentConcept}
26
+ ${B.domainConcept}
22
27
 
23
- To add a custom domain: domains_validate → domains_set → domains_records (show DNS records to user) → user configures DNS → domains_verify.`;
28
+ ${B.domainWorkflow}`;
24
29
  /**
25
30
  * Builds the stdio server's full 15-tool surface over an injected client.
26
31
  *
@@ -73,6 +73,28 @@ export declare const ANNOTATIONS: {
73
73
  * without anyone editing prose — the same reason the API and the SDK import
74
74
  * them instead of restating them.
75
75
  */
76
+ /**
77
+ * INSTRUCTIONS sentences both transports say.
78
+ *
79
+ * `initialize`'s instructions are the other half of what an agent reads
80
+ * before acting (the catalogue is the first). Each transport composes its own
81
+ * from these blocks plus the two things that are genuinely its own: how files
82
+ * arrive, and how a caller authenticates.
83
+ *
84
+ * Three of these are duplicated prose TODAY, kept equal by review. The last
85
+ * two are stdio-only only because the hosted transport has no domain tools
86
+ * yet — when it gains them with OAuth they become shared too, which is
87
+ * precisely when someone would otherwise copy them across.
88
+ */
89
+ export declare const INSTRUCTION_BLOCKS: {
90
+ readonly opening: "ShipStatic deploys static websites instantly. Free, no account required.";
91
+ readonly liveAndPassword: "The site is live immediately. To make the site private, pass `password` — visitors must unlock before viewing, including on any custom domains pointing at it.";
92
+ readonly claim: "The response includes a claim URL — always show the deployment URL and the claim URL to the user so they can keep the site permanently.";
93
+ readonly conceptsHeader: "Concepts:";
94
+ readonly deploymentConcept: "- Deployment: an immutable set of files with an instant URL (e.g. happy-cat-abc1234.shipstatic.com). No setup needed.";
95
+ readonly domainConcept: "- Domain: a custom domain (e.g. www.example.com) pointing to a deployment. Optional. Subdomains only — not apex domains.";
96
+ readonly domainWorkflow: "To add a custom domain: domains_validate → domains_set → domains_records (show DNS records to user) → user configures DNS → domains_verify.";
97
+ };
76
98
  export declare const PARAM_DESCRIPTIONS: {
77
99
  readonly labels: "Labels for organizing deployments (e.g. [\"production\", \"v1.2\"]). Lowercase, 3-25 chars, allows . _ - separators. Up to 10.";
78
100
  readonly password: "Optional password to gate the deployment behind an unlock prompt (6–128 characters; whitespace significant). Visitors must enter this password before viewing the site, including on any custom domains pointing at it.";
@@ -56,6 +56,28 @@ export const ANNOTATIONS = {
56
56
  * without anyone editing prose — the same reason the API and the SDK import
57
57
  * them instead of restating them.
58
58
  */
59
+ /**
60
+ * INSTRUCTIONS sentences both transports say.
61
+ *
62
+ * `initialize`'s instructions are the other half of what an agent reads
63
+ * before acting (the catalogue is the first). Each transport composes its own
64
+ * from these blocks plus the two things that are genuinely its own: how files
65
+ * arrive, and how a caller authenticates.
66
+ *
67
+ * Three of these are duplicated prose TODAY, kept equal by review. The last
68
+ * two are stdio-only only because the hosted transport has no domain tools
69
+ * yet — when it gains them with OAuth they become shared too, which is
70
+ * precisely when someone would otherwise copy them across.
71
+ */
72
+ export const INSTRUCTION_BLOCKS = {
73
+ opening: 'ShipStatic deploys static websites instantly. Free, no account required.',
74
+ liveAndPassword: 'The site is live immediately. To make the site private, pass `password` — visitors must unlock before viewing, including on any custom domains pointing at it.',
75
+ claim: 'The response includes a claim URL — always show the deployment URL and the claim URL to the user so they can keep the site permanently.',
76
+ conceptsHeader: 'Concepts:',
77
+ deploymentConcept: '- Deployment: an immutable set of files with an instant URL (e.g. happy-cat-abc1234.shipstatic.com). No setup needed.',
78
+ domainConcept: '- Domain: a custom domain (e.g. www.example.com) pointing to a deployment. Optional. Subdomains only — not apex domains.',
79
+ domainWorkflow: 'To add a custom domain: domains_validate → domains_set → domains_records (show DNS records to user) → user configures DNS → domains_verify.',
80
+ };
59
81
  export const PARAM_DESCRIPTIONS = {
60
82
  labels: `Labels for organizing deployments (e.g. ["production", "v1.2"]). Lowercase, ${LABEL_CONSTRAINTS.MIN_LENGTH}-${LABEL_CONSTRAINTS.MAX_LENGTH} chars, allows . _ - separators. Up to ${LABEL_CONSTRAINTS.MAX_COUNT}.`,
61
83
  password: `Optional password to gate the deployment behind an unlock prompt (${PASSWORD_CONSTRAINTS.MIN_LENGTH}–${PASSWORD_CONSTRAINTS.MAX_LENGTH} characters; whitespace significant). Visitors must enter this password before viewing the site, including on any custom domains pointing at it.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipstatic/mcp",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.4",
4
4
  "mcpName": "com.shipstatic/mcp",
5
5
  "description": "ShipStatic MCP — deploy static websites from AI agents. Full toolset incl. custom domains. Free hosted endpoint at mcp.shipstatic.com — no install.",
6
6
  "type": "module",