@shipstatic/mcp 1.2.0-beta.1 → 1.2.1

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/README.md CHANGED
@@ -1,15 +1,17 @@
1
- # @shipstatic/mcp
2
-
3
- ShipStatic MCP — deploy static websites, landing pages, and prototypes from AI agents.
1
+ # ShipStatic MCP
4
2
 
5
3
  **One URL. Your agent ships.**
6
4
 
5
+ Give your AI a publish button for the internet: ask it to put your site online, and get back a real, shareable link in seconds. Landing pages, prototypes, portfolios — any static site.
6
+
7
7
  [![smithery badge](https://smithery.ai/badge/shipstatic/ship)](https://smithery.ai/servers/shipstatic/ship)
8
8
  [![glama badge](https://img.shields.io/badge/glama-MCP%20server-1f7ade)](https://glama.ai/mcp/servers/shipstatic/mcp)
9
9
 
10
- ## Hosted — no install
10
+ One product, two doors in. Drop `https://mcp.shipstatic.com` into any MCP client — no install, no signup, no API key — and connect your account when your client asks: the full toolset, custom domains, sites that never expire. Install `@shipstatic/mcp` when your agent needs to deploy a folder on your own machine, when you'd rather configure a token once than sign in, or when your client doesn't speak OAuth yet — the same fifteen tools, reached the other way.
11
+
12
+ ## Hosted — nothing to install
11
13
 
12
- Drop this URL into any MCP client. Your agent can publish a website in its next message — free, no install, no signup, no API key.
14
+ Drop `https://mcp.shipstatic.com` into any MCP client. No install, no signup, no API key — your agent can publish a website in its next message.
13
15
 
14
16
  ```
15
17
  https://mcp.shipstatic.com
@@ -21,6 +23,10 @@ https://mcp.shipstatic.com
21
23
  claude mcp add --transport http shipstatic https://mcp.shipstatic.com
22
24
  ```
23
25
 
26
+ ### Claude Desktop and claude.ai
27
+
28
+ **Settings → Connectors → Add custom connector**, paste `https://mcp.shipstatic.com`, save.
29
+
24
30
  ### Cursor, Antigravity, Windsurf, Zed — anywhere with `mcp.json`
25
31
 
26
32
  ```json
@@ -33,20 +39,35 @@ claude mcp add --transport http shipstatic https://mcp.shipstatic.com
33
39
  }
34
40
  ```
35
41
 
36
- ### Claude Desktop, Claude.ai web
42
+ ### Then just ask
43
+
44
+ > "Put my site online."
45
+
46
+ Your agent publishes the files and answers with two links:
47
+
48
+ - **The live site** — a real URL you can share right away.
49
+ - **A claim link** — the site stays live for 3 days; open the claim link to keep it forever. A free account is all it takes.
50
+
51
+ Want the site private? Ask for a password — visitors must enter it before they can see anything.
37
52
 
38
- Add a custom connector pointing at `https://mcp.shipstatic.com`.
53
+ ### Then connect, if you want more
39
54
 
40
- The hosted endpoint exposes one tool: `deployments_upload`. Public deployments expire in 3 days unless claimed the response includes a claim URL the user can visit to keep the site permanently. Set a `password` arg to gate the deployment behind an unlock prompt.
55
+ Everything above works with no account at all. Connect one when your client offers to sign you in, and the same URL answers with the rest: everything you've shipped, your own domains, and sites that stay up permanently. Nothing to install, no key to paste your client starts the sign-in itself.
41
56
 
42
- ## Local — full toolset
57
+ ## Local — the same tools, from your own machine
43
58
 
44
- Install this package when you need to manage deployments, link custom domains, or use account-tied operations.
59
+ Install this package when your agent needs to deploy **a folder on your own machine** — the hosted endpoint takes files inline, so it has no path to read from — when you'd rather configure a token once than sign in, or when your MCP client doesn't speak OAuth yet.
60
+
61
+ The config asks for one thing: `SHIP_TOKEN`. **Its value is your API key** — one credential, two names. The console mints it as an *API key* (it looks like `ship-...`), and the setting that carries it is called the *token*. Get yours free at [my.shipstatic.com/api-key](https://my.shipstatic.com/api-key), paste it where the snippets below show `ship-...`, and every site you publish lands in your account, never expires, and gets bigger limits.
62
+
63
+ The key is optional: leave it out and the local server behaves like the hosted endpoint with no account connected (public sites, claim links, live for 3 days).
64
+
65
+ The server runs with `npx`, which ships with [Node.js](https://nodejs.org) (20.19 or newer).
45
66
 
46
67
  ### Claude Code
47
68
 
48
69
  ```bash
49
- claude mcp add shipstatic -- npx @shipstatic/mcp
70
+ claude mcp add shipstatic -e SHIP_TOKEN=ship-... -- npx -y @shipstatic/mcp
50
71
  ```
51
72
 
52
73
  ### Cursor
@@ -58,7 +79,8 @@ Add to `~/.cursor/mcp.json`:
58
79
  "mcpServers": {
59
80
  "shipstatic": {
60
81
  "command": "npx",
61
- "args": ["@shipstatic/mcp"]
82
+ "args": ["-y", "@shipstatic/mcp"],
83
+ "env": { "SHIP_TOKEN": "ship-..." }
62
84
  }
63
85
  }
64
86
  }
@@ -73,7 +95,8 @@ Add to `~/.gemini/antigravity/mcp_config.json`:
73
95
  "mcpServers": {
74
96
  "shipstatic": {
75
97
  "command": "npx",
76
- "args": ["@shipstatic/mcp"]
98
+ "args": ["-y", "@shipstatic/mcp"],
99
+ "env": { "SHIP_TOKEN": "ship-..." }
77
100
  }
78
101
  }
79
102
  }
@@ -81,31 +104,25 @@ Add to `~/.gemini/antigravity/mcp_config.json`:
81
104
 
82
105
  ### Windsurf, Zed, and other MCP clients
83
106
 
84
- Same config format — `npx @shipstatic/mcp`. Works with any MCP-compatible client.
107
+ Same config shape — `npx -y @shipstatic/mcp`, with `SHIP_TOKEN` in `env`. Works with any MCP-compatible client.
85
108
 
86
- ## Free API key — permanent deployments
109
+ ### VS Code
87
110
 
88
- `SHIP_TOKEN` is optional. Without it, deploys behave like the hosted endpoint (public, claim URL, expire in 3 days). With it, you get permanent deployments, the full toolset, and bigger limits.
89
-
90
- Get a free API key at [my.shipstatic.com/api-key](https://my.shipstatic.com/api-key):
91
-
92
- ```bash
93
- claude mcp add shipstatic -e SHIP_TOKEN=ship-... -- npx @shipstatic/mcp
94
- ```
111
+ Prefer an editor extension? [ShipStatic for VS Code](https://marketplace.visualstudio.com/items?itemName=shipstatic.shipstatic) has this server built in no config at all.
95
112
 
96
113
  ## Tools
97
114
 
98
- The hosted endpoint exposes `deployments_upload` only. The local install exposes everything below.
115
+ All fifteen tools are on both doors. `deployments_upload` is the one that needs no account; connect on the hosted endpoint or set `SHIP_TOKEN` locally and the other fourteen answer too.
99
116
 
100
117
  ### Deployments
101
118
 
102
- | Tool | Description | Hosted |
103
- |------|-------------|:---:|
104
- | `deployments_upload` | Publish files and get a live URL instantly, optionally protected by a password | ✓ |
105
- | `deployments_list` | List all deployments with their URLs, status, labels, and password protection state. Pages with `limit` and `cursor` | |
106
- | `deployments_get` | Get deployment details including URL, status, file count, size, labels, and password protection state | |
107
- | `deployments_set` | Update the labels on a deployment for organization and filtering | |
108
- | `deployments_delete` | Permanently delete a deployment and all its files | |
119
+ | Tool | Description |
120
+ |------|-------------|
121
+ | `deployments_upload` | Publish files and get a live URL instantly, optionally protected by a password |
122
+ | `deployments_list` | List all deployments with their URLs, status, labels, and password protection state. Pages with `limit` and `cursor` |
123
+ | `deployments_get` | Get deployment details including URL, status, file count, size, labels, and password protection state |
124
+ | `deployments_set` | Update the labels on a deployment for organization and filtering |
125
+ | `deployments_delete` | Permanently delete a deployment and all its files |
109
126
 
110
127
  ### Domains
111
128
 
@@ -127,7 +144,7 @@ The hosted endpoint exposes `deployments_upload` only. The local install exposes
127
144
  |------|-------------|
128
145
  | `whoami` | Get your account details including email, plan, and usage |
129
146
 
130
- ### Paging
147
+ ### Paging long lists
131
148
 
132
149
  `deployments_list` and `domains_list` accept `limit` and `cursor`. Each response carries a `cursor` — pass it back to fetch the next page; `null` means you are on the last one.
133
150
 
@@ -145,11 +162,11 @@ Key the *attempt*, not the try — a run id, a commit sha, or a uuid generated b
145
162
  { "path": "/path/to/dist", "ttl": 3600 }
146
163
  ```
147
164
 
148
- It needs `SHIP_TOKEN`: a keyless deploy already expires on the platform's schedule, so a `ttl` on one is refused rather than ignored. A deployment carrying a `ttl` cannot be linked to a custom domain — deploy without one when the site needs a domain.
165
+ It needs `SHIP_TOKEN` (your API key): a keyless deploy already expires on the platform's schedule, so a `ttl` on one is refused rather than ignored. A deployment carrying a `ttl` cannot be linked to a custom domain — deploy without one when the site needs a domain.
149
166
 
150
167
  ## Registry
151
168
 
152
- Published to the [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=com.shipstatic/mcp) as `com.shipstatic/mcp`. Registry-aware clients see both the hosted endpoint and the local install and pick the right transport for their environment.
169
+ Published to the [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=com.shipstatic/mcp) as `com.shipstatic/mcp`. Registry-aware clients see both the hosted endpoint and the local install and pick whichever fits their environment.
153
170
 
154
171
  ## License
155
172
 
package/dist/call.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { ErrorType, isShipError } from '@shipstatic/ship';
2
+ import { MY_API_KEY_URL } from '@shipstatic/types';
2
3
  /**
3
4
  * The two CREDENTIAL arms that earn a per-transport hint. Everything else
4
5
  * relays verbatim — a credential hint on any other type sends the agent
@@ -152,9 +153,17 @@ function safeStringify(value) {
152
153
  return String(value);
153
154
  }
154
155
  }
155
- /** stdio's hints: this package owns `SHIP_TOKEN` and is the only side that may name it. */
156
+ /**
157
+ * stdio's hints: this package owns `SHIP_TOKEN` and is the only side that may
158
+ * name it. The authentication hint carries the whole chain on purpose — the
159
+ * variable, what its value IS (the API key; the console and the config use two
160
+ * words for one credential, and this sentence is where an agent learns they
161
+ * are the same), and where it is minted. It fires at exactly the moment a
162
+ * user is missing one, so a hint that names the slot without naming the value
163
+ * strands them holding an "API key" a config asks for as a "token".
164
+ */
156
165
  const STDIO_HINTS = {
157
- authentication: 'Set a free SHIP_TOKEN environment variable in your MCP server configuration.',
166
+ authentication: `Set the SHIP_TOKEN environment variable in your MCP server configuration — its value is the user's API key, free at ${MY_API_KEY_URL}.`,
158
167
  forbidden: 'This action is not permitted. Likely cause: plan limits reached or the account is terminated. Stop retrying — the user needs to upgrade or contact support at https://my.shipstatic.com.',
159
168
  };
160
169
  export const call = createCall({ hints: STDIO_HINTS });
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { DeploymentVia } from '@shipstatic/types';
2
+ import { DeploymentVia, MY_API_KEY_URL } from '@shipstatic/types';
3
3
  import { z } from 'zod';
4
4
  import { call } from './call.js';
5
5
  import { registerAccountTools } from './tools.js';
@@ -20,7 +20,7 @@ To deploy: call ${UPLOAD_TOOL_NAME} with the build output directory path. ${B.li
20
20
 
21
21
  Without SHIP_TOKEN, deployments are public and expire in ${PUBLIC_EXPIRY}. ${B.claim}
22
22
 
23
- With SHIP_TOKEN configured, deployments go to the user's account and never expire pass \`ttl\` (seconds) to ${UPLOAD_TOOL_NAME} for one that expires on its own. Listing, managing, and domain operations also require SHIP_TOKEN.
23
+ With SHIP_TOKEN configured — its value is the user's API key, free at ${MY_API_KEY_URL} — deployments go to the user's account and never expire; pass \`ttl\` (seconds) to ${UPLOAD_TOOL_NAME} for one that expires on its own. Listing, managing, and domain operations also require SHIP_TOKEN.
24
24
 
25
25
  ${B.conceptsHeader}
26
26
  ${B.deploymentConcept}
@@ -201,11 +201,11 @@ export declare const PARAM_DESCRIPTIONS: {
201
201
  */
202
202
  readonly idempotencyKey: `Makes this deploy replayable instead of repeatable. A deploy is not naturally idempotent: if a call times out you cannot tell "it never landed" from "it landed and the response was lost", and retrying creates a second deployment. Send the same key on the retry and the original deployment is replayed instead (within ${number} hours). Key the ATTEMPT \u2014 a run id, a commit sha, a uuid minted before the first try \u2014 never one minted fresh on each retry, which would defeat the point.`;
203
203
  /**
204
- * Shared one door ahead of its offer, for the same reason `idempotencyKey`
205
- * is: only stdio declares `ttl` today (`cloudflare/mcp/CLAUDE.md`'s
206
- * divergence table records the hosted deferral and its trigger), and the two
207
- * refusals this teaches belong to the platform, so they read identically on
208
- * every door.
204
+ * Shared and spoken by BOTH doors stdio declared it first (2026-08-13)
205
+ * and the hosted door converged the same day, importing this describe
206
+ * verbatim (its catalogue fence holds it to the import). The two refusals
207
+ * this teaches belong to the platform, so they read identically on every
208
+ * door.
209
209
  *
210
210
  * **Two things are deliberately absent, and both are the same rule.** The
211
211
  * RANGE, because `@shipstatic/ship` validates it in-process before a byte is
@@ -185,11 +185,11 @@ export const PARAM_DESCRIPTIONS = {
185
185
  */
186
186
  idempotencyKey: `Makes this deploy replayable instead of repeatable. A deploy is not naturally idempotent: if a call times out you cannot tell "it never landed" from "it landed and the response was lost", and retrying creates a second deployment. Send the same key on the retry and the original deployment is replayed instead (within ${IDEMPOTENCY_KEY_CONSTRAINTS.WINDOW_SECONDS / 3600} hours). Key the ATTEMPT — a run id, a commit sha, a uuid minted before the first try — never one minted fresh on each retry, which would defeat the point.`,
187
187
  /**
188
- * Shared one door ahead of its offer, for the same reason `idempotencyKey`
189
- * is: only stdio declares `ttl` today (`cloudflare/mcp/CLAUDE.md`'s
190
- * divergence table records the hosted deferral and its trigger), and the two
191
- * refusals this teaches belong to the platform, so they read identically on
192
- * every door.
188
+ * Shared and spoken by BOTH doors stdio declared it first (2026-08-13)
189
+ * and the hosted door converged the same day, importing this describe
190
+ * verbatim (its catalogue fence holds it to the import). The two refusals
191
+ * this teaches belong to the platform, so they read identically on every
192
+ * door.
193
193
  *
194
194
  * **Two things are deliberately absent, and both are the same rule.** The
195
195
  * RANGE, because `@shipstatic/ship` validates it in-process before a byte is
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@shipstatic/mcp",
3
- "version": "1.2.0-beta.1",
3
+ "version": "1.2.1",
4
4
  "mcpName": "com.shipstatic/mcp",
5
- "description": "ShipStatic MCP — deploy static websites from AI agents. Full toolset incl. custom domains. Free hosted endpoint at mcp.shipstatic.com — no install.",
5
+ "description": "Deploy static websites from AI agents. Free hosted endpoint at mcp.shipstatic.com — no install, no signup — or run it locally to deploy folders from your own machine. The same fifteen tools either way.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
8
8
  "sideEffects": [