@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 +19 -15
- package/dist/index.js +19 -15
- package/dist/server.js +13 -8
- package/dist/vocabulary.d.ts +22 -0
- package/dist/vocabulary.js +22 -0
- package/package.json +1 -1
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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,
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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 {
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
${B.conceptsHeader}
|
|
25
|
+
${B.deploymentConcept}
|
|
26
|
+
${B.domainConcept}
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
${B.domainWorkflow}`;
|
|
24
29
|
/**
|
|
25
30
|
* Builds the stdio server's full 15-tool surface over an injected client.
|
|
26
31
|
*
|
package/dist/vocabulary.d.ts
CHANGED
|
@@ -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.";
|
package/dist/vocabulary.js
CHANGED
|
@@ -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
|
+
"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",
|